diff options
| author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-09-09 20:27:19 +0000 |
|---|---|---|
| committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-09-09 20:27:19 +0000 |
| commit | c6ca83d07d95e076b09bd802f66ba72d363b0235 (patch) | |
| tree | f13000febb0c9c5a5da621b4bba53ba3eace022e /kdialogd4 | |
| download | kgtk-qt3-c6ca83d0.tar.gz kgtk-qt3-c6ca83d0.zip | |
* Added kgtk-qt3
* Slight kpowersave message cleanup
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/kgtk-qt3@1173604 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kdialogd4')
| -rw-r--r-- | kdialogd4/CMakeLists.txt | 16 | ||||
| -rw-r--r-- | kdialogd4/kdialogd.cpp | 759 | ||||
| -rw-r--r-- | kdialogd4/kdialogd.h | 146 | ||||
| -rw-r--r-- | kdialogd4/po/CMakeLists.txt | 41 | ||||
| -rw-r--r-- | kdialogd4/po/cs.po | 61 | ||||
| -rw-r--r-- | kdialogd4/po/de.po | 62 | ||||
| -rw-r--r-- | kdialogd4/po/en_GB.po | 60 | ||||
| -rw-r--r-- | kdialogd4/po/es.po | 56 | ||||
| -rw-r--r-- | kdialogd4/po/fr.po | 60 | ||||
| -rw-r--r-- | kdialogd4/po/kdialogd4.pot | 58 | ||||
| -rw-r--r-- | kdialogd4/po/pt_BR.po | 60 | ||||
| -rw-r--r-- | kdialogd4/po/ru.po | 62 | ||||
| -rw-r--r-- | kdialogd4/po/zh_CN.po | 60 |
13 files changed, 1501 insertions, 0 deletions
diff --git a/kdialogd4/CMakeLists.txt b/kdialogd4/CMakeLists.txt new file mode 100644 index 0000000..0c0f017 --- /dev/null +++ b/kdialogd4/CMakeLists.txt @@ -0,0 +1,16 @@ +find_package(KDE4) +find_package(Qt4) + +if (KDE4_FOUND) + message("** INFORMATION: KDialogD for KDE4 will be built.") + include (KDE4Defaults) + include_directories (${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/common ${CMAKE_BINARY_DIR} ${KDE4_INCLUDE_DIR} ${QT_INCLUDE_DIR}) + set(kdialogd4_bin_SRCS kdialogd.cpp) + kde4_add_executable(kdialogd4_bin ${kdialogd4_bin_SRCS}) + set_target_properties(kdialogd4_bin PROPERTIES OUTPUT_NAME kdialogd4) + target_link_libraries(kdialogd4_bin ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} ${KDE4_KIO_LIBS} ${KDE4_KDECORE_LIBRARY} kfile ) + install(TARGETS kdialogd4_bin ${INSTALL_TARGETS_DEFAULT_ARGS} ) + add_subdirectory(po) +else (KDE4_FOUND) + message("** ERROR : Could not locate Qt4/KDE4 headers, KDialogD for KDE4 will not be built.") +endif (KDE4_FOUND) diff --git a/kdialogd4/kdialogd.cpp b/kdialogd4/kdialogd.cpp new file mode 100644 index 0000000..ddd1142 --- /dev/null +++ b/kdialogd4/kdialogd.cpp @@ -0,0 +1,759 @@ +#define USE_KWIN + +#include "kdialogd.h" +#include <iostream> +#include <kdiroperator.h> +#include <kuniqueapplication.h> +#include <QtCore/QSocketNotifier> +#include <QtGui/QX11Info> +#include <kio/netaccess.h> +#include <kmessagebox.h> +#include <klocale.h> +#include <kconfig.h> +#include <kurlcombobox.h> +#ifdef USE_KWIN +#include <kwindowsystem.h> +#else +#include <X11/Xlib.h> +#include <X11/Xatom.h> +#include <fixx11h.h> +#endif +#include <sys/un.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/errno.h> +#include <kdebug.h> +#include <kdeversion.h> +#ifdef KDIALOGD_APP +#include <QtCore/QTimer> +#include <kcmdlineargs.h> +#include <kaboutdata.h> +#endif +#include <kabstractfilewidget.h> +#include <fstream> + +KConfig *KDialogD::theirConfig=NULL; + +#define CFG_KEY_DIALOG_SIZE "KDialogDSize" +#define CFG_TIMEOUT_GROUP "General" +#ifdef KDIALOGD_APP +#define CFG_TIMEOUT_KEY "Timeout" +#define DEFAULT_TIMEOUT 30 +#endif + +static QString groupName(const QString &app, bool fileDialog=true) +{ + return QString(fileDialog ? "KFileDialog " : "KDirSelectDialog ")+app; +} + +// from kdebase/kdesu +typedef unsigned ksocklen_t; + +static int createSocket() +{ + int socketFd; + ksocklen_t addrlen; + struct stat s; + const char *sock=getSockName(); + int stat_err=lstat(sock, &s); + + if(!stat_err && S_ISLNK(s.st_mode)) + { + kWarning() << "Someone is running a symlink attack on you" ; + if(unlink(sock)) + { + kWarning() << "Could not delete symlink" ; + return -1; + } + } + + if (!access(sock, R_OK|W_OK)) + { + kWarning() << "stale socket exists" ; + if (unlink(sock)) + { + kWarning() << "Could not delete stale socket" ; + return -1; + } + } + + socketFd = socket(PF_UNIX, SOCK_STREAM, 0); + if (socketFd < 0) + { + kError() << "socket(): " << strerror(errno); + return -1; + } + + struct sockaddr_un addr; + addr.sun_family = AF_UNIX; + strncpy(addr.sun_path, sock, sizeof(addr.sun_path)-1); + addr.sun_path[sizeof(addr.sun_path)-1] = '\000'; + addrlen = SUN_LEN(&addr); + if (bind(socketFd, (struct sockaddr *)&addr, addrlen) < 0) + { + kError() << "bind(): " << strerror(errno); + return -1; + } + + struct linger lin; + lin.l_onoff = lin.l_linger = 0; + if (setsockopt(socketFd, SOL_SOCKET, SO_LINGER, (char *) &lin, + sizeof(linger)) < 0) + { + kError() << "setsockopt(SO_LINGER): " << strerror(errno); + return -1; + } + + int opt = 1; + if (setsockopt(socketFd, SOL_SOCKET, SO_REUSEADDR, (char *) &opt, + sizeof(opt)) < 0) + { + kError() << "setsockopt(SO_REUSEADDR): " << strerror(errno); + return -1; + } + opt = 1; + if (setsockopt(socketFd, SOL_SOCKET, SO_KEEPALIVE, (char *) &opt, + sizeof(opt)) < 0) + { + kError() << "setsockopt(SO_KEEPALIVE): " << strerror(errno); + return -1; + } + chmod(sock, 0600); + if (listen(socketFd, 1) < 0) + { + kError() << "listen(): " << strerror(errno); + return -1; + } + + return socketFd; +} + +static void urls2Local(KUrl::List &urls, QStringList &items, QWidget *parent) +{ + KUrl::List::Iterator it(urls.begin()), + end(urls.end()); + + for(; it!=end; ++it) + { + kDebug() << "URL:" << *it << " local? " << (*it).isLocalFile(); + if((*it).isLocalFile()) + items.append((*it).path()); + else + { + KUrl url(KIO::NetAccess::mostLocalUrl(*it, parent)); + + kDebug() << "mostLocal:" << url << " local? " << url.isLocalFile(); + if(url.isLocalFile()) + items.append(url.path()); + else + break; + } + } +} + +KDialogD::KDialogD(QObject *parent) + : QObject(parent), +#ifdef KDIALOGD_APP + itsTimer(NULL), + itsTimeoutVal(DEFAULT_TIMEOUT), +#endif + itsFd(::createSocket()), + itsNumConnections(0) +{ + if(itsFd<0) + { + kError() << "KDialogD could not create socket"; +#ifdef KDIALOGD_APP + kapp->exit(); +#endif + } + else + { + std::ofstream f(getPidFileName()); + + if(f) + { + f << getpid(); + f.close(); + } + if(!theirConfig) + theirConfig=new KConfig("kdialogd4rc"); // , KConfig::OnlyLocal); + + connect(new QSocketNotifier(itsFd, QSocketNotifier::Read, this), + SIGNAL(activated(int)), this, SLOT(newConnection())); + +#ifdef KDIALOGD_APP + if(theirConfig->hasGroup(CFG_TIMEOUT_GROUP)) + { + itsTimeoutVal=KConfigGroup(theirConfig, CFG_TIMEOUT_GROUP).readEntry(CFG_TIMEOUT_KEY, DEFAULT_TIMEOUT); + if(itsTimeoutVal<0) + itsTimeoutVal=DEFAULT_TIMEOUT; + } + kDebug() << "Timeout:" << itsTimeoutVal; + if(itsTimeoutVal) + { + connect(itsTimer=new QTimer(this), SIGNAL(timeout()), this, SLOT(timeout())); + itsTimer->setSingleShot(true); + } +#endif + } +} + +KDialogD::~KDialogD() +{ + if(-1!=itsFd) + close(itsFd); + if(theirConfig) + delete theirConfig; + theirConfig=NULL; +} + +void KDialogD::newConnection() +{ + kDebug() << "New connection"; + + ksocklen_t addrlen = 64; + struct sockaddr_un clientname; + int connectedFD; + + if((connectedFD=::accept(itsFd, (struct sockaddr *) &clientname, &addrlen))>=0) + { + int appNameLen; + + if(readBlock(connectedFD, (char *)&appNameLen, 4)) + { + bool ok=true; + QByteArray appName; + + if(0==appNameLen) + appName="Generic"; + else + { + appName.resize(appNameLen); + ok=readBlock(connectedFD, appName.data(), appNameLen); + } + + if(ok) + { + itsNumConnections++; +#ifdef KDIALOGD_APP + if(itsTimer) + itsTimer->stop(); +#endif + connect(new KDialogDClient(connectedFD, appName, this), + SIGNAL(error(KDialogDClient *)), + this, SLOT(deleteConnection(KDialogDClient *))); + } + } + } +} + +void KDialogD::deleteConnection(KDialogDClient *client) +{ + kDebug() << "Delete client"; + delete client; + +#ifdef KDIALOGD_APP + if(0==--itsNumConnections) + if(itsTimeoutVal) + itsTimer->start(itsTimeoutVal*1000); // Only single shot... + else + timeout(); +#endif +} + +void KDialogD::timeout() +{ +#ifdef KDIALOGD_APP + if(0==itsNumConnections) + if(grabLock(0)>0) // 0=> no wait... + { + kDebug() << "Timeout occured, and no connections, so exit"; + kapp->exit(); + } + else //...unlock lock file... + { + kDebug() << "Timeout occured, but unable to grab lock file - app must be connecting"; + releaseLock(); + } +#endif +} + +KDialogDClient::KDialogDClient(int sock, const QString &an, QObject *parent) + : QObject(parent), + itsFd(sock), + itsDlg(NULL), + itsXid(0), + itsAccepted(false), + itsAppName(an) +{ + kDebug() << "new client..." << itsAppName << " (" << itsFd << ")"; + connect(new QSocketNotifier(itsFd, QSocketNotifier::Read, this), SIGNAL(activated(int)), this, SLOT(read())); + connect(new QSocketNotifier(itsFd, QSocketNotifier::Exception, this), SIGNAL(activated(int)), this, SLOT(close())); +} + +KDialogDClient::~KDialogDClient() +{ + kDebug() << "Deleted client"; + if(-1!=itsFd) + ::close(itsFd); + itsDlg=NULL; + if(KDialogD::config()) + KDialogD::config()->sync(); +} + +void KDialogDClient::close() +{ + kDebug() << "close" << itsFd; + + ::close(itsFd); + itsFd=-1; + if(itsDlg) + { + itsDlg->close(); + itsDlg->delayedDestruct(); + itsDlg=NULL; + itsXid=0; + } + + emit error(this); +} + +void KDialogDClient::read() +{ + kDebug() << "read" << itsFd; + + if(-1==itsFd) + return; + + char request; + QString caption; + + if(!itsDlg && readData(&request, 1) && request>=(char)OP_FILE_OPEN && request<=(char)OP_FOLDER && + readData((char *)&itsXid, 4) && readString(caption)) + { + if("."==caption) + switch((Operation)request) + { + case OP_FILE_OPEN: + case OP_FILE_OPEN_MULTIPLE: + caption=i18n("Open"); + break; + case OP_FILE_SAVE: + caption=i18n("Save As"); + break; + case OP_FOLDER: + caption=i18n("Select Folder"); + break; + default: + break; + } + + if(OP_FOLDER==(Operation)request) + { + QString intialFolder; + + if(readString(intialFolder)) + { + initDialog(caption, new KDialogDDirSelectDialog(itsAppName, intialFolder, true, NULL, false)); + return; + } + } + else + { + QString intialFolder, + filter; + char overW=0; + + if(readString(intialFolder) && readString(filter) && + (OP_FILE_SAVE!=(Operation)request || readData(&overW, 1))) + { + initDialog(caption, new KDialogDFileDialog(itsAppName, (Operation)request, intialFolder, + filter, overW ? true : false)); + return; + } + } + } + + kDebug() << "Comms error, closing connection..." << itsFd; + // If we get here something was wrong, close connection... + close(); +} + +void KDialogDClient::finished() +{ + if(-1==itsFd) + return; + + // + // * finished is emitted when a dialog is ok'ed/cancel'ed/closed + // * if the user just closes the dialog - neither ok nor cancel are emitted + // * the dir select dialog doesnt seem to set the QDialog result parameter + // when it is accepted - so for this reason if ok is clicked we store an + // 'accepted' value there, and check for that after the dialog is finished. + kDebug() << "finished " << (void *)itsDlg << itsAccepted << (itsDlg ? QDialog::Accepted==itsDlg->result() : false); + + if(itsDlg && !(itsAccepted || QDialog::Accepted==itsDlg->result())) + cancel(); +} + +void KDialogDClient::ok(const QStringList &items) +{ + kDebug() << "ok"; + + int num=items.count(); + QStringList::ConstIterator it(items.begin()), + end(items.end()); + bool error=!writeData((char *)&num, 4); + + for(; !error && it!=end; ++it) + { + kDebug() << "writeString " << *it; + error=!writeString(*it); + } + + if(error) + close(); + else + itsAccepted=true; + if(itsDlg) + itsDlg->delayedDestruct(); + itsDlg=NULL; +} + +void KDialogDClient::cancel() +{ + kDebug() << "cancel"; + + if(itsDlg) + { + kDebug() << "send cancel"; + + int rv=0; + + if(!writeData((char *)&rv, 4)) + { + kDebug() << "failed to write data!"; + close(); + } + if(itsDlg) + itsDlg->delayedDestruct(); + itsDlg=NULL; + } +} + +bool KDialogDClient::readData(QByteArray &buffer, int size) +{ + kDebug() << "readData" << itsFd; + buffer.resize(size); + return ::readBlock(itsFd, buffer.data(), size); +} + +bool KDialogDClient::readString(QString &str) +{ + kDebug() << "readString" << itsFd; + + int size; + + if(!readData((char *)&size, 4)) + return false; + + QByteArray buffer; + buffer.resize(size); + + if(!readData(buffer.data(), size)) + return false; + + str=QString::fromUtf8(buffer.data()); + return true; +} + +bool KDialogDClient::writeString(const QString &str) +{ + kDebug() << "writeString" << itsFd; + + QByteArray utf8(str.toUtf8()); + + int size=utf8.length()+1; + + return writeData((char *)&size, 4) && writeData(utf8.data(), size); +} + +void KDialogDClient::initDialog(const QString &caption, KDialog *d) +{ + kDebug() << "initDialog" << itsFd; + + itsAccepted=false; + itsDlg=d; + + if(!caption.isEmpty()) + itsDlg->setPlainCaption(caption); + + if(itsXid) + itsDlg->installEventFilter(this); + + connect(itsDlg, SIGNAL(okClicked()), itsDlg, SLOT(slotOk())); + connect(itsDlg, SIGNAL(ok(const QStringList &)), this, SLOT(ok(const QStringList &))); + connect(itsDlg, SIGNAL(finished()), this, SLOT(finished())); + itsDlg->show(); +} + +bool KDialogDClient::eventFilter(QObject *object, QEvent *event) +{ + if(object==itsDlg && QEvent::ShowToParent==event->type()) + { +#ifdef USE_KWIN + KWindowSystem::setMainWindow(itsDlg, itsXid); + KWindowSystem::setState(itsDlg->winId(), NET::Modal|NET::SkipTaskbar|NET::SkipPager); + +#if 0 + KWindowInfo wi(KWindowSystem::windowInfo(itsXid, NET::WMGeometry, NET::WM2UserTime)); + QRect geom(wi.geometry()); + int rx=geom.x(), + ry=geom.y(); + + rx=(rx+(geom.width()/2))-(itsDlg->width()/2); + if(rx<0) + rx=0; + ry=(ry+(geom.height()/2))-(itsDlg->height()/2); + if(ry<0) + ry=0; + itsDlg->move(rx, ry); +#endif + QPixmap icon=KWindowSystem::icon(itsXid, 16, 16, true, KWindowSystem::NETWM | KWindowSystem::WMHints); + if(!icon.isNull()) + itsDlg->setWindowIcon(QIcon(icon)); +#else + XSetTransientForHint(QX11Info::display(), itsDlg->winId(), itsXid); +#if 0 + XWindowAttributes attr; + int rx, ry; + Window junkwin; + + if(XGetWindowAttributes(QX11Info::display(), itsXid, &attr)) + { + XTranslateCoordinates(QX11Info::display(), itsXid, attr.root, + -attr.border_width, -16, + &rx, &ry, &junkwin); + + rx=(rx+(attr.width/2))-(itsDlg->width()/2); + if(rx<0) + rx=0; + ry=(ry+(attr.height/2))-(itsDlg->height()/2); + if(ry<0) + ry=0; + itsDlg->move(rx, ry); + } +#endif + +// unsigned long num; +// unsigned long *data = NULL; +// Atom prop = XInternAtom(QX11Info::display(), "_NET_WM_ICON", False); +// Atom typeRet; +// int formatRet; +// unsigned long afterRet; +// if(XGetWindowProperty(QX11Info::display(), itsXid, prop, 0, 0x7FFFFFFF, False, XA_CARDINAL, +// &typeRet, &formatRet, &num, &afterRet, (unsigned char **)&data)) +// { +// kDebug() << "GOT ICON!!!"; +// } +// else +// kDebug() << "FAILED TO GET ICON!!!"; +#endif + itsDlg->removeEventFilter(this); + } + + return false; +} + +KDialogDFileDialog::KDialogDFileDialog(QString &an, Operation op, const QString &startDir, + const QString &filter, bool confirmOw) + : KFileDialog(KUrl(startDir.isEmpty() || "~"==startDir ? QDir::homePath() : startDir), + filter, NULL), + itsConfirmOw(confirmOw), + itsDone(false), + itsAppName(an) +{ + setModal(false); + setSelection(startDir); + kDebug() << "startDir:" << startDir; + + switch(op) + { + case OP_FILE_OPEN: + setOperationMode(KFileDialog::Opening); + setMode(KFile::File|KFile::ExistingOnly); + break; + case OP_FILE_OPEN_MULTIPLE: + setOperationMode(KFileDialog::Opening); + setMode(KFile::Files|KFile::ExistingOnly); + break; + case OP_FILE_SAVE: + setOperationMode(KFileDialog::Saving); + setMode(KFile::File); + break; + default: + break; + } + + if(KDialogD::config()) + { + KConfigGroup cfg(KDialogD::config(), groupName(itsAppName)); + + //TODO !!! readConfig(KDialogD::config(), grp); + resize(cfg.readEntry(CFG_KEY_DIALOG_SIZE, QSize(600, 400))); + } + + //TODO !!! ops->clearHistory(); +} + +void KDialogDFileDialog::accept() +{ + fileWidget()->accept(); + + kDebug() << "KDialogDFileDialog::slotOk" << selectedUrls().count() << ' ' << mode() << ' ' << selectedUrl().prettyUrl(); + KUrl::List urls(selectedUrls()); + QStringList items; + bool good=true; + + if(urls.count()) + { + urls2Local(urls, items, this); + + if(urls.count()!=items.count()) + { + KMessageBox::sorry(this, i18n("You can only select local files."), + i18n("Remote Files Not Accepted")); + good=false; + } + else if(itsConfirmOw && KFileDialog::Saving==operationMode()) + good=!KIO::NetAccess::exists(urls.first(), KIO::NetAccess::DestinationSide, this) || + KMessageBox::Continue==KMessageBox::warningContinueCancel(this, + i18n("File %1 exits.\nDo you want to replace it?") + .arg(urls.first().prettyUrl()), + i18n("File Exists"), + KGuiItem(i18n("Replace"), "filesaveas"), KStandardGuiItem::cancel(), QString(), + KMessageBox::Notify|KMessageBox::PlainCaption); + + if(good) + { + QString filter(currentFilter()); + + if(!filter.isEmpty()) + items.append(filter); + + emit ok(items); + hide(); + //KFileDialog::accept(); + } + else + setResult(QDialog::Rejected); + } +} + +KDialogDFileDialog::~KDialogDFileDialog() +{ + kDebug() << "~KDialogDFileDialog"; + + if(KDialogD::config()) + { + KConfigGroup cfg(KDialogD::config(), groupName(itsAppName)); + + //TODO !!! writeConfig(KDialogD::config(), grp); + cfg.writeEntry(CFG_KEY_DIALOG_SIZE, size()); + } +} + +KDialogDDirSelectDialog::KDialogDDirSelectDialog(QString &an, const QString &startDir, bool localOnly, + QWidget *parent, bool modal) + : KDirSelectDialog(KUrl(startDir.isEmpty() || "~"==startDir + ? QDir::homePath() : startDir), + localOnly, parent), + itsAppName(an) +{ + kDebug() << "startDir:" << startDir; + + setModal(false); + if(KDialogD::config()) + { + KConfigGroup cfg(KDialogD::config(), groupName(itsAppName, false)); + + //TODO !!! readConfig(KDialogD::config(), grp); + resize(cfg.readEntry(CFG_KEY_DIALOG_SIZE, QSize(600, 400))); + } +} + +KDialogDDirSelectDialog::~KDialogDDirSelectDialog() +{ + kDebug() << "~KDialogDDirSelectDialog"; + + if(KDialogD::config()) + { + KConfigGroup cfg(KDialogD::config(), groupName(itsAppName, false)); + + //TODO !!! writeConfig(KDialogD::config(), grp); + cfg.writeEntry(CFG_KEY_DIALOG_SIZE, size()); + } +} + +void KDialogDDirSelectDialog::slotOk() +{ + kDebug() << "KDialogDDirSelectDialog::slotOk"; + + KUrl::List urls; + QStringList items; + + urls.append(url()); + urls2Local(urls, items, this); + + if(urls.count()!=items.count()) + KMessageBox::sorry(this, i18n("You can only select local folders."), + i18n("Remote Folders Not Accepted")); + else + { + emit ok(items); + hide(); + } +} + +#ifdef KDIALOGD_APP +static KAboutData aboutData("kdialogd4", "kdialogd4", ki18n("KDialog Daemon"), VERSION, + ki18n("Use KDE dialogs from non-KDE apps."), + KAboutData::License_GPL, + ki18n("(c) Craig Drummond, 2006-2007")); + +int main(int argc, char **argv) +{ + KCmdLineArgs::init(argc, argv, &aboutData); + + KUniqueApplication *app=new KUniqueApplication; + KDialogD kdialogd; + + QApplication::setQuitOnLastWindowClosed(false); + + int rv=app->exec(); + + delete app; + + unlink(getSockName()); + releaseLock(); + return rv; +} +#else +extern "C" +{ + KDE_EXPORT KDEDModule *create_kdialogd() + { + return new KDialogDKDED(); + } +}; + +KDialogDKDED::KDialogDKDED() + : KDEDModule() +{ + new KDialogD(this); +} +#endif + +#include "kdialogd.moc" + diff --git a/kdialogd4/kdialogd.h b/kdialogd4/kdialogd.h new file mode 100644 index 0000000..c5e7e7d --- /dev/null +++ b/kdialogd4/kdialogd.h @@ -0,0 +1,146 @@ +#ifndef __KDIALOGD_H__ +#define __KDIALOGD_H__ + +#include <kfile.h> +#include <kfiledialog.h> +#include <kfiledialog.h> +#include <kdirselectdialog.h> +#include "common.h" +#include "config.h" + +#ifdef KDIALOGD_APP +class QTimer; +#else +#include <kdedmodule.h> +#endif +class KDialog; +class KConfig; + +class KDialogDFileDialog : public KFileDialog +{ + Q_OBJECT + + public: + + KDialogDFileDialog(QString &an, Operation op, const QString& startDir, const QString& filter, + bool confirmOw); + virtual ~KDialogDFileDialog(); + + public slots: + + void accept(); + + signals: + + void ok(const QStringList &items); + + private: + + bool itsConfirmOw, + itsDone; + QString &itsAppName; +}; + +class KDialogDDirSelectDialog : public KDirSelectDialog +{ + Q_OBJECT + + public: + + KDialogDDirSelectDialog(QString &an, const QString &startDir = QString(), + bool localOnly = false, QWidget *parent = 0L, + bool modal = false); + virtual ~KDialogDDirSelectDialog(); + + public slots: + + void slotOk(); + + signals: + + void ok(const QStringList &items); + + private: + + QString &itsAppName; +}; + +class KDialogDClient : public QObject +{ + Q_OBJECT + + public: + + KDialogDClient(int sock, const QString &an, QObject *parent); + virtual ~KDialogDClient(); + + public slots: + + void read(); + void close(); + void ok(const QStringList &items); + void finished(); + + signals: + + void error(KDialogDClient *); + + private: + + void cancel(); + bool readData(QByteArray &buffer, int size); + bool readData(char *buffer, int size) { return readBlock(itsFd, buffer, size); } + bool writeData(const char *buffer, int size) { return writeBlock(itsFd, buffer, size); } + bool readString(QString &str); + bool writeString(const QString &str); + void initDialog(const QString &caption, KDialog *d); + bool eventFilter(QObject *object, QEvent *event); + + private: + + int itsFd; + KDialog *itsDlg; + unsigned int itsXid; + bool itsAccepted; + QString itsAppName; +}; + +class KDialogD : public QObject +{ + Q_OBJECT + + public: + + KDialogD(QObject *parent=0L); + virtual ~KDialogD(); + + public slots: + + void newConnection(); + void deleteConnection(KDialogDClient *client); + void timeout(); + + static KConfig * config() { return theirConfig; } + + private: + +#ifdef KDIALOGD_APP + QTimer *itsTimer; + int itsTimeoutVal; +#endif + int itsFd, + itsNumConnections; + + static KConfig *theirConfig; +}; + +#ifndef KDIALOGD_APP +class KDialogDKDED : public KDEDModule +{ + public: + + KDialogDKDED(); +}; +#endif + +#endif diff --git a/kdialogd4/po/CMakeLists.txt b/kdialogd4/po/CMakeLists.txt new file mode 100644 index 0000000..c706aff --- /dev/null +++ b/kdialogd4/po/CMakeLists.txt @@ -0,0 +1,41 @@ +find_package(Msgfmt REQUIRED) + +# .po to .gmo stuff +file(GLOB _pofiles *.po) + +foreach(_file ${_pofiles}) + get_filename_component(_file_we ${_file} NAME_WE) + set(_out "${CMAKE_CURRENT_BINARY_DIR}/${_file_we}.gmo") + set(_in "${_file_we}.po") + add_custom_command(OUTPUT ${_out} COMMAND ${MSGFMT_EXECUTABLE} -o ${_out} ${_file} DEPENDS ${_file}) + install(FILES ${_out} DESTINATION share/locale/${_file_we}/LC_MESSAGES/ RENAME kdialogd4.mo) + set(_outputs ${_outputs} ${_out}) +endforeach(_file) + +add_custom_target(pofiles ALL DEPENDS ${_outputs}) + +# Stuff to generate the .pot +set(POT_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../kdialogd.cpp) +set(POT_OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/kdialogd4.pot) + +# Find xgettext +find_program(XGETTEXT_PATH NAMES "xgettext" PATHS "/usr/bin" "/usr/local/bin") +if(${XGETTEXT_PATH} STREQUAL "XGETTEXT_PATH-NOTFOUND") + message(STATUS "xgettext not found. You will not be able to run 'make extract_messages' in the 'po' directory.") +else(${XGETTEXT_PATH} STREQUAL "XGETTEXT_PATH-NOTFOUND") + message(STATUS "Found xgettext: ${XGETTEXT_PATH}") +endif(${XGETTEXT_PATH} STREQUAL "XGETTEXT_PATH-NOTFOUND") + +if(EXISTS ${KDE4_INCLUDE_DIR}/kde.pot) + add_custom_command( + OUTPUT ${POT_OUTPUT} + COMMAND ${XGETTEXT_PATH} --foreign-user -C -ci18n -ki18n -ktr2i18n -kI18N_NOOP -kI18N_NOOP2 -kaliasLocale -x "${KDE4_INCLUDE_DIR}/kde.pot" -o ${POT_OUTPUT} ${POT_SOURCES} + ) +else (EXISTS ${KDE4_INCLUDE_DIR}/kde.pot) + add_custom_command( + OUTPUT ${POT_OUTPUT} + COMMAND ${XGETTEXT_PATH} --foreign-user -C -ci18n -ki18n -ktr2i18n -kI18N_NOOP -kI18N_NOOP2 -kaliasLocale -o ${POT_OUTPUT} ${POT_SOURCES} + ) +endif (EXISTS ${KDE4_INCLUDE_DIR}/kde.pot) + +add_custom_target(extract_messages DEPENDS ${POT_OUTPUT}) diff --git a/kdialogd4/po/cs.po b/kdialogd4/po/cs.po new file mode 100644 index 0000000..9e4d454 --- /dev/null +++ b/kdialogd4/po/cs.po @@ -0,0 +1,61 @@ +# translation of cs.po to Česky +# This file is put in the public domain. +# +# Marián Kyral <mkyral@email.cz>, 2007. +msgid "" +msgstr "" +"Project-Id-Version: cs\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-21 15:08+0100\n" +"PO-Revision-Date: 2007-10-16 05:41+0200\n" +"Last-Translator: Marián Kyral <mkyral@email.cz>\n" +"Language-Team: Česky <cs@li.org>\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=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +#: kdialogd.cpp:331 +msgid "Open" +msgstr "Otevřít" + +#: kdialogd.cpp:334 +msgid "Save As" +msgstr "Uložit jako" + +#: kdialogd.cpp:337 +msgid "Select Folder" +msgstr "Vyberte složku" + +#: kdialogd.cpp:627 +msgid "You can only select local files." +msgstr "Můžete vybrat pouze místní soubory." + +#: kdialogd.cpp:628 +msgid "Remote Files Not Accepted" +msgstr "Vzdálené soubory nejsou akceptovány." + +#: kdialogd.cpp:634 +msgid "" +"File %1 exits.\n" +"Do you want to replace it?" +msgstr "" +"Soubor %1 existuje.\n" +"Chcete jej přepsat?" + +#: kdialogd.cpp:636 +msgid "File Exists" +msgstr "Soubor existuje." + +#: kdialogd.cpp:637 +msgid "Replace" +msgstr "Přepiš" + +#: kdialogd.cpp:712 +msgid "You can only select local folders." +msgstr "Můžete vybrat pouze místní složky." + +#: kdialogd.cpp:713 +msgid "Remote Folders Not Accepted" +msgstr "Vzdálené složky nejsou akceptovány." diff --git a/kdialogd4/po/de.po b/kdialogd4/po/de.po new file mode 100644 index 0000000..1d36f03 --- /dev/null +++ b/kdialogd4/po/de.po @@ -0,0 +1,62 @@ +# translation of kdialogd4.po to Deutsch +# This file is put in the public domain. +# +# Jannick Kuhr <opensource@kuhr.org>, 2007. +msgid "" +msgstr "" +"Project-Id-Version: kdialogd4\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-21 15:08+0100\n" +"PO-Revision-Date: 2007-10-11 13:28+0200\n" +"Last-Translator: Jannick Kuhr <opensource@kuhr.org>\n" +"Language-Team: Deutsch <kde-i18n-de@kde.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#:kdialogd.cpp:331 +msgid "Open" +msgstr "Öffnen" + +#:kdialogd.cpp:334 +msgid "Save As" +msgstr "Speichern unter" + +#:kdialogd.cpp:337 +msgid "Select Folder" +msgstr "Ordner wählen" + +#:kdialogd.cpp:627 +msgid "You can only select local files." +msgstr "Sie können nur lokale Dateien auswählen." + +#:kdialogd.cpp:628 +msgid "Remote Files Not Accepted" +msgstr "Dateien von Fremdrechnern werden nicht akzeptiert." + +#:kdialogd.cpp:634 +msgid "" +"File %1 exits.\n" +"Do you want to replace it?" +msgstr "" +"Die Datei %1 exisitiert bereits.\n" +"Wollen Sie sie ersetzen?" + +#:kdialogd.cpp:636 +msgid "File Exists" +msgstr "Datei existiert bereits" + +#:kdialogd.cpp:637 +msgid "Replace" +msgstr "Ersetzen" + +#:kdialogd.cpp:712 +msgid "You can only select local folders." +msgstr "Sie können nur lokale Ordner auswählen." + +#:kdialogd.cpp:713 +msgid "Remote Folders Not Accepted" +msgstr "Ordner von Fremdrechnern werden nicht akzeptiert." + diff --git a/kdialogd4/po/en_GB.po b/kdialogd4/po/en_GB.po new file mode 100644 index 0000000..b811497 --- /dev/null +++ b/kdialogd4/po/en_GB.po @@ -0,0 +1,60 @@ +# translation of kdialogd4.po to British English +# Copyright (C) 2007 Craig Drummond <Craig.Drummond@lycos.co.uk> +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: kdialogd4\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-21 14:40+0100\n" +"PO-Revision-Date: 2007-10-05 22:35+0200\n" +"Last-Translator: Craig Drummond <Craig.Drummond@lycos.co.uk>\n" +"Language-Team: Craig Drummond <Craig.Drummond@lycos.co.uk>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: kdialogd.cpp:328 +msgid "Select Folder" +msgstr "Select Folder" + +#: kdialogd.cpp:573 +msgid "You can only select local files." +msgstr "You can only select local files." + +#: kdialogd.cpp:574 +msgid "Remote Files Not Accepted" +msgstr "Remote Files Not Accepted" + +#: kdialogd.cpp:580 +msgid "" +"File %1 exits.\n" +"Do you want to replace it?" +msgstr "" +"File %1 exits.\n" +"Do you want to replace it?" + +#: kdialogd.cpp:582 +msgid "File Exists" +msgstr "File Exists" + +#: kdialogd.cpp:667 +msgid "You can only select local folders." +msgstr "You can only select local folders." + +#: kdialogd.cpp:668 +msgid "Remote Folders Not Accepted" +msgstr "Remote Folders Not Accepted" + +#: kdialogd.cpp:677 +msgid "KDialog Daemon" +msgstr "KDialog Daemon" + +#: kdialogd.cpp:678 +msgid "Use KDE dialogs from non-KDE apps." +msgstr "Use KDE dialogs from non-KDE apps." + +#: kdialogd.cpp:680 +msgid "(c) Craig Drummond, 2006-2007" +msgstr "(c) Craig Drummond, 2006-2007" diff --git a/kdialogd4/po/es.po b/kdialogd4/po/es.po new file mode 100644 index 0000000..5de4e58 --- /dev/null +++ b/kdialogd4/po/es.po @@ -0,0 +1,56 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-21 15:08+0100\n" +"PO-Revision-Date: 2007-10-19 18:06+0200\n" +"Last-Translator: Marco Antonio Blanco <mablanco@activasistemas.com>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.10.1\n" + +#: kdialogd.cpp:331 +msgid "Open" +msgstr "Abrir" + +#: kdialogd.cpp:334 +msgid "Save As" +msgstr "Guardar como" + +#: kdialogd.cpp:337 +msgid "Select Folder" +msgstr "Seleccione carpeta" + +#: kdialogd.cpp:627 +msgid "You can only select local files." +msgstr "Sólo se pueden seleccionar ficheros locales." + +#: kdialogd.cpp:628 +msgid "Remote Files Not Accepted" +msgstr "No se aceptan ficheros remotos" + +#: kdialogd.cpp:634 +msgid "" +"File %1 exits.\n" +"Do you want to replace it?" +msgstr "" +"El fichero %1 existe.\n" +"¿Quiere sustituirlo?" + +#: kdialogd.cpp:636 +msgid "File Exists" +msgstr "El fichero existe" + +#: kdialogd.cpp:637 +msgid "Replace" +msgstr "Sustituir" + +#: kdialogd.cpp:712 +msgid "You can only select local folders." +msgstr "Sólo se pueden seleccionar carpetas locales." + +#: kdialogd.cpp:713 +msgid "Remote Folders Not Accepted" +msgstr "No se aceptan carpetas remotas" diff --git a/kdialogd4/po/fr.po b/kdialogd4/po/fr.po new file mode 100644 index 0000000..b0c500e --- /dev/null +++ b/kdialogd4/po/fr.po @@ -0,0 +1,60 @@ +# translation of kdialogd4.po to French +# Copyright (C) 2007 aul Thomas <pw1517@gmail.com> +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: kdialogd4\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-21 14:40+0100\n" +"PO-Revision-Date: 2007-10-06 17:54+0200\n" +"Last-Translator: Paul Thomas <pw1517@gmail.com>\n" +"Language-Team: Paul Thomas <pw1517@gmail.com>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: kdialogd.cpp:328 +msgid "Select Folder" +msgstr "Sélectionnez le dossier" + +#: kdialogd.cpp:573 +msgid "You can only select local files." +msgstr "Vous ne pouvez sélectionner que des fichiers locaux." + +#: kdialogd.cpp:574 +msgid "Remote Files Not Accepted" +msgstr "Les fichiers distants ne sont pas acceptés" + +#: kdialogd.cpp:580 +msgid "" +"File %1 exits.\n" +"Do you want to replace it?" +msgstr "" +"Le fichier %1 exite déjà.\n" +"Voulez-vous le remplacer" + +#: kdialogd.cpp:582 +msgid "File Exists" +msgstr "Le Fichier existe déjà" + +#: kdialogd.cpp:667 +msgid "You can only select local folders." +msgstr "Vous ne pouvez sélectionner que des dossiers locaux." + +#: kdialogd.cpp:668 +msgid "Remote Folders Not Accepted" +msgstr "Les dossiers distants ne sont pas acceptés" + +#: kdialogd.cpp:677 +msgid "KDialog Daemon" +msgstr "KDialog Daemon" + +#: kdialogd.cpp:678 +msgid "Use KDE dialogs from non-KDE apps." +msgstr "Utilisez les dialogues KDE à partir d'applications non-KDE." + +#: kdialogd.cpp:680 +msgid "(c) Craig Drummond, 2006-2007" +msgstr "(c) Craig Drummond, 2006-2007" diff --git a/kdialogd4/po/kdialogd4.pot b/kdialogd4/po/kdialogd4.pot new file mode 100644 index 0000000..abc8249 --- /dev/null +++ b/kdialogd4/po/kdialogd4.pot @@ -0,0 +1,58 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-21 15:08+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: kdialogd.cpp:331 +msgid "Open" +msgstr "" + +#: kdialogd.cpp:334 +msgid "Save As" +msgstr "" + +#: kdialogd.cpp:337 +msgid "Select Folder" +msgstr "" + +#: kdialogd.cpp:627 +msgid "You can only select local files." +msgstr "" + +#: kdialogd.cpp:628 +msgid "Remote Files Not Accepted" +msgstr "" + +#: kdialogd.cpp:634 +msgid "" +"File %1 exits.\n" +"Do you want to replace it?" +msgstr "" + +#: kdialogd.cpp:636 +msgid "File Exists" +msgstr "" + +#: kdialogd.cpp:637 +msgid "Replace" +msgstr "" + +#: kdialogd.cpp:712 +msgid "You can only select local folders." +msgstr "" + +#: kdialogd.cpp:713 +msgid "Remote Folders Not Accepted" +msgstr "" diff --git a/kdialogd4/po/pt_BR.po b/kdialogd4/po/pt_BR.po new file mode 100644 index 0000000..79a5463 --- /dev/null +++ b/kdialogd4/po/pt_BR.po @@ -0,0 +1,60 @@ +# translation of kdialogd4.po to Brazillian Portuguese +# This file is put in the public domain. +# +# Márcio Moraes <marcio.moraes@redlinks.com.br>, 2007. +msgid "" +msgstr "" +"Project-Id-Version: kdialogd4\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-21 15:08+0100\n" +"PO-Revision-Date: 2008-02-26 11:47-0300\n" +"Last-Translator: Márcio Moraes <marcio.moraes@redlinks.com.br>\n" +"Language-Team: Márcio Moraes <marcio.moraes@redlinks.com.br>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: kdialogd.cpp:331 +msgid "Open" +msgstr "Abrir" + +#: kdialogd.cpp:334 +msgid "Save As" +msgstr "Salvar Como" + +#: kdialogd.cpp:337 +msgid "Select Folder" +msgstr "Selecionar Pasta" + +#: kdialogd.cpp:627 +msgid "You can only select local files." +msgstr "Selecione apenas arquivos locais." + +#: kdialogd.cpp:628 +msgid "Remote Files Not Accepted" +msgstr "Arquivos remotos não são aceitos" + +#: kdialogd.cpp:634 +msgid "" +"File %1 exits.\n" +"Do you want to replace it?" +msgstr "" +"Arquivo %1 exite.\n" +"Você realmente deseja sobrescrever?" + +#: kdialogd.cpp:636 +msgid "File Exists" +msgstr "Arquivo Existe" + +#: kdialogd.cpp:637 +msgid "Replace" +msgstr "Sobrescrever" + +#: kdialogd.cpp:712 +msgid "You can only select local folders." +msgstr "Selecione apenas pastas locais." + +#: kdialogd.cpp:713 +msgid "Remote Folders Not Accepted" +msgstr "Pastas remotas não são aceitas" diff --git a/kdialogd4/po/ru.po b/kdialogd4/po/ru.po new file mode 100644 index 0000000..cf2abd0 --- /dev/null +++ b/kdialogd4/po/ru.po @@ -0,0 +1,62 @@ +# translation of ru.po to +# This file is put in the public domain. +# +# Yarodin <yarodin@gmail.com>, 2008. +msgid "" +msgstr "" +"Project-Id-Version: kdialogd3\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-21 14:40+0100\n" +"PO-Revision-Date: 2008-05-01 19:31+0600\n" +"Last-Translator: Yarodin <yarodin@gmail.com>\n" +"Language-Team: Russian <kde-i18n-ru@kde.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: kdialogd.cpp:328 +msgid "Select Folder" +msgstr "Выбор папки" + +#: kdialogd.cpp:573 +msgid "You can only select local files." +msgstr "Вы можете выбрать только локальные файлы." + +#: kdialogd.cpp:574 +msgid "Remote Files Not Accepted" +msgstr "Файлы на удаленной машине недоступны" + +#: kdialogd.cpp:580 +msgid "" +"File %1 exits.\n" +"Do you want to replace it?" +msgstr "" +"Файл %1 уже существует.\n" +"Хотите его перезаписать?" + +#: kdialogd.cpp:582 +msgid "File Exists" +msgstr "Файл существует" + +#: kdialogd.cpp:667 +msgid "You can only select local folders." +msgstr "Вы можете выбрать только локальные папки." + +#: kdialogd.cpp:668 +msgid "Remote Folders Not Accepted" +msgstr "Сетевые папки недоступны." + +#: kdialogd.cpp:677 +msgid "KDialog Daemon" +msgstr "KDialog-Демон" + +#: kdialogd.cpp:678 +msgid "Use KDE dialogs from non-KDE apps." +msgstr "Использование KDE диалогов в Не-KDE приложениях." + +#: kdialogd.cpp:680 +msgid "(c) Craig Drummond, 2006-2007" +msgstr "(c) Craig Drummond, 2006-2007" + diff --git a/kdialogd4/po/zh_CN.po b/kdialogd4/po/zh_CN.po new file mode 100644 index 0000000..93d83f7 --- /dev/null +++ b/kdialogd4/po/zh_CN.po @@ -0,0 +1,60 @@ +# translation of kdialogd4.po to Chinese Simplified +# Copyright (C) 2007 Free Software Foundation, Inc. +# +# Liang Qi <cavendish.qi@gmail.com>, 2007. +msgid "" +msgstr "" +"Project-Id-Version: kdialogd4\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-21 14:40+0100\n" +"PO-Revision-Date: 2007-10-05 13:20+0200\n" +"Last-Translator: Liang Qi <cavendish.qi@gmail.com>\n" +"Language-Team: zh_CN <kde-china@kde.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: kdialogd.cpp:328 +msgid "Select Folder" +msgstr "选择文件夹" + +#: kdialogd.cpp:573 +msgid "You can only select local files." +msgstr "仅允许选择本地文件。" + +#: kdialogd.cpp:574 +msgid "Remote Files Not Accepted" +msgstr "无法接受远程文件" + +#: kdialogd.cpp:580 +msgid "" +"File %1 exits.\n" +"Do you want to replace it?" +msgstr "" +"文件 %1 已经存在。\n" +"您想替换它么?" + +#: kdialogd.cpp:582 +msgid "File Exists" +msgstr "文件已存在" + +#: kdialogd.cpp:667 +msgid "You can only select local folders." +msgstr "仅允许选择本地文件夹。" + +#: kdialogd.cpp:668 +msgid "Remote Folders Not Accepted" +msgstr "无法接受远程文件夹" + +#: kdialogd.cpp:677 +msgid "KDialog Daemon" +msgstr "KDialog 守护进程" + +#: kdialogd.cpp:678 +msgid "Use KDE dialogs from non-KDE apps." +msgstr "在非 KDE 程序中使用 KDE 对话框。" + +#: kdialogd.cpp:680 +msgid "(c) Craig Drummond, 2006-2007" +msgstr "(c) Craig Drummond, 2006-2007" |
