From d31cef0f111614909657b96f09fb045bf7fb74ea Mon Sep 17 00:00:00 2001 From: thunder2 Date: Tue, 5 Oct 2010 20:39:14 +0000 Subject: [PATCH] ChannelFeed: - Sort the ChanMsgItems of the channel by date ChanMsgItem: - Fixed adding all files (SubFileItem) again by pressing the unsubscribe button (only in Friend Storm) - Enable unsubscribe button only when channel is subscribed (only in Friend Storm) - Fixed adding files with umlauts (utf8) on Windows - Enabled Download and Play button in ChanMsgItem, when they are enabled in the SubFileItems ftServer: - Added the method alreadyHaveFile for use in the GUI - recompile of GUI needed SubFileItem: - Added state strings like LOCAL, REMOTE, ERROR, ... for translating git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@3614 b45a01b8-16f6-495d-af2f-9b41ad6348cc --- libretroshare/src/ft/ftcontroller.cc | 10 +- libretroshare/src/ft/ftcontroller.h | 2 +- libretroshare/src/ft/ftserver.cc | 5 + libretroshare/src/ft/ftserver.h | 1 + libretroshare/src/retroshare/rsfiles.h | 1 + libretroshare/src/services/p3channels.cc | 15 +- retroshare-gui/src/gui/ChannelFeed.cpp | 7 + .../src/gui/channels/CreateChannelMsg.cpp | 10 +- retroshare-gui/src/gui/feeds/ChanMsgItem.cpp | 125 ++++++++++--- retroshare-gui/src/gui/feeds/ChanMsgItem.h | 2 + retroshare-gui/src/gui/feeds/SubFileItem.cpp | 52 ++++-- retroshare-gui/src/gui/feeds/SubFileItem.h | 5 +- retroshare-gui/src/lang/retroshare_de.qm | Bin 273941 -> 274428 bytes retroshare-gui/src/lang/retroshare_de.ts | 175 +++++++++++------- 14 files changed, 290 insertions(+), 120 deletions(-) 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 e5e244c51d1ee655c218ab27db6553e60b753436..38dd93e3619a2fb95d9c096a3b2c0739f63364d3 100644 GIT binary patch delta 15846 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 MCpPTvDJ9qaACQB0p#T5? 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