diff --git a/libretroshare/src/ft/ftcontroller.cc b/libretroshare/src/ft/ftcontroller.cc index b710b0d93..41130740e 100644 --- a/libretroshare/src/ft/ftcontroller.cc +++ b/libretroshare/src/ft/ftcontroller.cc @@ -994,12 +994,10 @@ bool ftController::handleAPendingRequest() return true ; } -bool ftController::alreadyHaveFile(const std::string& hash) +bool ftController::alreadyHaveFile(const std::string& hash, FileInfo &info) { - FileInfo info ; - // check for downloads - if(FileDetails(hash, info) && (info.downloadStatus == FT_STATE_COMPLETE)) + if (FileDetails(hash, info) && (info.downloadStatus == FT_STATE_COMPLETE)) return true ; // check for file lists @@ -1017,7 +1015,8 @@ bool ftController::FileRequest(const std::string& fname, const std::string& has /* check if we have the file */ - if(alreadyHaveFile(hash)) + FileInfo info; + if(alreadyHaveFile(hash, info)) return false ; if(size == 0) // we treat this special case because @@ -1077,7 +1076,6 @@ bool ftController::FileRequest(const std::string& fname, const std::string& has } } - FileInfo info; std::list::const_iterator it; std::list::const_iterator pit; diff --git a/libretroshare/src/ft/ftcontroller.h b/libretroshare/src/ft/ftcontroller.h index c495da8e0..5112d8ade 100644 --- a/libretroshare/src/ft/ftcontroller.h +++ b/libretroshare/src/ft/ftcontroller.h @@ -142,7 +142,7 @@ class ftController: public CacheTransfer, public RsThread, public pqiMonitor, pu const std::list &sourceIds); /// Do we already have this file, either in download or in file lists ? - bool alreadyHaveFile(const std::string& hash) ; + bool alreadyHaveFile(const std::string& hash, FileInfo &info); bool setChunkStrategy(const std::string& hash,FileChunksInfo::ChunkStrategy s); void setDefaultChunkStrategy(FileChunksInfo::ChunkStrategy s); diff --git a/libretroshare/src/ft/ftserver.cc b/libretroshare/src/ft/ftserver.cc index bd323f6da..0f9d0a534 100644 --- a/libretroshare/src/ft/ftserver.cc +++ b/libretroshare/src/ft/ftserver.cc @@ -281,6 +281,11 @@ bool ftServer::checkHash(const std::string& hash,std::string& error_string) return true ; } +bool ftServer::alreadyHaveFile(const std::string& hash, FileInfo &info) +{ + return mFtController->alreadyHaveFile(hash, info); +} + bool ftServer::FileRequest(const std::string& fname, const std::string& hash, uint64_t size, const std::string& dest, uint32_t flags, const std::list& srcIds) { std::string error_string ; diff --git a/libretroshare/src/ft/ftserver.h b/libretroshare/src/ft/ftserver.h index f4b0c6e6d..4f20fb5df 100644 --- a/libretroshare/src/ft/ftserver.h +++ b/libretroshare/src/ft/ftserver.h @@ -120,6 +120,7 @@ ftController *getController() const { return mFtController ; } /*** * Control of Downloads ***/ +virtual bool alreadyHaveFile(const std::string& hash, FileInfo &info); virtual bool FileRequest(const std::string& fname, const std::string& hash, uint64_t size, const std::string& dest, uint32_t flags, const std::list& srcIds); virtual bool FileCancel(const std::string& hash); virtual bool FileControl(const std::string& hash, uint32_t flags); diff --git a/libretroshare/src/retroshare/rsfiles.h b/libretroshare/src/retroshare/rsfiles.h index ba3b6f141..74e263a49 100644 --- a/libretroshare/src/retroshare/rsfiles.h +++ b/libretroshare/src/retroshare/rsfiles.h @@ -111,6 +111,7 @@ class RsFiles * Control of Downloads. ***/ + virtual bool alreadyHaveFile(const std::string& hash, FileInfo &info) = 0; /// Returns false is we already have the file. Otherwise, initiates the dl and returns true. virtual bool FileRequest(const std::string& fname, const std::string& hash, uint64_t size, const std::string& dest, uint32_t flags, const std::list& srcIds) = 0; virtual bool FileCancel(const std::string& hash) = 0; diff --git a/libretroshare/src/services/p3channels.cc b/libretroshare/src/services/p3channels.cc index a00990a89..b3e443630 100644 --- a/libretroshare/src/services/p3channels.cc +++ b/libretroshare/src/services/p3channels.cc @@ -338,7 +338,14 @@ bool p3Channels::channelExtraFileHash(std::string path, std::string chId, FileIn bool p3Channels::cpyMsgFileToChFldr(std::string path, std::string fname, std::string chId, bool& fileTooLarge){ - FILE *outFile = NULL, *inFile = fopen(path.c_str(), "rb"); + FILE *outFile = NULL, *inFile; +#ifdef WINDOWS_SYS + std::wstring wpath; + librs::util::ConvertUtf8ToUtf16(path, wpath); + inFile = _wfopen(wpath.c_str(), L"rb"); +#else + inFile = fopen(path.c_str(), "rb"); +#endif long buffSize = 0; char* buffer = NULL; @@ -370,7 +377,13 @@ bool p3Channels::cpyMsgFileToChFldr(std::string path, std::string fname, std::st fclose(inFile); std::string localpath = mChannelsDir + "/" + chId + "/" + fname; +#ifdef WINDOWS_SYS + std::wstring wlocalpath; + librs::util::ConvertUtf8ToUtf16(localpath, wlocalpath); + outFile = _wfopen(wlocalpath.c_str(), L"wb"); +#else outFile = fopen(localpath.c_str(), "wb"); +#endif } if(outFile){ diff --git a/retroshare-gui/src/gui/ChannelFeed.cpp b/retroshare-gui/src/gui/ChannelFeed.cpp index c7b800a5c..a4c6cb3f5 100644 --- a/retroshare-gui/src/gui/ChannelFeed.cpp +++ b/retroshare-gui/src/gui/ChannelFeed.cpp @@ -672,6 +672,11 @@ void ChannelFeed::updateChannelListOther(std::list &ids) } } +static bool sortChannelMsgSummary(const ChannelMsgSummary &msg1, const ChannelMsgSummary &msg2) +{ + return (msg1.ts < msg2.ts); +} + void ChannelFeed::updateChannelMsgs() { if (!rsChannels) @@ -744,6 +749,8 @@ void ChannelFeed::updateChannelMsgs() rsChannels->getChannelMsgList(mChannelId, msgs); + msgs.sort(sortChannelMsgSummary); + for(it = msgs.begin(); it != msgs.end(); it++) { ChanMsgItem *cmi = new ChanMsgItem(this, 0, mChannelId, it->msgId, true); diff --git a/retroshare-gui/src/gui/channels/CreateChannelMsg.cpp b/retroshare-gui/src/gui/channels/CreateChannelMsg.cpp index f82ea3ec6..142926fb8 100644 --- a/retroshare-gui/src/gui/channels/CreateChannelMsg.cpp +++ b/retroshare-gui/src/gui/channels/CreateChannelMsg.cpp @@ -135,15 +135,14 @@ void CreateChannelMsg::dropEvent(QDropEvent *event) QList::iterator uit; for(uit = urls.begin(); uit != urls.end(); uit++) { - std::string localpath = uit->toLocalFile().toStdString(); + std::string localpath = uit->toLocalFile().toUtf8().constData(); std::cerr << "Whole URL: " << uit->toString().toStdString(); std::cerr << std::endl; - std::cerr << "or As Local File: " << localpath; + std::cerr << "or As Local File: " << uit->toLocalFile().toStdString(); std::cerr << std::endl; if (localpath.size() > 0) { - addAttachment(localpath); } } @@ -289,7 +288,7 @@ void CreateChannelMsg::addExtraFile() // select a file QString qfile = QFileDialog::getOpenFileName(this, tr("Add Extra File"), "", "", 0, QFileDialog::DontResolveSymlinks); - std::string filePath = qfile.toStdString(); + std::string filePath = qfile.toUtf8().constData(); if (filePath != "") { addAttachment(filePath); @@ -347,9 +346,6 @@ void CreateChannelMsg::checkAttachmentReady() buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); buttonBox->button(QDialogButtonBox::Cancel)->setEnabled(false); break; - - - return; } } } diff --git a/retroshare-gui/src/gui/feeds/ChanMsgItem.cpp b/retroshare-gui/src/gui/feeds/ChanMsgItem.cpp index 5fdda180b..303b34e4b 100644 --- a/retroshare-gui/src/gui/feeds/ChanMsgItem.cpp +++ b/retroshare-gui/src/gui/feeds/ChanMsgItem.cpp @@ -52,6 +52,8 @@ ChanMsgItem::ChanMsgItem(FeedHolder *parent, uint32_t feedId, std::string chanId /* specific */ connect( unsubscribeButton, SIGNAL( clicked( void ) ), this, SLOT( unsubscribeChannel ( void ) ) ); + connect( downloadButton, SIGNAL( clicked( void ) ), this, SLOT( download ( void ) ) ); + connect( playButton, SIGNAL( clicked( void ) ), this, SLOT( play ( void ) ) ); downloadButton->hide(); playButton->hide(); @@ -89,12 +91,24 @@ void ChanMsgItem::updateItemStatic() title += QString::fromStdWString(ci.channelName); titleLabel->setText(title); subjectLabel->setText(QString::fromStdWString(cmi.subject)); + + if ((ci.channelFlags & RS_DISTRIB_SUBSCRIBED) || (ci.channelFlags & RS_DISTRIB_ADMIN)) { + unsubscribeButton->setEnabled(true); + } else { + unsubscribeButton->setEnabled(false); + } } else { /* subject */ titleLabel->setText(QString::fromStdWString(cmi.subject)); subjectLabel->setText(QString::fromStdWString(cmi.msg)); + + /* disable buttons: deletion facility not enabled with cache services yet */ + clearButton->setEnabled(false); + unsubscribeButton->setEnabled(false); + clearButton->hide(); + unsubscribeButton->hide(); } msgLabel->setText(QString::fromStdWString(cmi.msg)); @@ -111,6 +125,15 @@ void ChanMsgItem::updateItemStatic() } + if (mFileItems.empty() == false) { + std::list::iterator it; + for(it = mFileItems.begin(); it != mFileItems.end(); it++) + { + delete(*it); + } + mFileItems.clear(); + } + std::list::iterator it; for(it = cmi.files.begin(); it != cmi.files.end(); it++) { @@ -132,17 +155,6 @@ void ChanMsgItem::updateItemStatic() label->setPixmap(thumbnail); label->setStyleSheet("QLabel#label{border: 2px solid #D3D3D3;border-radius: 3px;}"); } - - if (mIsHome) - { - /* disable buttons: deletion facility not enabled with cache services yet */ - clearButton->setEnabled(false); - unsubscribeButton->setEnabled(false); - clearButton->hide(); - unsubscribeButton->hide(); - } - - } @@ -155,22 +167,68 @@ void ChanMsgItem::updateItem() #endif int msec_rate = 10000; + int downloadCount = 0; + int downloadStartable = 0; + int playCount = 0; + int playStartable = 0; + bool startable; + bool loopAgain = false; + /* Very slow Tick to check when all files are downloaded */ std::list::iterator it; for(it = mFileItems.begin(); it != mFileItems.end(); it++) { - if (!(*it)->done()) + SubFileItem *item = *it; + + if (item->isDownloadable(startable)) { + downloadCount++; + if (startable) { + downloadStartable++; + } + } + if (item->isPlayable(startable)) { + playCount++; + if (startable) { + playStartable++; + } + } + + if (!item->done()) { /* loop again */ - QTimer::singleShot( msec_rate, this, SLOT(updateItem( void ) )); - return; + loopAgain = true; } } + if (downloadCount) { + downloadButton->show(); + if (downloadStartable) { + downloadButton->setEnabled(true); + } else { + downloadButton->setEnabled(false); + } + } else { + downloadButton->hide(); + } + if (playCount) { + /* one file is playable */ + playButton->show(); + + if (playStartable == 1) { + playButton->setEnabled(true); + } else { + playButton->setEnabled(false); + } + } else { + playButton->hide(); + } + + if (loopAgain) { + QTimer::singleShot( msec_rate, this, SLOT(updateItem( void ) )); + } } - void ChanMsgItem::small() { expandFrame->hide(); @@ -182,17 +240,16 @@ void ChanMsgItem::toggle() { expandFrame->show(); expandButton->setIcon(QIcon(QString(":/images/edit_remove24.png"))); - expandButton->setToolTip(tr("Hide")); + expandButton->setToolTip(tr("Hide")); } else { expandFrame->hide(); - expandButton->setIcon(QIcon(QString(":/images/edit_add24.png"))); - expandButton->setToolTip(tr("Expand")); + expandButton->setIcon(QIcon(QString(":/images/edit_add24.png"))); + expandButton->setToolTip(tr("Expand")); } } - void ChanMsgItem::removeItem() { #ifdef DEBUG_ITEM @@ -220,10 +277,10 @@ void ChanMsgItem::gotoHome() void ChanMsgItem::unsubscribeChannel() { - #ifdef DEBUG_ITEM - std::cerr << "ChanMsgItem::unsubscribeChannel()"; - std::cerr << std::endl; - #endif +#ifdef DEBUG_ITEM + std::cerr << "ChanMsgItem::unsubscribeChannel()"; + std::cerr << std::endl; +#endif if (rsChannels) { @@ -232,3 +289,25 @@ void ChanMsgItem::unsubscribeChannel() updateItemStatic(); } +void ChanMsgItem::download() +{ + std::list::iterator it; + for(it = mFileItems.begin(); it != mFileItems.end(); it++) + { + (*it)->download(); + } + + updateItem(); +} + +void ChanMsgItem::play() +{ + std::list::iterator it; + for(it = mFileItems.begin(); it != mFileItems.end(); it++) + { + bool startable; + if ((*it)->isPlayable(startable) && startable) { + (*it)->play(); + } + } +} diff --git a/retroshare-gui/src/gui/feeds/ChanMsgItem.h b/retroshare-gui/src/gui/feeds/ChanMsgItem.h index 91da5f8f7..9ee87d2df 100644 --- a/retroshare-gui/src/gui/feeds/ChanMsgItem.h +++ b/retroshare-gui/src/gui/feeds/ChanMsgItem.h @@ -48,6 +48,8 @@ private slots: void toggle(); void unsubscribeChannel(); + void download(); + void play(); void updateItem(); diff --git a/retroshare-gui/src/gui/feeds/SubFileItem.cpp b/retroshare-gui/src/gui/feeds/SubFileItem.cpp index c4c61615d..8824d6079 100644 --- a/retroshare-gui/src/gui/feeds/SubFileItem.cpp +++ b/retroshare-gui/src/gui/feeds/SubFileItem.cpp @@ -111,11 +111,9 @@ void SubFileItem::Setup() if (mMode == SFI_STATE_REMOTE) { FileInfo fi; - uint32_t hintflags = RS_FILE_HINTS_EXTRA | RS_FILE_HINTS_LOCAL - | RS_FILE_HINTS_SPEC_ONLY; /* look up path */ - if (rsFiles->FileDetails(mFileHash, hintflags, fi)) + if (rsFiles->alreadyHaveFile(mFileHash, fi)) { #ifdef DEBUG_ITEM std::cerr << "SubFileItem::Setup() STATE=>Local Found File"; @@ -131,8 +129,6 @@ void SubFileItem::Setup() smaller(); updateItemStatic(); updateItem(); - - } @@ -154,7 +150,7 @@ void SubFileItem::updateItemStatic() std::cerr << std::endl; #endif - QString filename = QString::fromStdString(mFileName); + QString filename = QString::fromUtf8(mFileName.c_str()); mDivisor = 1; if (mFileSize > 10000000) /* 10 Mb */ @@ -214,7 +210,7 @@ void SubFileItem::updateItemStatic() { case SFI_STATE_ERROR: progressBar->setRange(0, 100); - progressBar->setFormat("ERROR"); + progressBar->setFormat(tr("ERROR")); playButton->setEnabled(false); downloadButton->setEnabled(false); @@ -222,12 +218,12 @@ void SubFileItem::updateItemStatic() expandButton->setEnabled(false); progressBar->setValue(0); - filename = "[ERROR] " + filename; + filename = "[" + tr("ERROR") + "] " + filename; break; case SFI_STATE_EXTRA: - filename = QString::fromStdString(mPath); + filename = QString::fromUtf8(mPath.c_str()); progressBar->setRange(0, 100); progressBar->setFormat("HASHING"); @@ -238,7 +234,7 @@ void SubFileItem::updateItemStatic() expandButton->setEnabled(false); progressBar->setValue(0); - filename = "[EXTRA] " + filename; + filename = "[" + tr("EXTRA") + "] " + filename; break; @@ -249,7 +245,7 @@ void SubFileItem::updateItemStatic() expandButton->setEnabled(false); progressBar->setValue(0); - filename = "[REMOTE] " + filename; + filename = "[" + tr("REMOTE") + "] " + filename; break; @@ -258,7 +254,7 @@ void SubFileItem::updateItemStatic() downloadButton->setEnabled(false); cancelButton->setEnabled(true); expandButton->setEnabled(true); - filename = "[DOWNLOAD] " + filename; + filename = "[" + tr("DOWNLOAD") + "] " + filename; break; @@ -269,7 +265,7 @@ void SubFileItem::updateItemStatic() expandButton->setEnabled(false); progressBar->setValue(mFileSize / mDivisor); - filename = "[LOCAL] " + filename; + filename = "[" + tr("LOCAL") + "] " + filename; break; @@ -278,7 +274,7 @@ void SubFileItem::updateItemStatic() downloadButton->setEnabled(false); cancelButton->setEnabled(false); expandButton->setEnabled(true); - filename = "[UPLOAD] " + filename; + filename = "[" + tr("UPLOAD") + "] " + filename; break; } @@ -341,6 +337,11 @@ void SubFileItem::updateItem() std::cerr << std::endl; #endif /* ignore - dead file, or done */ + + if (mMode == SFI_STATE_ERROR) { + /* updateStatic once */ + stateChanged = true; + } } else if (mMode == SFI_STATE_EXTRA) { @@ -554,6 +555,8 @@ void SubFileItem::cancel() { rsFiles->FileCancel(mFileHash); } + + updateItem(); } @@ -617,6 +620,9 @@ void SubFileItem::download() } rsFiles->FileRequest(mFileName, mFileHash, mFileSize, "", RS_FILE_HINTS_NETWORK_WIDE, srcIds); + downloadButton->setEnabled(false); + + updateItem(); } @@ -653,3 +659,21 @@ void SubFileItem::save() uint32_t SubFileItem::getState() { return mMode; } + +bool SubFileItem::isDownloadable(bool &startable) +{ + /* Check buttons. Not good, but it works. */ + bool visible = downloadButton->isVisibleTo(this); + startable = visible && downloadButton->isEnabled(); + + return visible; +} + +bool SubFileItem::isPlayable(bool &startable) +{ + /* Check buttons. Not good, but it works. */ + bool visible = playButton->isVisibleTo(this); + startable = visible && playButton->isEnabled(); + + return visible; +} diff --git a/retroshare-gui/src/gui/feeds/SubFileItem.h b/retroshare-gui/src/gui/feeds/SubFileItem.h index a8dfbd4d7..16b8a3ab6 100644 --- a/retroshare-gui/src/gui/feeds/SubFileItem.h +++ b/retroshare-gui/src/gui/feeds/SubFileItem.h @@ -70,14 +70,17 @@ public: bool ready(); uint32_t getState(); + bool isDownloadable(bool &startable); + bool isPlayable(bool &startable); + public slots: void download(); + void play(); private slots: void toggle(); void cancel(); - void play(); void save(); void updateItem(); diff --git a/retroshare-gui/src/lang/retroshare_de.qm b/retroshare-gui/src/lang/retroshare_de.qm index e5e244c51..38dd93e36 100644 Binary files a/retroshare-gui/src/lang/retroshare_de.qm and b/retroshare-gui/src/lang/retroshare_de.qm differ diff --git a/retroshare-gui/src/lang/retroshare_de.ts b/retroshare-gui/src/lang/retroshare_de.ts index befcc383b..f4a13810d 100644 --- a/retroshare-gui/src/lang/retroshare_de.ts +++ b/retroshare-gui/src/lang/retroshare_de.ts @@ -856,18 +856,28 @@ p, li { white-space: pre-wrap; } ChanMsgItem - + Remove Item Eintrag entfernen - + Expand Erweitern - + + Download + Herunterladen + + + + Play + Abspielen + + + Unsubscribe From Channel Kanal abbestellen @@ -972,7 +982,7 @@ p, li { white-space: pre-wrap; } ChannelFeed - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -1287,7 +1297,7 @@ Keine Beschreibung ChatStyle - + Standard style for group chat Standard Stil für den Gruppenchat @@ -2220,7 +2230,7 @@ p, li { white-space: pre-wrap; } Drag'n'Drop Dateien aus den Suchergebnissen - + Add Extra File Zusätzlich eine Datei hinzufügen @@ -3499,7 +3509,7 @@ p, li { white-space: pre-wrap; } Andere Foren - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -4588,7 +4598,7 @@ p, li { white-space: pre-wrap; } - + Copy Kopieren @@ -5725,7 +5735,7 @@ Willst Du die Nachricht speichern ? Von - + Size Grösse @@ -5738,7 +5748,7 @@ p, li { white-space: pre-wrap; } <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Empfohlene Dateien</span></p></body></html> - + Reply Antworten @@ -5803,7 +5813,7 @@ p, li { white-space: pre-wrap; } Anhänge - + @@ -5887,13 +5897,13 @@ p, li { white-space: pre-wrap; } Dokument drucken - + Subject Betreff - + Subject: Betreff: @@ -5923,7 +5933,7 @@ p, li { white-space: pre-wrap; } Prüfsumme - + Print Drucken @@ -5986,7 +5996,7 @@ p, li { white-space: pre-wrap; } Allen antworten - + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal;"> @@ -5999,7 +6009,7 @@ p, li { white-space: pre-wrap; } Posteingang gesamt: - + Content Inhalt @@ -6018,7 +6028,7 @@ p, li { white-space: pre-wrap; } Schlagwort - + @@ -7190,7 +7200,7 @@ p, li { white-space: pre-wrap; } Verfügbar - + Add Extra File Zusätzliche Datei hinzufügen @@ -7308,7 +7318,7 @@ p, li { white-space: pre-wrap; } - + Add Friend Freund hinzufügen @@ -7383,7 +7393,7 @@ p, li { white-space: pre-wrap; } Willst du diesen Freund entfernen? - + Save as... Speichern unter... @@ -7416,7 +7426,7 @@ p, li { white-space: pre-wrap; } Status Spalte ausblenden - + Friends Storm Aktivitäten @@ -7744,7 +7754,7 @@ p, li { white-space: pre-wrap; } PopupChatDialog - + Hide Avatar Avatar verstecken @@ -7754,12 +7764,12 @@ p, li { white-space: pre-wrap; } Avatar zeigen - + File not found or file name not accepted. Datei nicht gefunden oder Dateiname nicht akzeptiert. - + Messages you send will be delivered after Friend is again Online Nachrichten, die Du versendest gehen bei diesem Freund erst wieder ein wenn er Online ist @@ -7822,7 +7832,7 @@ p, li { white-space: pre-wrap; } Deaktiviere Emoticons - + Paste retroshare Link RetroShare Link einfügen @@ -7842,12 +7852,12 @@ p, li { white-space: pre-wrap; } Wähle dein Avatar Bild aus - + Add Extra File Zusätzlich eine Datei hinzufügen - + Drop file error. Dateifehler bei Drag'n'Drop. @@ -7879,7 +7889,7 @@ p, li { white-space: pre-wrap; } Text Datei (*.txt );;Alle Dateien (*) - + Your Friend is offline Do you want to send them a Message instead Dein Freund ist Offline willst du ihm stattdessen eine Nachricht senden @@ -7896,7 +7906,7 @@ Do you want to send them a Message instead - + is Idle and may not reply antwortet möglicherweise nicht, da der Status auf "Untätig" gesetzt wurde @@ -7916,7 +7926,7 @@ Do you want to send them a Message instead ist Offline. - + is typing... tippt... @@ -8784,7 +8794,7 @@ p, li { white-space: pre-wrap; } RemoteDirModel - + Friends Directories Dateien von Freunden @@ -8814,7 +8824,7 @@ p, li { white-space: pre-wrap; } Alter - + Anonymous Anonym @@ -8830,12 +8840,12 @@ p, li { white-space: pre-wrap; } - + FILE DATEI - + Files Dateien @@ -8846,7 +8856,7 @@ p, li { white-space: pre-wrap; } - + DIR ORDNER @@ -10369,13 +10379,13 @@ p, li { white-space: pre-wrap; } - + Play File Datei abspielen - + Save Channel File Channel Datei speichern @@ -10390,7 +10400,38 @@ p, li { white-space: pre-wrap; } Abspielen - + + + ERROR + FEHLER + + + + EXTRA + EXTRA + + + + REMOTE + ENTFERNT + + + + DOWNLOAD + DOWNLOAD + + + + LOCAL + LOKAL + + + + UPLOAD + UPLOAD + + + File %1 does not exist at location. Datei %1 existiert nicht. @@ -10568,7 +10609,7 @@ p, li { white-space: pre-wrap; } TransfersDialog - + Cancel Abbrechen @@ -10578,13 +10619,13 @@ p, li { white-space: pre-wrap; } Fertige ausblenden - - + + Status Status - + Completed Fertiggestellt @@ -10638,20 +10679,20 @@ p, li { white-space: pre-wrap; } - + Name i.e: file name Name - - + + Size i.e: file size Grösse - + Speed i.e: Download speed Geschwindigkeit @@ -10674,7 +10715,7 @@ p, li { white-space: pre-wrap; } Kern-ID - + Progress i.e: % uploaded Fortschritt @@ -10691,7 +10732,7 @@ p, li { white-space: pre-wrap; } Übertragen - + Play Abspielen @@ -10776,7 +10817,7 @@ p, li { white-space: pre-wrap; } Blockstrategie - + Queued In Warteschleife @@ -10786,12 +10827,12 @@ p, li { white-space: pre-wrap; } Pausiert - + Transferring Übertrage - + RetroShare @@ -10816,7 +10857,7 @@ p, li { white-space: pre-wrap; } Soll dieser Download wirklich abgebrochen und gelöscht werden? - + Speed / Queue position Geschwindigkeits- / Warteschlangenposition @@ -10832,7 +10873,7 @@ p, li { white-space: pre-wrap; } Download Zeit - + Peer i.e: user name Nachbar @@ -10843,39 +10884,39 @@ p, li { white-space: pre-wrap; } Prüfsumme - - + + Slower Langsamer - - + + Average Durchschnitt - - + + Faster Schneller - + Move in Queue... Verschiebe in Warteschlange... - - + + Failed Gescheitert - - + + Okay OK @@ -10892,8 +10933,8 @@ p, li { white-space: pre-wrap; } Ladend - - + + Complete @@ -10920,7 +10961,7 @@ p, li { white-space: pre-wrap; } Überprüfe... - + Force Check Erzwinge Überprüfung