diff --git a/libretroshare b/libretroshare index 7e526a423..0c16c4a07 160000 --- a/libretroshare +++ b/libretroshare @@ -1 +1 @@ -Subproject commit 7e526a4232285e1c2789315c1f382f54d868df8d +Subproject commit 0c16c4a07eea82a5946bf49ebccb41d7c1e82368 diff --git a/retroshare-gui/src/README.txt b/retroshare-gui/src/README.txt index 7f7f35c8e..231d16b23 100644 --- a/retroshare-gui/src/README.txt +++ b/retroshare-gui/src/README.txt @@ -2,17 +2,14 @@ README for RetroShare ======================================================================================= -RetroShare web site . . . . http://retroshare.net/index.html +RetroShare web site . . . . https://retroshare.cc/ Developer's blog . . . . . https://retroshareteam.wordpress.com -Documentation . . . . . . . https://retroshare.readthedocs.io/en/latest/ -Support . . . . . . . . . . http://retroshare.net/support.html -Forums . . . . . . . . . . http://retroshare.sourceforge.net/forum/ +Documentation . . . . . . . https://retrosharedocs.readthedocs.io/en/latest/ Wiki . . . . . . . . . . . https://github.com/RetroShare/documentation/wiki -Old developers site . . . . http://retroshare.sourceforge.net/wiki/index.php/Developers_Corner Project site . . . . . . . https://github.com/RetroShare/RetroShare -Relted projects/plugins . . https://github.com/RetroShare +Related projects/plugins . .https://github.com/RetroShare -Contact: . . . . . . . . . retroshare@lunamutt.com ,defnax@users.sourceforge.net +Contact: . . . . . . . . . retroshare.project@gmail.com ========================================================================================= Compiling RetroShare @@ -22,9 +19,9 @@ Build Scripts are avaible on GIT: https://github.com/RetroShare/RetroShare/tree/master/build_scripts You can find here instructions howto compile RetroShare: -https://retroshare.readthedocs.io/en/latest/developer/compilation/ +https://retrosharedocs.readthedocs.io/en/latest/developer/compilation/ -You can go on over to our forum or chat lobby when you have trouble with compiling: +You can go on over to our forum or chat room when you have trouble with compiling: retroshare://forum?name=Developers%20Discussions&id=8fd22bd8f99754461e7ba1ca8a727995 retroshare://chat_room?name=Retroshare%20Devel%20%28signed%29&id=L68DB0A1E09BDA3A5 -http://retroshare.sourceforge.net/forum/ + diff --git a/retroshare-gui/src/gui/AboutWidget.cpp b/retroshare-gui/src/gui/AboutWidget.cpp index b468550b1..1c4ae6827 100644 --- a/retroshare-gui/src/gui/AboutWidget.cpp +++ b/retroshare-gui/src/gui/AboutWidget.cpp @@ -142,7 +142,7 @@ void AboutWidget::updateTitle() { if (tWidget == NULL) { - setWindowTitle(QString("%1 %2").arg(tr("About RetroShare"), Rshare::retroshareVersion(true))); + setWindowTitle(QString("%1 %2").arg(tr("About RetroShare"), RsApplication::retroshareVersion(true))); } else { @@ -228,7 +228,7 @@ void AWidget::initImages() #ifdef RS_ONLYHIDDENNODE p.drawText(QPointF(10, 50), QString("%1 : %2 (With embedded Tor)").arg(tr("Retroshare version"), Rshare::retroshareVersion(true))); #else - p.drawText(QPointF(10, 50), QString("%1 : %2").arg(tr("Retroshare version"), Rshare::retroshareVersion(true))); + p.drawText(QPointF(10, 50), QString("%1 : %2").arg(tr("Retroshare version"), RsApplication::retroshareVersion(true))); #endif /* Draw Qt's version number */ @@ -936,7 +936,7 @@ void AboutWidget::on_copy_button_clicked() { QString verInfo; QString rsVerString = "RetroShare Version: "; - rsVerString+=Rshare::retroshareVersion(true); + rsVerString+=RsApplication::retroshareVersion(true); verInfo+=rsVerString; #ifdef RS_ONLYHIDDENNODE verInfo+=" " + tr("Only Hidden Node"); diff --git a/retroshare-gui/src/gui/FileTransfer/SearchDialog.cpp b/retroshare-gui/src/gui/FileTransfer/SearchDialog.cpp index 33646816a..387b3427a 100644 --- a/retroshare-gui/src/gui/FileTransfer/SearchDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/SearchDialog.cpp @@ -325,7 +325,7 @@ void SearchDialog::checkText(const QString& txt) ui.searchButton->setDisabled(txt.length() < 3); ui.searchLineFrame->setProperty("valid", (txt.length() >= 3)); ui.searchLineFrame->style()->unpolish(ui.searchLineFrame); - Rshare::refreshStyleSheet(ui.searchLineFrame, false); + RsApplication::refreshStyleSheet(ui.searchLineFrame, false); } void SearchDialog::initialiseFileTypeMappings() diff --git a/retroshare-gui/src/gui/GenCertDialog.cpp b/retroshare-gui/src/gui/GenCertDialog.cpp index d3b755f0d..0f318049d 100644 --- a/retroshare-gui/src/gui/GenCertDialog.cpp +++ b/retroshare-gui/src/gui/GenCertDialog.cpp @@ -251,7 +251,7 @@ void GenCertDialog::initKeyList() void GenCertDialog::mouseMoveEvent(QMouseEvent *e) { - std::cerr << "Mouse : " << e->x() << ", " << e->y() << std::endl; + //std::cerr << "Mouse : " << e->x() << ", " << e->y() << std::endl; QDialog::mouseMoveEvent(e) ; } @@ -649,7 +649,7 @@ void GenCertDialog::genPerson() { /* complete the process */ RsInit::LoadPassword(sslPasswd); - if (Rshare::loadCertificate(sslId, false)) { + if (RsApplication::loadCertificate(sslId, false)) { // Normally we should clear the cached passphrase as soon as possible. However,some other GUI components may still need it at start. // (csoler) This is really bad: we have to guess that 30 secs will be enough. I have no better way to do this. diff --git a/retroshare-gui/src/gui/GetStartedDialog.cpp b/retroshare-gui/src/gui/GetStartedDialog.cpp index e3bbd7170..399cc36d7 100644 --- a/retroshare-gui/src/gui/GetStartedDialog.cpp +++ b/retroshare-gui/src/gui/GetStartedDialog.cpp @@ -421,7 +421,7 @@ void GetStartedDialog::emailSupport() sysVersion = "Linux"; #endif #endif - text += QString("My RetroShare Configuration is: (%1, %2, %3)").arg(Rshare::retroshareVersion(true) + text += QString("My RetroShare Configuration is: (%1, %2, %3)").arg(RsApplication::retroshareVersion(true) , sysVersion ).arg(static_cast::type>(userLevel)) + "\n"; text += "\n"; diff --git a/retroshare-gui/src/gui/HelpDialog.cpp b/retroshare-gui/src/gui/HelpDialog.cpp index cc3f1d407..ddaf925d4 100644 --- a/retroshare-gui/src/gui/HelpDialog.cpp +++ b/retroshare-gui/src/gui/HelpDialog.cpp @@ -80,7 +80,7 @@ HelpDialog::HelpDialog(QWidget *parent) : ui->thanks->setHtml(in.readAll()); } - ui->version->setText(Rshare::retroshareVersion(true)); + ui->version->setText(RsApplication::retroshareVersion(true)); /* Add version numbers of libretroshare */ std::list libraries; diff --git a/retroshare-gui/src/gui/Identity/IdEditDialog.cpp b/retroshare-gui/src/gui/Identity/IdEditDialog.cpp index ac9965d2a..7e5544413 100644 --- a/retroshare-gui/src/gui/Identity/IdEditDialog.cpp +++ b/retroshare-gui/src/gui/Identity/IdEditDialog.cpp @@ -703,7 +703,7 @@ void IdEditDialog::updateInterface() const QPixmap *pixmap = ui->avatarLabel->pixmap(); if (pixmap && !pixmap->isNull()) { ui->removeButton->setEnabled(true); - } else if (mEditGroup.mImage.mSize != NULL) { + } else if (mEditGroup.mImage.mSize > 0) { ui->removeButton->setEnabled(true); } else { ui->removeButton->setEnabled(false); diff --git a/retroshare-gui/src/gui/MainWindow.cpp b/retroshare-gui/src/gui/MainWindow.cpp index a35870bd1..b1e4b1e69 100644 --- a/retroshare-gui/src/gui/MainWindow.cpp +++ b/retroshare-gui/src/gui/MainWindow.cpp @@ -32,6 +32,7 @@ #include #include +#include #if defined(Q_OS_DARWIN) #include "gui/common/MacDockIconHandler.h" @@ -211,7 +212,7 @@ MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags flags) hiddenmode = true; } - setWindowTitle(tr("RetroShare %1 a secure decentralized communication platform").arg(Rshare::retroshareVersion(true)) + " - " + nameAndLocation); + setWindowTitle(tr("RetroShare %1 a secure decentralized communication platform").arg(RsApplication::retroshareVersion(true)) + " - " + nameAndLocation); connect(rApp, SIGNAL(newArgsReceived(QStringList)), this, SLOT(receiveNewArgs(QStringList))); /* add url handler for RetroShare links */ @@ -1253,10 +1254,91 @@ void MainWindow::doQuit() rApp->quit(); } +// This method parses arguments passed by the operating system. All arguments +// except -r, -f, -o and lists of rscollection files and rslinks are discarded. +// void MainWindow::receiveNewArgs(QStringList args) { - Rshare::parseArguments(args, false); - processLastArgs(); + RsInfo() << "Received new arguments from operating system call."; + + std::string argstring = RsApplication::applicationFilePath().toStdString() ; + + for(auto l:args) + argstring += " " + l.toStdString(); + + // This class does all the job at once: validate arguments, and parses them. + + std::vector links_and_files; + + argstream as(argstring.c_str()); + + QString omValues = QString(";full;noturtle;gaming;minimal;"); + std::string opModeStr; + std::string retroshare_link_url; + std::string rscollection_file; + + as >> parameter('r',"rslink",retroshare_link_url,"Retroshare:// link","Retroshare link to open in Downloads " ,false) + >> parameter('f',"rsfile",rscollection_file,"file","File to open " ,false) + >> parameter('o',"opmode",opModeStr,"opmode","Set mode (Full, NoTurtle, Gaming, Minimal) " ,false) + >> values(back_inserter(links_and_files),"links and files"); + + if(!as.isOk()) + { + RsErr() << "Error while parsing arguments:" ; + RsErr() << as.errorLog() ; + return; + } + if(!opModeStr.empty() && omValues.contains(";"+QString::fromStdString(opModeStr).toLower()+";")) + { + QString opmode = QString::fromStdString(opModeStr).toLower(); + //RsApplication::setOpMode(opModeStr.toLower()); // Do we need this?? + + RsInfo() << "Setting new operating mode to \"" << opmode.toStdString() << "\""; + + if (opmode == "noturtle") + opModeStatus->setCurrentIndex(static_cast::type>(RsOpMode::NOTURTLE) - 1); + else if (opmode == "gaming") + opModeStatus->setCurrentIndex(static_cast::type>(RsOpMode::GAMING) - 1); + else if (opmode == "minimal") + opModeStatus->setCurrentIndex(static_cast::type>(RsOpMode::MINIMAL) - 1); + else if (opmode != "") + opModeStatus->setCurrentIndex(static_cast::type>(RsOpMode::FULL) - 1); + + opModeStatus->setOpMode(); + } + + // Sort all collected arguments into rscollection files and retroshare links, accordingly + + QStringList rscollection_files; + QList rslinks; + + auto sort = [&](const QString s) { + + if(QFile(s).exists() && s.endsWith(".rscollection")) + rscollection_files.append(QString::fromUtf8(rscollection_file.c_str())); + else if(s.startsWith("retroshare://")) + { + RetroShareLink link(s); + + if(link.valid()) + rslinks.push_back(link); + } + }; + + sort(QString::fromUtf8(rscollection_file.c_str())); + sort(QString::fromUtf8(retroshare_link_url.c_str())); + + for(auto s:links_and_files) + sort(QString::fromUtf8(s.c_str())); + + // Now handle links and rscollection files. + + for(auto file:rscollection_files) + if(file.endsWith(".rscollection")) + openRsCollection(file); + + for(auto link:rslinks) + retroshareLinkActivated(link.toUrl()); } void MainWindow::displayErrorMessage(int /*a*/,int /*b*/,const QString& error_msg) @@ -1623,43 +1705,11 @@ void MainWindow::retroshareLinkActivated(const QUrl &url) void MainWindow::openRsCollection(const QString &filename) { QFileInfo qinfo(filename); + if (qinfo.exists() && qinfo.absoluteFilePath().endsWith(RsCollection::ExtensionString)) RsCollectionDialog::openExistingCollection(qinfo.absoluteFilePath()); } -void MainWindow::processLastArgs() -{ - while (!Rshare::links()->isEmpty()) { - std::cerr << "MainWindow::processLastArgs() : " << Rshare::links()->count() << std::endl; - /* Now use links from the command line, because no RetroShare was running */ - RetroShareLink link(Rshare::links()->takeFirst()); - if (link.valid()) { - retroshareLinkActivated(link.toUrl()); - } - } - while (!Rshare::files()->isEmpty()) { - /* Now use files from the command line, because no RetroShare was running */ - openRsCollection(Rshare::files()->takeFirst()); - } - /* Handle the -opmode options. */ - if (opModeStatus) { - QString opmode = Rshare::opmode().toLower(); - if (opmode == "noturtle") { - opModeStatus->setCurrentIndex(static_cast::type>(RsOpMode::NOTURTLE) - 1); - } else if (opmode == "gaming") { - opModeStatus->setCurrentIndex(static_cast::type>(RsOpMode::GAMING) - 1); - } else if (opmode == "minimal") { - opModeStatus->setCurrentIndex(static_cast::type>(RsOpMode::MINIMAL) - 1); - } else if (opmode != "") { - opModeStatus->setCurrentIndex(static_cast::type>(RsOpMode::FULL) - 1); - } - opModeStatus->setOpMode(); - } else { - std::cerr << "ERR: MainWindow::processLastArgs opModeStatus is not initialized."; - } - -} - void MainWindow::switchVisibilityStatus(StatusElement e,bool b) { switch(e) diff --git a/retroshare-gui/src/gui/MainWindow.h b/retroshare-gui/src/gui/MainWindow.h index 64211d67d..a7f3013f1 100644 --- a/retroshare-gui/src/gui/MainWindow.h +++ b/retroshare-gui/src/gui/MainWindow.h @@ -214,7 +214,6 @@ public slots: void externalLinkActivated(const QUrl &url); void retroshareLinkActivated(const QUrl &url); void openRsCollection(const QString &filename); - void processLastArgs(); //! Go to a specific part of the control panel. void setNewPage(int page); void setCompactStatusMode(bool compact); diff --git a/retroshare-gui/src/gui/PluginManager.cpp b/retroshare-gui/src/gui/PluginManager.cpp index 2b6fa01a6..e5ac7f7d5 100644 --- a/retroshare-gui/src/gui/PluginManager.cpp +++ b/retroshare-gui/src/gui/PluginManager.cpp @@ -41,7 +41,7 @@ PluginManager::PluginManager() { baseFolder = //qApp->applicationDirPath()+"///plugins" ; -Rshare::dataDirectory() + "/plugins" ; +RsApplication::dataDirectory() + "/plugins" ; lastError = "No error."; viewWidget = 0; diff --git a/retroshare-gui/src/gui/StartDialog.cpp b/retroshare-gui/src/gui/StartDialog.cpp index d6f9f707d..bc98527da 100644 --- a/retroshare-gui/src/gui/StartDialog.cpp +++ b/retroshare-gui/src/gui/StartDialog.cpp @@ -123,7 +123,7 @@ void StartDialog::loadPerson() rsNotify->cachePgpPassphrase(ui.password_input->text().toUtf8().constData()) ; rsNotify->setDisableAskPassword(true); - bool res = Rshare::loadCertificate(accountId, ui.autologin_checkbox->isChecked()) ; + bool res = RsApplication::loadCertificate(accountId, ui.autologin_checkbox->isChecked()) ; rsNotify->setDisableAskPassword(false); rsNotify->clearPgpPassphrase(); diff --git a/retroshare-gui/src/gui/common/AvatarWidget.cpp b/retroshare-gui/src/gui/common/AvatarWidget.cpp index e6d6d03d9..02151730a 100644 --- a/retroshare-gui/src/gui/common/AvatarWidget.cpp +++ b/retroshare-gui/src/gui/common/AvatarWidget.cpp @@ -121,7 +121,7 @@ void AvatarWidget::setFrameType(FrameType type) //refreshAvatarImage(); refreshStatus(); - Rshare::refreshStyleSheet(this, false); + RsApplication::refreshStyleSheet(this, false); } void AvatarWidget::setId(const ChatId &id) { @@ -174,7 +174,7 @@ void AvatarWidget::refreshStatus() case NO_FRAME: case NORMAL_FRAME: { - Rshare::refreshStyleSheet(this, false); + RsApplication::refreshStyleSheet(this, false); break; } case STATUS_FRAME: @@ -252,7 +252,7 @@ void AvatarWidget::updateStatus(int status) mPeerState = status; setEnabled(((uint32_t) status == RS_STATUS_OFFLINE) ? false : true); - Rshare::refreshStyleSheet(this, false); + RsApplication::refreshStyleSheet(this, false); } void AvatarWidget::updateAvatar(const QString &peerId) diff --git a/retroshare-gui/src/gui/common/FriendSelectionWidget.cpp b/retroshare-gui/src/gui/common/FriendSelectionWidget.cpp index 2e91ded27..4608d1796 100644 --- a/retroshare-gui/src/gui/common/FriendSelectionWidget.cpp +++ b/retroshare-gui/src/gui/common/FriendSelectionWidget.cpp @@ -127,7 +127,7 @@ FriendSelectionWidget::FriendSelectionWidget(QWidget *parent) ui->filterLineEdit->showFilterIcon(); /* Refresh style to have the correct text color */ - Rshare::refreshStyleSheet(this, false); + RsApplication::refreshStyleSheet(this, false); mEventHandlerId_identities = 0; rsEvents->registerEventsHandler( [this](std::shared_ptr event) { @@ -1225,7 +1225,7 @@ std::string FriendSelectionWidget::idFromItem(QTreeWidgetItem *item) return item->data(COLUMN_DATA, ROLE_ID).toString().toStdString(); } -void FriendSelectionWidget::sortByChecked(bool sort) +void FriendSelectionWidget::sortByChecked(bool) { mCompareRole->clear(); mCompareRole->setRole(COLUMN_NAME,ROLE_SORT_SELECTED); diff --git a/retroshare-gui/src/gui/common/LineEditClear.cpp b/retroshare-gui/src/gui/common/LineEditClear.cpp index c3d68b512..a6ba67bfa 100644 --- a/retroshare-gui/src/gui/common/LineEditClear.cpp +++ b/retroshare-gui/src/gui/common/LineEditClear.cpp @@ -234,8 +234,10 @@ void LineEditClear::setFilterButtonIcon(const QIcon &icon) mFilterButton->setIcon(icon); ensurePolished(); +#if !defined(Q_OS_DARWIN) QFontMetrics fm(this->font()); QSize size(fm.width("___"), fm.height()); mFilterButton->setFixedSize(size); mFilterButton->setIconSize(size); +#endif } diff --git a/retroshare-gui/src/gui/common/NewFriendList.h b/retroshare-gui/src/gui/common/NewFriendList.h index cf2e892b3..2b5cd1738 100644 --- a/retroshare-gui/src/gui/common/NewFriendList.h +++ b/retroshare-gui/src/gui/common/NewFriendList.h @@ -87,7 +87,8 @@ public slots: void setShowGroups(bool show); void setShowUnconnected(bool hidden); void setShowState(bool show); - void headerContextMenuRequested(QPoint); + void headerContextMenuRequested(QPoint); + void exportFriendlistClicked(); private slots: void sortColumn(int col,Qt::SortOrder so); @@ -164,6 +165,5 @@ private slots: void editGroup(); void removeGroup(); - void exportFriendlistClicked(); void importFriendlistClicked(); }; diff --git a/retroshare-gui/src/gui/common/RsCollection.cpp b/retroshare-gui/src/gui/common/RsCollection.cpp index 01d6f7dc1..cbc763024 100644 --- a/retroshare-gui/src/gui/common/RsCollection.cpp +++ b/retroshare-gui/src/gui/common/RsCollection.cpp @@ -367,8 +367,10 @@ RsCollection::RsCollection(const QString& fileName, RsCollectionErrorCode& error return; } - recursParseXml(xml_doc,root,0); - error = RsCollectionErrorCode::NO_ERROR; + if(!recursParseXml(xml_doc,root,0)) + error = RsCollectionErrorCode::XML_PARSING_ERROR; + else + error = RsCollectionErrorCode::NO_ERROR; } // check that the file is a valid rscollection file, and not a lol bomb or some shit like this @@ -672,11 +674,11 @@ void RsCollection::saveColl(std::vector colFileInfos, const QString bool RsCollection::removeFile(RsFileTree::FileIndex index_to_remove,RsFileTree::DirIndex parent_index) { - mFileTree->removeFile(index_to_remove,parent_index); + return mFileTree->removeFile(index_to_remove,parent_index); } bool RsCollection::removeDirectory(RsFileTree::DirIndex index_to_remove,RsFileTree::DirIndex parent_index) { - mFileTree->removeDirectory(index_to_remove,parent_index); + return mFileTree->removeDirectory(index_to_remove,parent_index); } void RsCollection::cleanup() diff --git a/retroshare-gui/src/gui/help/browser/helpbrowser.cpp b/retroshare-gui/src/gui/help/browser/helpbrowser.cpp index b21ba2cc5..f062b908c 100644 --- a/retroshare-gui/src/gui/help/browser/helpbrowser.cpp +++ b/retroshare-gui/src/gui/help/browser/helpbrowser.cpp @@ -117,7 +117,7 @@ HelpBrowser::~HelpBrowser() QString HelpBrowser::language() { - QString lang = Rshare::language(); + QString lang = RsApplication::language(); if (!QDir(":/help/" + lang).exists()) lang = "en"; return lang; diff --git a/retroshare-gui/src/gui/help/browser/helptextbrowser.cpp b/retroshare-gui/src/gui/help/browser/helptextbrowser.cpp index a4b70058f..d9b012775 100644 --- a/retroshare-gui/src/gui/help/browser/helptextbrowser.cpp +++ b/retroshare-gui/src/gui/help/browser/helptextbrowser.cpp @@ -54,7 +54,7 @@ HelpTextBrowser::loadResource(int type, const QUrl &name) /* Fall back to English if there is no translation of the specified help * page in the current language. */ if (!name.path().contains("/")) { - QString language = Rshare::language(); + QString language = RsApplication::language(); if (!QDir(":/help/" + language).exists()) language = "en"; helpPath += language + "/"; diff --git a/retroshare-gui/src/gui/icons/invite64.png b/retroshare-gui/src/gui/icons/invite64.png index 8ab342a7b..f07e0fb4f 100644 Binary files a/retroshare-gui/src/gui/icons/invite64.png and b/retroshare-gui/src/gui/icons/invite64.png differ diff --git a/retroshare-gui/src/gui/icons/png/invite.png b/retroshare-gui/src/gui/icons/png/invite.png index 5fda4753e..7f0baf91b 100644 Binary files a/retroshare-gui/src/gui/icons/png/invite.png and b/retroshare-gui/src/gui/icons/png/invite.png differ diff --git a/retroshare-gui/src/gui/icons/svg/invite.svg b/retroshare-gui/src/gui/icons/svg/invite.svg index afcefbd72..8a25949a8 100644 --- a/retroshare-gui/src/gui/icons/svg/invite.svg +++ b/retroshare-gui/src/gui/icons/svg/invite.svg @@ -2,25 +2,28 @@ image/svg+xml \ No newline at end of file + d="M 64,32 C 64,14.327 49.673,0 32,0 14.327,0 0,14.327 0,32 0,49.673 14.327,64 32,64 49.673,64 64,49.673 64,32" /> diff --git a/retroshare-gui/src/gui/profile/ProfileWidget.cpp b/retroshare-gui/src/gui/profile/ProfileWidget.cpp index cf823ab53..670bb86c7 100644 --- a/retroshare-gui/src/gui/profile/ProfileWidget.cpp +++ b/retroshare-gui/src/gui/profile/ProfileWidget.cpp @@ -45,13 +45,13 @@ ProfileWidget::ProfileWidget(QWidget *parent, Qt::WindowFlags flags) connect(ui.CopyCertButton,SIGNAL(clicked()), this, SLOT(copyCert())); connect(ui.profile_Button,SIGNAL(clicked()), this, SLOT(profilemanager())); - ui.onLineSince->setText(DateTime::formatLongDateTime(Rshare::startupTime())); + ui.onLineSince->setText(DateTime::formatLongDateTime(RsApplication::startupTime())); } void ProfileWidget::showEvent ( QShowEvent * /*event*/ ) { /* set retroshare version */ - ui.version->setText(Rshare::retroshareVersion(true)); + ui.version->setText(RsApplication::retroshareVersion(true)); RsPeerDetails detail; if (rsPeers->getPeerDetails(rsPeers->getOwnId(),detail)) diff --git a/retroshare-gui/src/gui/settings/AppearancePage.cpp b/retroshare-gui/src/gui/settings/AppearancePage.cpp index 8ad086ae9..a96df209d 100755 --- a/retroshare-gui/src/gui/settings/AppearancePage.cpp +++ b/retroshare-gui/src/gui/settings/AppearancePage.cpp @@ -84,7 +84,7 @@ AppearancePage::AppearancePage(QWidget * parent, Qt::WindowFlags flags) } QMap styleSheets; - Rshare::getAvailableStyleSheets(styleSheets); + RsApplication::getAvailableStyleSheets(styleSheets); foreach (QString name, styleSheets.keys()) { ui.cmboStyleSheet->addItem(name, styleSheets[name]); @@ -136,7 +136,7 @@ void AppearancePage::updateInterfaceStyle() #ifndef QT_NO_CURSOR QApplication::setOverrideCursor(Qt::WaitCursor); #endif - Rshare::setStyle(ui.cmboStyle->currentText()); + RsApplication::setStyle(ui.cmboStyle->currentText()); Settings->setInterfaceStyle(ui.cmboStyle->currentText()); #ifndef QT_NO_CURSOR QApplication::restoreOverrideCursor(); @@ -152,7 +152,7 @@ void AppearancePage::loadStyleSheet(int index) #ifndef QT_NO_CURSOR QApplication::setOverrideCursor(Qt::WaitCursor); #endif - Rshare::loadStyleSheet(ui.cmboStyleSheet->itemData(index).toString()); + RsApplication::loadStyleSheet(ui.cmboStyleSheet->itemData(index).toString()); #ifndef QT_NO_CURSOR QApplication::restoreOverrideCursor(); #endif @@ -251,7 +251,7 @@ void AppearancePage::updateCmboToolButtonSize() // NotifyQt::getInstance()->notifySettingsChanged(); // } -void AppearancePage::updateStyle() { Rshare::setStyle(ui.cmboStyle->currentText()); } +void AppearancePage::updateStyle() { RsApplication::setStyle(ui.cmboStyle->currentText()); } /** Loads the settings for this page */ void AppearancePage::load() @@ -259,7 +259,7 @@ void AppearancePage::load() int index = ui.cmboLanguage->findData(Settings->getLanguageCode()); whileBlocking(ui.cmboLanguage)->setCurrentIndex(index); - index = ui.cmboStyle->findData(Rshare::style().toLower()); + index = ui.cmboStyle->findData(RsApplication::style().toLower()); whileBlocking(ui.cmboStyle)->setCurrentIndex(index); index = ui.cmboStyleSheet->findData(Settings->getSheetName()); diff --git a/retroshare-gui/src/gui/settings/CryptoPage.cpp b/retroshare-gui/src/gui/settings/CryptoPage.cpp index 6c171bb1a..296f6aec3 100755 --- a/retroshare-gui/src/gui/settings/CryptoPage.cpp +++ b/retroshare-gui/src/gui/settings/CryptoPage.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include //for rsPeers variable #include //for rsPeers variable @@ -58,15 +59,16 @@ CryptoPage::CryptoPage(QWidget * parent, Qt::WindowFlags flags) // hide profile manager as it causes bugs when generating a new profile. //ui.profile_Button->hide() ; - //connect(ui.exportprofile,SIGNAL(clicked()), this, SLOT(profilemanager())); - connect(ui.exportprofile,SIGNAL(clicked()), this, SLOT(exportProfile())); + //connect(ui.exportprofile,SIGNAL(clicked()), this, SLOT(profilemanager())); + connect(ui.exportprofile,SIGNAL(clicked()), this, SLOT(exportProfile())); + connect(ui.exportfriendslist,SIGNAL(clicked()), this, SLOT(exportFriendsList()) ); // Remove this because it duplicates functionality of the HomePage. ui.retroshareId_LB->hide(); ui.retroshareId_content_LB->hide(); ui.stackPageCertificate->hide(); - ui.onlinesince->setText(DateTime::formatLongDateTime(Rshare::startupTime())); + ui.onlinesince->setText(DateTime::formatLongDateTime(RsApplication::startupTime())); } #ifdef UNUSED_CODE @@ -111,7 +113,7 @@ void CryptoPage::showEvent ( QShowEvent * /*event*/ ) ui.retroshareId_content_LB->setText(QString::fromUtf8(invite.c_str())); /* set retroshare version */ - ui.version->setText(Rshare::retroshareVersion(true)); + ui.version->setText(RsApplication::retroshareVersion(true)); std::list ids; ids.clear(); @@ -229,3 +231,8 @@ void CryptoPage::showStats() { StatisticsWindow::showYourself(); } + +void CryptoPage::exportFriendsList() +{ + NewFriendList().exportFriendlistClicked(); +} diff --git a/retroshare-gui/src/gui/settings/CryptoPage.h b/retroshare-gui/src/gui/settings/CryptoPage.h index e595c63c4..e10cbb97a 100755 --- a/retroshare-gui/src/gui/settings/CryptoPage.h +++ b/retroshare-gui/src/gui/settings/CryptoPage.h @@ -51,6 +51,7 @@ class CryptoPage : public ConfigPage bool fileSave(); bool fileSaveAs(); void showStats(); + void exportFriendsList(); private: QString fileName; diff --git a/retroshare-gui/src/gui/settings/CryptoPage.ui b/retroshare-gui/src/gui/settings/CryptoPage.ui index 29a336721..c0d602368 100755 --- a/retroshare-gui/src/gui/settings/CryptoPage.ui +++ b/retroshare-gui/src/gui/settings/CryptoPage.ui @@ -13,25 +13,11 @@ - + - - - - Retroshare ID: - - - - - - - Statistics: - - - @@ -51,13 +37,6 @@ - - - - PGP fingerprint: - - - @@ -77,99 +56,6 @@ - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - - 75 - true - - - - TextLabel - - - - - - - Export Profile: - - - - - - - - 75 - true - - - - TextLabel - - - - - - - - 0 - 0 - - - - - 75 - true - - - - TextLabel - - - - - - - - 0 - 0 - - - - - 100 - 0 - - - - Online since: - - - @@ -189,184 +75,10 @@ - - - - - - - 16 - 16 - - - - :/images/info16.png - - - - - - - - 12 - 75 - true - - - - Public Information - - - - - - - - - - 0 - 0 - - - - - 75 - true - - + + - TextLabel - - - - - - - <html><head/><body><p>Use this button to export your profile key. You can then import it in a different computer and make a new node with the same profile. Doing so, existing friends that you also add to the new node will automatically recognise that new node as friend.</p></body></html> - - - Export - - - - - - - - 0 - 0 - - - - - 100 - 0 - - - - Software Version: - - - - - - - Show statistics - - - - - - - 6 - - - - - - 16 - 16 - - - - - - - :/images/info16.png - - - - - - - - 12 - 75 - true - - - - Other Information - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Profile path: - - - - - - - - 0 - 0 - - - - - 100 - 0 - - - - Friend nodes: - - - - - - - - 0 - 0 - - - - - 75 - true - - - - TextLabel + Retroshare ID: @@ -407,22 +119,80 @@ - - + + - + 0 0 - - - 100 - 0 - + + + 75 + true + - Name: + TextLabel + + + + + + + PGP fingerprint: + + + + + + + 6 + + + + + + 16 + 16 + + + + + + + :/images/info16.png + + + + + + + + 12 + 75 + true + + + + Other Information + + + + + + + + + Show statistics + + + + + + + Export Profile: @@ -448,8 +218,8 @@ - - + + 0 @@ -463,23 +233,7 @@ - PGP Id : - - - - - - - - 75 - true - - - - TextLabel - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + Friend nodes: @@ -502,6 +256,100 @@ + + + + + 0 + 0 + + + + + 100 + 0 + + + + PGP Id : + + + + + + + <html><head/><body><p>Use this button to export your profile key. You can then import it in a different computer and make a new node with the same profile. Doing so, existing friends that you also add to the new node will automatically recognise that new node as friend.</p></body></html> + + + Export profile + + + + + + + Statistics: + + + + + + + + 0 + 0 + + + + + 75 + true + + + + TextLabel + + + + + + + + 0 + 0 + + + + + 100 + 0 + + + + Online since: + + + + + + + Profile path: + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + @@ -515,6 +363,172 @@ + + + + + 0 + 0 + + + + + 75 + true + + + + TextLabel + + + + + + + + 0 + 0 + + + + + 100 + 0 + + + + Software Version: + + + + + + + + 75 + true + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + 0 + 0 + + + + + 75 + true + + + + TextLabel + + + + + + + + 75 + true + + + + TextLabel + + + + + + + + 0 + 0 + + + + + 100 + 0 + + + + Name: + + + + + + + + + + 16 + 16 + + + + :/images/info16.png + + + + + + + + 12 + 75 + true + + + + Public Information + + + + + + + + + Export Friendslist: + + + + + + + Export friends list + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 40 + 20 + + + + @@ -533,7 +547,7 @@ - + diff --git a/retroshare-gui/src/gui/settings/GeneralPage.ui b/retroshare-gui/src/gui/settings/GeneralPage.ui index ab2863f1c..3eea0544f 100755 --- a/retroshare-gui/src/gui/settings/GeneralPage.ui +++ b/retroshare-gui/src/gui/settings/GeneralPage.ui @@ -146,10 +146,10 @@ - When checked, this instance receives new parameters (like RsLink or RsFile) and avoid new one. + <html><head/><body><p>When checked, this retroshare instance will accept calls by your operating system to open Retroshare collection files, and download links.</p></body></html> - Use Local Server to get new arguments. + Accept operating systems calls true diff --git a/retroshare-gui/src/gui/settings/rsharesettings.cpp b/retroshare-gui/src/gui/settings/rsharesettings.cpp index 28a29300c..e811acd4a 100644 --- a/retroshare-gui/src/gui/settings/rsharesettings.cpp +++ b/retroshare-gui/src/gui/settings/rsharesettings.cpp @@ -910,7 +910,7 @@ void RshareSettings::setUseLocalServer(bool value) { if (value != getUseLocalServer()) { setValue("UseLocalServer", value); - Rshare::updateLocalServer(); + RsApplication::updateLocalServer(); } } diff --git a/retroshare-gui/src/lang/retroshare_de.qm b/retroshare-gui/src/lang/retroshare_de.qm index fc57cf06d..f33befdf9 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 c2a832a1e..b2b9f2ea3 100644 --- a/retroshare-gui/src/lang/retroshare_de.ts +++ b/retroshare-gui/src/lang/retroshare_de.ts @@ -556,7 +556,7 @@ p, li { white-space: pre-wrap; } Warning: The services here are experimental. Please help us test them. But Remember: Any data here *WILL* be lost when we upgrade the protocols. - Warnung: Diese Dienste sind experimentell. Bitte hilf uns sie zu testen. + Warnung: Diese Dienste sind experimentell. Bitte hilf uns sie zu testen. Aber denke daran, dass alle Daten hier VERLOREN gehen werden, wenn wir die Protokolle ändern. @@ -1049,7 +1049,7 @@ Aber denke daran, dass alle Daten hier VERLOREN gehen werden, wenn wir die Proto Comm value - + @@ -1200,7 +1200,7 @@ Aber denke daran, dass alle Daten hier VERLOREN gehen werden, wenn wir die Proto Log scale - + Log skalieren @@ -1337,7 +1337,7 @@ in das Bild hinein, um es für Comm value - + @@ -1415,12 +1415,12 @@ in das Bild hinein, um es für This participant is not active since: - Teilnehmer inaktiv seit: + Teilnehmer inaktiv seit: seconds - Sekunden + Sekunden @@ -2061,7 +2061,7 @@ Double click a chat room to enter and chat. /me is sending a message with /me - + /me sendet eine Nachricht mit /me @@ -2081,17 +2081,17 @@ Double click a chat room to enter and chat. When focus on text browser after showing chat room - + Wenn Sie sich auf den Textbrowser konzentrieren, nachdem Sie den Chatraum angezeigt haben Shrink text edit field when not needed - + Textbearbeitungsfeld verkleinern, wenn es nicht benötigt wird Fonts - + Schriftarten @@ -2101,12 +2101,12 @@ Double click a chat room to enter and chat. If your system is set up correctly, this next square should measure 1 cm. - + Wenn Ihr System richtig eingerichtet ist, sollte dieses nächste Quadrat 1 cm messen. This next square is scaled accordingly to your system font size. - + Dieses nächste Quadrat wird entsprechend der Schriftgröße Ihres Systems skaliert. @@ -2117,7 +2117,7 @@ Double click a chat room to enter and chat. Checked, if the identity and the text above occurrences must be in the same case to trigger count. - + Ãœberprüft, ob die Identität und der Text über den Vorkommen in derselben Groß-/Kleinschreibung vorliegen müssen, um die Zählung auszulösen. @@ -2127,22 +2127,22 @@ Double click a chat room to enter and chat. Default identity for chat rooms: - + Standardidentität für Chatrooms: Count all unread messages - Alle ungelesenen Nachrichten zählen + Alle ungelesenen Nachrichten zählen Count occurrences of my current identity - + Zähle Vorkommen meiner aktuellen Identität Count occurrences of any of the following texts (separate by newlines): - + Zählen Sie das Vorkommen eines der folgenden Texte (getrennt durch Zeilenumbrüche): @@ -2178,17 +2178,17 @@ Double click a chat room to enter and chat. Broadcast - Rundschreiben + Rundschreiben Node-to-node chat - + Knoten-Chat Saved messages (0 = unlimited): - Gespeicherte Nachrichten (0 = unbegrenzt) + Gespeicherte Nachrichten (0 = unbegrenzt): @@ -2198,12 +2198,12 @@ Double click a chat room to enter and chat. Distant chat - + Distant-Chat Maximum storage period, in days (0=keep all): - Maximale Speicherzeit in Tagen (0 = alle behalten) + Maximale Speicherzeit in Tagen (0 = alle behalten): @@ -2661,7 +2661,7 @@ Doppelklicken Sie darauf, um seinen Namen im Textschreiber hinzuzufügen. items found. - Elemente gefunden. + Elemente gefunden. @@ -2707,7 +2707,7 @@ Doppelklicken Sie darauf, um seinen Namen im Textschreiber hinzuzufügen. Showing details: - Detailanzeige: + Detailanzeige: @@ -3563,7 +3563,7 @@ Das Zertifikat hat die falsche Versionsnummer. Beachte, dass v0.6- und v0.5-Netz Network - Netzwerk + Netzwerk @@ -3755,12 +3755,12 @@ p, li { white-space: pre-wrap; } Initial connections can take a while, please be patient - Erstverbindungen können etwas Zeit in Anspruch nehmen. Bitte gedulde dich. + Erstverbindungen können etwas Zeit in Anspruch nehmen. Bitte gedulde dich If an error is detected it will be displayed here - Wenn ein Fehler festgestellt wird, wird er hier angezeigt. + Wenn ein Fehler festgestellt wird, wird er hier angezeigt @@ -3812,7 +3812,7 @@ p, li { white-space: pre-wrap; } DHT Lookup has taken too long - DHT-Suche hat zu lange gedauert. + DHT-Suche hat zu lange gedauert @@ -3822,7 +3822,7 @@ p, li { white-space: pre-wrap; } UDP Connection has taken too long - UDP-Verbindung hat zu lange gedauert. + UDP-Verbindung hat zu lange gedauert @@ -3837,7 +3837,7 @@ p, li { white-space: pre-wrap; } In this case the UDP connection attempt has failed. - In diesem Fall ist der UDP-Verbindungsversuch fehlgeschlagen + In diesem Fall ist der UDP-Verbindungsversuch fehlgeschlagen. @@ -3941,7 +3941,7 @@ p, li { white-space: pre-wrap; } Please contact them to add your Full Certificate - Bitte kontaktiere ihn/sie, damit sie dein vollständiges Zertifikat hinzufügen. + Bitte kontaktiere ihn/sie, damit sie dein vollständiges Zertifikat hinzufügen @@ -3951,7 +3951,7 @@ p, li { white-space: pre-wrap; } They are either offline or their DHT is Off - Er/Sie ist entweder offline oder sein/ihr DHT ist aus. + Er/Sie ist entweder offline oder sein/ihr DHT ist aus @@ -3966,7 +3966,7 @@ p, li { white-space: pre-wrap; } You have previously connected to this Friend - Du warst vorher bereits mit diesem Freund verbunden. + Du warst vorher bereits mit diesem Freund verbunden @@ -4030,7 +4030,7 @@ p, li { white-space: pre-wrap; } Only Advanced Retroshare users should switch off the DHT. - Nur fortgeschrittene RetroShare-Benutzer sollten DHT ausschalten + Nur fortgeschrittene RetroShare-Benutzer sollten DHT ausschalten. @@ -4040,7 +4040,7 @@ p, li { white-space: pre-wrap; } They need a Certificate + Node for UDP connections to succeed - Für eine erfolgreiche UDP-Verbindung benötigen sie ein Zertifikat und einen Netzknoten. + Für eine erfolgreiche UDP-Verbindung benötigen sie ein Zertifikat und einen Netzknoten @@ -4061,12 +4061,12 @@ p, li { white-space: pre-wrap; } <html><head/><body><p>The circle name, contact author and invited member list will be visible to all invited members. If the circle is not private, it will also be visible to neighbor nodes of the nodes who host the invited members.</p></body></html> - + <html><head/><body><p>Der Kreisname, der Kontaktautor und die Liste der eingeladenen Mitglieder sind für alle eingeladenen Mitglieder sichtbar. Wenn der Kreis nicht privat ist, ist er auch für Nachbarknoten der Knoten sichtbar, die die eingeladenen Mitglieder hosten.</p></body></html> <html><head/><body><p>The creator of a circle is purely optional. It is however useful for public circles so that people know with whom to discuss membership aspects.</p></body></html> - + <html><head/><body><p>Der Ersteller eines Kreises ist rein optional. Es ist jedoch für öffentliche Kreise nützlich, damit die Leute wissen, mit wem sie Mitgliedschaftsaspekte besprechen können.</p></body></html> @@ -4117,7 +4117,7 @@ p, li { white-space: pre-wrap; } <html><head/><body><p>Members of this list will be automatically proposed to join the circle (by accepting membership). They will</p><p>not receive data that is restricted to this circle until they do so.</p></body></html> - + <html><head/><body><p>Mitglieder dieser Liste werden automatisch für den Beitritt zum Kreis vorgeschlagen (durch Annahme der Mitgliedschaft). Sie erhalten</p><p>keine Daten, die auf diesen Kreis beschränkt sind, bis sie dies tun.</p></body></html> @@ -4152,7 +4152,7 @@ p, li { white-space: pre-wrap; } <html><head/><body><p>Private (a.k.a. self-restricted) circles are only visible to the invited members of these circles. In practice the circle uses its own list of invited members to limit its own distribution. </p></body></html> - + <html><head/><body><p>Private (auch bekannt als selbstbeschränkte) Kreise sind nur für die eingeladenen Mitglieder dieser Kreise sichtbar. In der Praxis verwendet der Kreis seine eigene Liste eingeladener Mitglieder, um seine eigene Verteilung einzuschränken. </p></body></html> @@ -4162,7 +4162,7 @@ p, li { white-space: pre-wrap; } <html><head/><body><p>Circles can be restricted to the members of another circle. Only the members of that second circle will be allowed to see the new circle and its content (list of members, etc).</p></body></html> - + <html><head/><body><p>Kreise können auf die Mitglieder eines anderen Kreises beschränkt werden. Nur die Mitglieder dieses zweiten Kreises dürfen den neuen Kreis und seinen Inhalt (Liste der Mitglieder usw.) sehen.</p></body></html> @@ -4189,19 +4189,21 @@ p, li { white-space: pre-wrap; } Circle created - + Kreis erstellt Your new circle has been created: Name: %1 Id: %2. - + Ihr neuer Kreis wurde erstellt: + Name: %1 + ID: %2. [Unknown] - [Unbekannt] + [Unbekannt] @@ -4238,7 +4240,7 @@ p, li { white-space: pre-wrap; } [Anonymous Id] - + [Anonymous ID] @@ -4613,7 +4615,7 @@ p, li { white-space: pre-wrap; } p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8.25pt;"><br /></p></body></html> - + @@ -4885,7 +4887,7 @@ Möchten Sie diese Nachricht verwerfen? Statistics: - + Statistiken: @@ -4900,7 +4902,7 @@ Möchten Sie diese Nachricht verwerfen? Show statistics - + Zeige Statistiken @@ -4910,17 +4912,17 @@ Möchten Sie diese Nachricht verwerfen? Profile path: - + Profilpfad: Profile - Profil + Profil <html><head/><body><p>This option includes all signatures of your profile key. Signatures are not mandatory, but only a way to express your trust in some particular profile.</p></body></html> - + <html><head/><body><p>Diese Option umfasst alle Signaturen Ihres Profilschlüssels. Unterschriften sind nicht zwingend erforderlich, sondern nur eine Möglichkeit, Ihr Vertrauen in ein bestimmtes Profil auszudrücken.</p></body></html> @@ -4930,17 +4932,17 @@ Möchten Sie diese Nachricht verwerfen? Export Identity - Identität exportieren + Identität exportieren RetroShare Identity files (*.asc) - RetroShare-Identitätsdateien (*.asc) + RetroShare-Identitätsdateien (*.asc) Identity saved - Identität gespeichert + Identität gespeichert @@ -4949,7 +4951,7 @@ It is encrypted You can now copy it to another computer and use the import button to load it - Deine Identität wurde erfolgreich gespeichert + Deine Identität wurde erfolgreich gespeichert Sie ist verschlüsselt Du kannst die Identität nun auf einen anderen Computer kopieren @@ -4958,12 +4960,12 @@ und den Import zum Laden verwenden Identity not saved - Identität nicht gespeichert + Identität nicht gespeichert Your identity was not saved. An error occurred. - Deine Identität wurde nicht gespeichert. Ein Fehler ist aufgetreten. + Deine Identität wurde nicht gespeichert. Ein Fehler ist aufgetreten. @@ -5010,7 +5012,7 @@ und den Import zum Laden verwenden PGP fingerprint: - PGP-Fingerabdruck + PGP-Fingerabdruck: @@ -5035,17 +5037,17 @@ und den Import zum Laden verwenden Short format - + Kurzformat <html><head/><body><p>IP history is the list of IP you used accross time. Including this might help your friends reach you. This is optional for privacy reasons.</p></body></html> - + <html><head/><body><p>Der IP-Verlauf ist die Liste der IP-Adressen, die Sie im Laufe der Zeit verwendet haben. Wenn Sie dies hinzufügen, können Ihre Freunde Sie möglicherweise leichter erreichen. Dies ist aus Datenschutzgründen optional.</p></body></html> Include IP history - IP-Verlauf einbeziehen + IP-Verlauf einbeziehen @@ -5055,7 +5057,7 @@ und den Import zum Laden verwenden <html><head/><body><p>Saves your profile key pair into a file. This allows you to create a new node for the same profile, by importing this key pair on a different computer. Friends who already accept connections from you will automatically accept connections from that new node after you add them yourself. Your key is exported encrypted and you will need your login password to create a new profile.</p></body></html> - + <html><head/><body><p>Speichert Ihr Profilschlüsselpaar in einer Datei. Dadurch können Sie einen neuen Knoten für dasselbe Profil erstellen, indem Sie dieses Schlüsselpaar auf einem anderen Computer importieren. Freunde, die bereits Verbindungen von Ihnen akzeptieren, akzeptieren automatisch Verbindungen von diesem neuen Knoten, nachdem Sie sie selbst hinzugefügt haben. Ihr Schlüssel wird verschlüsselt exportiert und Sie benötigen Ihr Login-Passwort, um ein neues Profil zu erstellen.</p></body></html> @@ -5462,17 +5464,17 @@ und den Import zum Laden verwenden UPNP FORWARD - UPNP WEITERLEIT. + UPNP WEITERLEITUNG NATPMP FORWARD - NATPMP WEITERLEIT. + NATPMP WEITERLEITUNG MANUAL FORWARD - MANUELLE WEITERLEIT. + MANUELLE WEITERLEITUNG @@ -5633,7 +5635,7 @@ und den Import zum Laden verwenden %1 secs ago - vor %1 Sek. + vor %1 Sekunden @@ -5643,7 +5645,7 @@ und den Import zum Laden verwenden Relays - + Relais @@ -5883,7 +5885,7 @@ und den Import zum Laden verwenden Friend Help - Freunde-Hilfe + Freunde-Hilfe @@ -6126,12 +6128,12 @@ und den Import zum Laden verwenden Column %1 - + Spalte %1 Row %1 - + Zeile %1 @@ -6197,7 +6199,7 @@ und den Import zum Laden verwenden Friends - Freunde + Freunde @@ -6208,7 +6210,7 @@ und den Import zum Laden verwenden ID - + @@ -6292,7 +6294,7 @@ und den Import zum Laden verwenden Search ID - Kennung suchen + Kennung suchen @@ -6401,25 +6403,25 @@ und den Import zum Laden verwenden at least one peer was not added - + Mindestens ein Peer wurde nicht hinzugefügt at least one peer was not added to a group - + Mindestens ein Peer wurde nicht zu einer Gruppe hinzugefügt Select file for importing your friendlist from - Wählen Sie die Datei aus, aus der Sie Ihre Freundesliste importieren möchten + Wählen Sie die Datei aus, aus der Sie Ihre Freundesliste importieren möchten Select a file for exporting your friendlist to - Wählen Sie eine Datei aus, in die Sie Ihre Freundesliste exportieren möchten + Wählen Sie eine Datei aus, in die Sie Ihre Freundesliste exportieren möchten @@ -6450,7 +6452,7 @@ Mindestens ein Peer wurde nicht zu einer Gruppe hinzugefügt Show Items - + Elemente anzeigen @@ -6523,12 +6525,12 @@ Mindestens ein Peer wurde nicht zu einer Gruppe hinzugefügt Please select at least one friend for recommendation. - Bitte mindestens einen Freund als Empfehlung wählen. + Bitte mindestens einen Freund als Empfehlung wählen. Please select at least one friend as recipient. - Bitte mindestens einen Empfänger wählen. + Bitte mindestens einen Empfänger wählen. @@ -6538,7 +6540,7 @@ Mindestens ein Peer wurde nicht zu einer Gruppe hinzugefügt A recommendation message was sent to each of the chosen friends! - + An jeden der ausgewählten Freunde wurde eine Empfehlungsnachricht gesendet! @@ -6857,7 +6859,7 @@ Also check your ports! I2P instance address with SAMv3 enabled - + I2P-Instanzadresse mit aktiviertem SAMv3 @@ -6867,7 +6869,7 @@ Also check your ports! Passwords do not match - Passwörter stimmen nicht überein. + Passwörter stimmen nicht überein @@ -6904,12 +6906,12 @@ Also check your ports! <html><head/><body><p>Put a strong password here. This password protects your private node key!</p></body></html> - + <html><head/><body><p>Geben Sie hier ein sicheres Passwort ein. Dieses Passwort schützt Ihren privaten Knotenschlüssel!</p></body></html> <html><head/><body><p>Please move your mouse around in order to collect as much randomness as possible. A minimum of 20% is needed to create your node keys.</p></body></html> - + <html><head/><body><p>Bitte bewegen Sie Ihre Maus, um so viel Zufälligkeit wie möglich zu sammeln. Zum Erstellen Ihrer Knotenschlüssel sind mindestens 20 % erforderlich.</p></body></html> @@ -6919,7 +6921,7 @@ Also check your ports! <html><head/><body><p>Your node name designates the Retroshare instance that</p><p>will run on this computer.</p></body></html> - + <html><head/><body><p>Ihr Knotenname bezeichnet die Retroshare-Instanz, die</p><p>auf diesem Computer ausgeführt wird.</p></body></html> @@ -6929,17 +6931,17 @@ Also check your ports! Node type: - + Knotentyp: Hidden node (over Tor) - + Hidden Knoten (über Tor) Hidden node (Tor/I2P - Manually configured) - + Hidden Knoten (Tor/I2P – manuell konfiguriert) @@ -6949,7 +6951,7 @@ Also check your ports! <html><head/><body><p>The profile name identifies you over the network.</p><p>It is used by your friends to accept connections from you.</p><p>You can create multiple Retroshare nodes with the</p><p>same profile on different computers.</p><p><br/></p></body></html> - + <html><head/><body><p>Der Profilname identifiziert Sie über das Netzwerk.</p><p>Er wird von Ihren Freunden verwendet, um Verbindungen von Ihnen anzunehmen.</p><p>Das können Sie Erstellen Sie mehrere Retroshare-Knoten mit demselben Profil auf verschiedenen Computern.</p><p><br/></p></body></html> @@ -6974,7 +6976,7 @@ Also check your ports! <html><head/><body><p>Identities are used when you write in chat rooms, forums and channel comments. </p><p>They also receive/send email over the Retroshare network. You can create</p><p>a signed identity now, or do it later on when you get to need it.</p></body></html> - + <html><head/><body><p>Identitäten werden verwendet, wenn Sie in Chatrooms, Foren und Kanalkommentaren schreiben. </p><p>Sie empfangen/senden auch E-Mails über das Retroshare-Netzwerk. Sie können</p><p>eine signierte Identität jetzt erstellen oder dies später tun, wenn Sie sie benötigen.</p></body></html> @@ -6985,7 +6987,7 @@ Also check your ports! TextLabel - TextLabel + TextLabel @@ -7129,7 +7131,7 @@ und den Import zum Laden verwenden RetroShare profile files (*.asc);;All files (*) - + RetroShare-Profildateien (*.asc);;Alle Dateien (*) @@ -7250,17 +7252,17 @@ und den Import zum Laden verwenden When checked, this instance receives new parameters (like RsLink or RsFile) and avoid new one. - + Wenn diese Instanz geprüft wird, erhält sie neue Parameter (wie RsLink oder RsFile) und vermeidet neue Parameter. Use Local Server to get new arguments. - + Verwenden Sie Local Server, um neue Argumente zu erhalten. <html><head/><body><p>Install RetroShare with a package installer to get</p><p>/usr/share/applications/retroshare.desktop</p></body></html> - + <html><head/><body><p>Installieren Sie RetroShare mit einem Paket-Installer, um</p><p>/usr/share/applications/retroshare.desktop</p></body></html> @@ -7280,32 +7282,32 @@ und den Import zum Laden verwenden seconds - Sekunden + Sekunden You have sufficient rights. - + Sie haben genügend Rechte. You don't have sufficient rights. Run RetroShare as Admin to change this setting. - + Sie haben nicht genügend Rechte. Führen Sie RetroShare als Administrator aus, um diese Einstellung zu ändern. For security reasons the usage of auto-login is discouraged, you can enable it but you are on your own! - + Aus Sicherheitsgründen wird von der Verwendung der automatischen Anmeldung abgeraten, Sie können sie zwar aktivieren, sind aber auf sich allein gestellt! Your RetroShare build has auto-login disabled. - + In Ihrem RetroShare-Programm ist die automatische Anmeldung deaktiviert. No Qt-compatible system tray was found on this system. - + Auf diesem System wurde kein Qt-kompatibler Systemtray gefunden. @@ -7610,7 +7612,7 @@ p, li { white-space: pre-wrap; } Branching factor - + Verzweigungsfaktor @@ -7705,72 +7707,72 @@ p, li { white-space: pre-wrap; } Directory content is visible to friend nodes (see list at right) - + Der Inhalt des Verzeichnisses ist für Freundesknoten sichtbar (siehe Liste rechts) Directory content is NOT visible to friend nodes - + Der Verzeichnisinhalt ist für Freundesknoten NICHT sichtbar Directory can be searched anonymously - + Das Verzeichnis kann anonym durchsucht werden Directory cannot be searched anonymously - + Das Verzeichnis kann nicht anonym durchsucht werden Files can be accessed using anonymous tunnels - + Auf Dateien kann über anonyme Tunnel zugegriffen werden Files can be accessed using anonymous & end-to-end encrypted tunnels - + Auf Dateien kann über anonyme und Ende-zu-Ende-verschlüsselte Tunnel zugegriffen werden Files cannot be downloaded anonymously - + Dateien können nicht anonym heruntergeladen werden All friend nodes can see this directory - + Alle Freundesknoten können dieses Verzeichnis sehen Only visible to friend nodes in groups: %1 - + Nur für Freundesknoten in Gruppen sichtbar: %1 Not visible to friend nodes - + Für Freundesknoten nicht sichtbar Files can be downloaded (but not searched) anonymously - + Dateien können anonym heruntergeladen (aber nicht durchsucht) werden Files can be downloaded and searched anonymously - + Dateien können anonym heruntergeladen und durchsucht werden Files can be searched (but not downloaded) anonymously - + Dateien können anonym durchsucht (aber nicht heruntergeladen) werden No one can anonymously access/search these files. - + Niemand kann anonym auf diese Dateien zugreifen bzw. diese durchsuchen. @@ -8032,37 +8034,37 @@ p, li { white-space: pre-wrap; } Authenticated tunnels: - Authentifizierte Tunnel: + Authentifizierte Tunnel: Tunnel ID: %1 - Tunnelkennung: %1 + Tunnelkennung: %1 from: %1 (%2) - + von: %1 (%2) to: %1 (%2) - + an: %1 (%2) status: %1 - Status: %1 + Status: %1 total sent: %1 bytes - Gesendet gesamt: %1 bytes + Gesendet gesamt: %1 bytes total recv: %1 bytes - Empfangen gesamt: %1 bytes + Empfangen gesamt: %1 bytes @@ -8156,7 +8158,7 @@ p, li { white-space: pre-wrap; } Play - Abspielen + Abspielen @@ -8166,7 +8168,7 @@ p, li { white-space: pre-wrap; } Open file - + Datei öffnen @@ -8201,12 +8203,12 @@ p, li { white-space: pre-wrap; } Play File - Datei abspielen + Datei abspielen File %1 does not exist at location. - Datei %1 existiert nicht. + Datei %1 existiert nicht. @@ -8252,27 +8254,27 @@ p, li { white-space: pre-wrap; } Last activity - Letzte Aktivität + Letzte Aktivität TextLabel - TextLabel + TextLabel Subscribe this Channel - + Diesen Kanal abonnieren Subscribe - Abonnieren + Abonnieren Copy RetroShare Link - RetroShare-Link kopieren + RetroShare-Link kopieren @@ -8298,17 +8300,17 @@ p, li { white-space: pre-wrap; } Publish permission received for channel: - + Veröffentlichungserlaubnis für Kanal erhalten: New Channel: - + Neuer Kanal: Never - Nie + Nie @@ -8468,34 +8470,34 @@ p, li { white-space: pre-wrap; } Post to Channel - In Kanal veröffentlichen + In Kanal veröffentlichen Add new post - + Beitrag erstellen ... - ... + ... Search channels - Kanäle durchsuchen + Kanäle durchsuchen Channel details - + Kanal-Details Channel title - + Kanal-Titel @@ -8503,18 +8505,18 @@ p, li { white-space: pre-wrap; } TextLabel - TextLabel + TextLabel Distribution: - Verteilung: + Verteilung: <html><head/><body><p>Includes all posts, comments and votes. This number is progressively updated when new friend connect. The local vs. at friends difference may indicate that you would get older posts by increasing the synchronization period.</p></body></html> - + <html><head/><body><p>Enthält alle Beiträge, Kommentare und Abstimmungen. Diese Zahl @@ -8522,307 +8524,307 @@ p, li { white-space: pre-wrap; } unknown - unbekannt + unbekannt <html><head/><body><p>This includes posts, comments to posts and votes to comments.</p></body></html> - + <html><head/><body><p>Dies umfasst Beiträge, Kommentare zu Beiträgen und Stimmen zu Kommentaren.</p></body></html> Last activity: - Letzte Aktivität: + Letzte Aktivität: Administrator: - Administrator: + Administrator: Items (locally / at friends): - + Artikel (vor Ort / bei Freunden): Created: - + Erstellt: Sync period: - + Sync-Zeitraum: Posts - Beiträge + Beiträge <html><head/><body><p>Click to view post. </p><p>Use Ctrl+mouse wheel </p><p>to zoom/unzoom.</p></body></html> - + <html><head/><body><p>Klicken Sie, um den Beitrag zu sehen. </p><p>Verwenden Sie Strg+Mausrad</p><p>zum Zoomen/Entzoomen.</p></body></html> Details - Details + Details Files - Dateien + Dateien Comments - Kommentare + Kommentare All files - + Alle Dateien Feeds - Feeds + Feeds Click to switch to list view - + Klicken Sie, um zur Listenansicht zu wechseln Show unread posts only - + Nur ungelesene Beiträge anzeigen No files in this post, or no post selected - + Keine Dateien in diesem Beitrag, oder kein Beitrag ausgewählt No files in the channel, or no channel selected - + Keine Dateien im Kanal, oder kein Kanal ausgewählt No text to display - + Kein Text zum Anzeigen Search... - + Suchen... No posts available in this channel - + Keine Beiträge in diesem Kanal vorhanden Switch to list view - + Zur Listenansicht wechseln Switch to grid view - + Zur Gitteransicht wechseln Download files - + Dateien herunterladen Mark as unread - Als ungelesen markieren + Als ungelesen markieren Copy RetroShare Link - RetroShare-Link kopieren + RetroShare-Link kopieren Edit - Bearbeiten + Bearbeiten Click to switch to grid view - + Klicken, um zur Rasteransicht zu wechseln Link creation error - + Fehler bei der Link-Erstellung Link could not be created: - + Link konnte nicht erstellt werden: Download this file: - + Diese Datei herunterladen: Download All these %1 files: - + Alle diese %1-Dateien herunterladen: Totaling: %1 - + Gesamtwert: %1 Comments (%1) - + Kommentare (%1) Loading... - Lade... + Lade... No posts available in this channel. - + Keine Beiträge in diesem Kanal vorhanden. [No name] - + [Kein Name] Never - Nie + Nie 5 days - 5 Tage + 5 Tage 2 weeks - 2 Wochen + 2 Wochen 1 month - 1 Monat + 1 Monat 3 months - + 3 Monate 6 months - + 6 Monate 1 year - 1 Jahr + 1 Jahr indefinitly - + Unbegrenzt Unknown - Unbekannt + Unbekannt Public - Öffentlich + Öffentlich Restricted to members of circle " - Beschränkt auf Mitglieder des Kreises " + Beschränkt auf Mitglieder des Kreises " Restricted to members of circle - Beschränkt auf Mitglieder des Kreises + Beschränkt auf Mitglieder des Kreises Your eyes only - Nur Ihre Augen + Nurfür Ihre Augen You and your friend nodes - + Du und deine Freundschaftsknoten Copy Retroshare link - + RetroShare-Link kopieren Subscribed - Abonniert + Abonniert Subscribe - Abonnieren + Abonnieren Channel info missing - + Kanalinformationen fehlen To subscribe, first request the channel information by right-clicking Request Data in the search results. - + Um sich zu abonnieren, fordern Sie zunächst die Kanalinformationen an, indem Sie in den Suchergebnissen mit der rechten Maustaste auf Daten anfordern klicken. Channel info requested... - + Kanalinformationen angefordert... No Channel Selected - Keinen Kanal gewählt + Kein Kanal ausgewählt Disable Auto-Download - Auto-Download deaktivieren + Auto-Download deaktivieren Enable Auto-Download - Auto-Download aktivieren + Auto-Download aktivieren @@ -8838,124 +8840,124 @@ p, li { white-space: pre-wrap; } TextLabel - TextLabel + TextLabel Circle name: - + Kreisname: Accept - Akzeptieren + Akzeptieren Revoke - + Widerrufen Details - Details + Details Remove Item - + Eintrag entfernen Grant membership request - + Mitgliedschaftsantrag gewähren Revoke membership - + Mitgliedschaft widerrufen You received a membership request a circle you're administrating: - + Sie haben einen Antrag auf Mitgliedschaft in einem von Ihnen verwalteten Kreis erhalten: Grant membership - Mitgliedschaft gewähren + Mitgliedschaft gewähren Grant membership to this circle, for this identity - + Gewährung der Mitgliedschaft in diesem Kreis, für diese Identität You received an invitation to join this circle: - + Sie haben eine Einladung erhalten, diesem Kreis beizutreten: Accept invitation - + Einladung annehmen has left this circle. - + hat diesen Kreis verlassen. which you invited, has joined this circle you're administrating. - + die Sie eingeladen haben, ist zu diesem Kreis beigetreten, den Sie verwalten. Revoke membership for that identity - + Entzug der Mitgliedschaft für diese Identität has joined this circle. - + ist diesem Kreis beigetreten. Your identity %1 has been revoked from this circle. - + Ihre Identität %1 wurde aus diesem Kreis entfernt. Cancel membership request - + Mitgliedsantrag stornieren Cancel your membership request from that circle - + Ihren Mitgliedschaftsantrag aus diesem Kreis stornieren Your identity %1 as been accepted in this circle. - + Ihre Identität %1 wurde in diesem Kreis akzeptiert. Cancel membership - + Mitgliedschaft kündigen Cancel your membership from that circle - + Ihre Mitgliedschaft in diesem Kreis kündigen Received event from unknown Circle: - + Ereignis von unbekanntem Kreis erhalten: @@ -8976,12 +8978,12 @@ p, li { white-space: pre-wrap; } <html><head/><body><p><span style=" font-family:'-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'; font-size:14px; color:#24292e; background-color:#ffffff;">sort by</span></p></body></html> - + <html><head/><body><p><span style=" font-family:'-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'; font-size:14px; color:#24292e; background-color:#ffffff;">sortieren nach</span></p></body></html> Hot - Heiß + Hot @@ -8996,7 +8998,7 @@ p, li { white-space: pre-wrap; } Voter ID: - Wähler-ID + Wähler-ID: @@ -9055,7 +9057,7 @@ p, li { white-space: pre-wrap; } Copy Comment - + Kommentar kopieren @@ -9070,17 +9072,17 @@ p, li { white-space: pre-wrap; } Show Author - + Autor anzeigen Cannot vote - + Kann nicht abstimmen Error while voting: - + Fehler bei der Abstimmung: @@ -9097,47 +9099,51 @@ p, li { white-space: pre-wrap; } p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <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:12pt; font-weight:600;">Compose new Comment</span></p></body></html> - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<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:12pt; font-weight:600;">Neuen Kommentar verfassen</span></p></body></html> Type in your comment - + Geben Sie Ihren Kommentar ein Cancel - Abbrechen + Abbrechen TextLabel - TextLabel + TextLabel Post as: - + Posten als: Post - Posten + Posten Reply to Comment - Auf Kommentar antworten + Auf Kommentar antworten Replying to - + Antwort auf Type your reply - + Geben Sie Ihre Antwort ein @@ -9149,17 +9155,17 @@ p, li { white-space: pre-wrap; } You need to create an Identity before you can comment Du musst eine Identität erstellen, -bevor du kommentieren kannst. +bevor du kommentieren kannst It remains %1 characters after HTML conversion. - Es verbleiben %1 Zeichen nach der HTML-Konvertierung. + Es verbleiben %1 Zeichen nach der HTML-Konvertierung. Warning: This message is too big of %1 characters after HTML conversion. - Warnung: Diese Nachricht ist mit %1 Zeichen zu groß nach der HTML-Konvertierung. + Warnung: Diese Nachricht ist mit %1 Zeichen zu groß nach der HTML-Konvertierung. @@ -9167,7 +9173,7 @@ bevor du kommentieren kannst. <p>Put one of your identities here to allow others to send feedback and also have moderator rights on the forum. You may as well leave that field blank and keep the forum anonymously administrated.</p> - + <p>Geben Sie hier eine Ihrer Identitäten ein, damit andere Feedback senden können und auch über Moderatorrechte im Forum verfügen. Sie können dieses Feld auch leer lassen und das Forum anonym verwalten.</p> @@ -9192,7 +9198,7 @@ bevor du kommentieren kannst. Forum moderators can edit/delete/pinup others posts - + Forummoderatoren können Beiträge bearbeiten, löschen oder anheften @@ -9210,12 +9216,12 @@ bevor du kommentieren kannst. Subscribe - Abonnieren + Abonnieren Copy RetroShare link - + RetroShare-Link kopieren @@ -9236,27 +9242,27 @@ bevor du kommentieren kannst. Moderator list - + Moderatorenliste TextLabel - TextLabel + TextLabel Loading... - Lade... + Lade... Moderator list changed - + Moderatorenliste geändert Forum updated - + Forum aktualisiert @@ -9275,7 +9281,7 @@ bevor du kommentieren kannst. Subject: - Betreff: + Betreff: @@ -9306,7 +9312,7 @@ bevor du kommentieren kannst. In Reply to: - Als Antwort auf: + Als Antwort auf: @@ -9366,7 +9372,7 @@ bevor du kommentieren kannst. New Thread - Neues Thema + Neues Thema @@ -9418,7 +9424,7 @@ bevor du kommentieren kannst. Next unread message - + Nächste ungelesene Nachricht @@ -9459,7 +9465,7 @@ bevor du kommentieren kannst. Loading... - Lade... + Lade... @@ -9527,7 +9533,7 @@ bevor du kommentieren kannst. Only friends nodes in group - + Nur Freundesknoten in der Gruppe @@ -9543,7 +9549,7 @@ bevor du kommentieren kannst. Owner - + Eigentümer @@ -9626,7 +9632,7 @@ bevor du kommentieren kannst. Edit - Bearbeiten + Bearbeiten @@ -9687,7 +9693,7 @@ bevor du kommentieren kannst. Show column - + Spalte anzeigen @@ -9702,7 +9708,7 @@ bevor du kommentieren kannst. <b>Loading...<b> - + <b>Lade...<b> @@ -9743,53 +9749,54 @@ bevor du kommentieren kannst. Last seen at friends: - + Zuletzt bei Freunden gesehen: Moderators - + Moderatoren Missing Message: This message is missing. You should receive it later. - + Fehlende Nachricht: +Diese Nachricht fehlt. Sie sollten es später erhalten. No result. - Kein Ergebnis. + Kein Ergebnis. Found %1 results. - %1 Ergebnisse gefunden. + %1 Ergebnisse gefunden. Failed to retrieve this message. Is the database currently overloaded? - + Diese Nachricht konnte nicht abgerufen werden. Ist die Datenbank derzeit überlastet? No data for this message. Is the database corrupted? - + Keine Daten für diese Nachricht. Ist die Datenbank beschädigt? More than one entry for this message. Is the database corrupted? - + Mehr als ein Eintrag für diese Nachricht. Ist die Datenbank beschädigt? (Latest) - + (Neueste) (Old) - + (Alt) @@ -9987,7 +9994,7 @@ This message is missing. You should receive it later. TextLabel - TextLabel + TextLabel @@ -10002,12 +10009,12 @@ This message is missing. You should receive it later. All People - + Alle Leute My Contacts - + Meine Kontakte @@ -10023,7 +10030,7 @@ This message is missing. You should receive it later. Limited to your friends - + Beschränkt auf deine Freunde @@ -10056,13 +10063,13 @@ This message is missing. You should receive it later. Only friends nodes in group - + Nur Freundesknoten in der Gruppe Failed to Prepare Group MetaData: - + Gruppenmetadaten konnten nicht vorbereitet werden: @@ -10078,7 +10085,7 @@ This message is missing. You should receive it later. [None] - [Keine] + [Keine] @@ -10118,12 +10125,12 @@ This message is missing. You should receive it later. <html><head/><body><p>Messages will spread way beyond your friend nodes, as long as people subscribe to the channel/forum/posted you're creating.</p></body></html> - + <html><head/><body><p>Nachrichten werden weit über Ihre Freundesknoten hinaus verbreitet, solange die Leute den Kanal/das Forum/den von Ihnen erstellten Beitrag abonnieren.</p></body></html > <html><head/><body><p>Messages will spread among Retroshare nodes that host one of the identities listed as member of the circle and who also subscribe the media. Only these nodes will be able to see that this forum/channel/posted media exists. </p></body></html> - + <html><head/><body><p>Nachrichten werden an Retroshare-Knoten verteilt, die eine der als Mitglied des Kreises aufgeführten Identitäten hosten und auch die Medien abonnieren. Nur diese Knoten können sehen, dass dieses Forum/dieser Kanal/dieses gepostete Medium existiert. </p></body></html> @@ -10133,12 +10140,12 @@ This message is missing. You should receive it later. <html><head/><body><p>Messages will only be distributed to the selected subset of your friend nodes. They will not forward messages with each other, but only use your own node as a central hub to distribute them.</p></body></html> - + <html><head/><body><p>Nachrichten werden nur an die ausgewählte Teilmenge Ihrer Freundesknoten verteilt. Sie leiten Nachrichten nicht untereinander weiter, sondern nutzen nur Ihren eigenen Knoten als zentralen Hub, um sie zu verteilen.</p></body></html> Restricted node group - + Auf Knotengruppe @@ -10148,27 +10155,27 @@ This message is missing. You should receive it later. <html><head/><body><p>Click to add a Logo</p></body></html> - + <html><head/><body><p>Hier klicken, um ein Logo hinzuzufügen</p></body></html> <html><head/><body><p>The identity here can be used to send feedback.</p></body></html> - + <html><head/><body><p>Die Identität hier kann zum Senden von Feedback verwendet werden.</p></body></html> Add moderators - + Moderatoren hinzufügen Re&quired - + Erforderlich Encrypted &Msgs - + Verschlüsselte &Nachrichten @@ -10193,7 +10200,7 @@ This message is missing. You should receive it later. Author: - Autor: + Autor: @@ -10209,22 +10216,22 @@ This message is missing. You should receive it later. Moderators: - + Moderatoren: Created - Erstellt + Erstellt Cancel - Abbrechen + Abbrechen Create - Erstellen + Erstellen @@ -10272,17 +10279,17 @@ This message is missing. You should receive it later. Remove this search - + Entfernen Sie diese Suche Remove all searches - + Alle Suchanfragen entfernen Request data - + Daten anfordern @@ -10297,7 +10304,7 @@ This message is missing. You should receive it later. Synchronise posts of last... - + Synchronisieren Sie die Beiträge der letzten... @@ -10344,17 +10351,17 @@ This message is missing. You should receive it later. Store posts for at most... - + Speichern Sie Beiträge höchstens... Share publish permissions... - + Veröffentlichungsberechtigungen teilen... Search for - + Suchen nach @@ -10466,47 +10473,47 @@ This message is missing. You should receive it later. Total identities: - + Gesamte Identitäten: Usage types - + Nutzungsarten Usage per service - + Nutzung pro Service Identity age (in weeks): - + Alter der Identität (in Wochen): Last used (hours ago): - + Zuletzt verwendet (vor Stunden): Managed keys - Verwaltete Schlüssel + Verwaltete Schlüssel : Service ID = - : Dienst-ID = + : Dienst-ID = Routing matrix ( - Routingmatrix ( + Routingmatrix ( [Unknown identity] - [Unbekannte Identität] + [Unbekannte Identität] @@ -10535,27 +10542,27 @@ This message is missing. You should receive it later. Random Bias: %1 - + Zufällige Tendenz: %1 GXS Groups: - + Service: %1 (%2) - Group ID: %3, policy: %4, status: %5, last contact: %6 - + Dienst: %1 (%2) – Gruppen-ID: %3, Richtlinie: %4, Status: %5, letzter Kontakt: %6 Peer: %1: status: %2/%3, last contact: %4, Master key: %5. - + Peer: %1:\t status: %2/%3, \t letzter Kontakt: %4, \t Master-Schlüssel: %5. Peer: %1: no information available - + Peer: %1: keine Informationen verfügbar @@ -10563,108 +10570,108 @@ This message is missing. You should receive it later. Router Statistics - Routerstatistiken + Routerstatistiken GroupBox - + ID - + Destination - Ziel + Ziel Data status - Datenstatus + Datenstatus Data size - + Datengröße Data hash - Datenhash + Datenhash Sending time - Sendezeit + Sendezeit Sending time (secs ago) - Sendezeit (vergangene Sekunden) + Sendezeit (vergangene Sekunden) Publish TS - + Number of messages - + Anzahl der Nachrichten Group ID - + Destination ID - + Ziel-ID Gxs Transport Groups: - + Gxs-Transportgruppen: Group ID / Author - + Gruppen-ID/Autor Local size of data - + Lokale Datengröße Subscribed - Abonniert + Abonniert Popularity - Beliebtheit + Beliebtheit View details - + Details anzeigen Unknown Peer - Unbekannter Nachbar + Unbekannter Nachbar Pending data items - + Ausstehende Datenelemente @@ -10706,17 +10713,17 @@ This message is missing. You should receive it later. Examining shared files... - Prüfe freigegebene Dateien... + Prüfe freigegebene Dateien... Hashing file - Erstelle Prüfsumme + Erstelle Prüfsumme Saving file index... - Speichere Dateiindex... + Speichere Dateiindex... @@ -12339,24 +12346,24 @@ These identities will soon be not supported anymore. Import image - Bild importieren + Bild importieren Image files (*.jpg *.png);;All files (*) - Bilddateien (*.jpg *.png);;Alle Dateien (*) + Bilddateien (*.jpg *.png);;Alle Dateien (*) No Avatar chosen. A default image will be automatically displayed from your new identity. - + Kein Avatar ausgewählt. Von Ihrer neuen Identität wird automatisch ein Standardbild angezeigt. Use the mouse to zoom and adjust the image for your avatar. Hit Del to remove it. - + Verwenden Sie die Maus, um das Bild für Ihren Avatar zu vergrößern und anzupassen. Drücken Sie Entf, um es zu entfernen. @@ -12385,7 +12392,7 @@ These identities will soon be not supported anymore. No avatar chosen - + Kein Avatar ausgewählt @@ -12396,13 +12403,13 @@ These identities will soon be not supported anymore. Update - Aktualisieren + Aktualisieren Profile password needed. - + Profilpasswort erforderlich. @@ -12410,43 +12417,43 @@ These identities will soon be not supported anymore. Identity creation failed - Identitätserstellung fehlgeschlagen + Identitätserstellung fehlgeschlagen Cannot create an identity linked to your profile without your profile password. - Ohne Ihr Profilpasswort können Sie keine mit Ihrem Profil verknüpfte Identität erstellen. + Ohne Ihr Profilpasswort können Sie keine mit Ihrem Profil verknüpfte Identität erstellen. Identity creation success - + Erfolgreiche Identitätserstellung Your new identity was successfuly created, its ID is %1. - + Ihre neue Identität wurde erfolgreich erstellt, ihre ID ist %1. Cannot create identity. Something went wrong. - + Identität kann nicht erstellt werden. Etwas ist schief gelaufen. Cannot create identity. Something went wrong. Check your profile password. - + Identität kann nicht erstellt werden. Etwas ist schief gelaufen. Ãœberprüfen Sie Ihr Profilpasswort. Identity update failed - + Die Identitätsaktualisierung ist fehlgeschlagen Cannot update identity. Something went wrong. Check your profile password. - + Identität kann nicht aktualisiert werden. Etwas ist schief gelaufen. Ãœberprüfen Sie Ihr Profilpasswort. @@ -12476,12 +12483,12 @@ These identities will soon be not supported anymore. Choose image... - + Bild auswählen... Remove - Entfernen + Entfernen @@ -12510,12 +12517,12 @@ These identities will soon be not supported anymore. Create - Erstellen + Erstellen Cancel - Abbrechen + Abbrechen @@ -12654,22 +12661,22 @@ These identities will soon be not supported anymore. Save Picture File - + Bilddatei speichern Pictures (*.png *.xpm *.jpg) - + Bilder (*.png *.xpm *.jpg) Cannot save the image, invalid filename - + Das Bild kann nicht gespeichert werden, ungültiger Dateiname Copy image - Bild kopieren + Bild kopieren @@ -12683,82 +12690,82 @@ These identities will soon be not supported anymore. Form - Formular + Formular JSON API Server - + Enable RetroShare JSON API Server - + RetroShare JSON API Server aktivieren Port: - Port: + Port: Listen Address: - + Listenadresse: Status: - Status: + Status: 127.0.0.1 - 127.0.0.1 + 127.0.0.1 Token: - + <html><head/><body><p>Tokens should spell as &quot;user:password&quot; where both user and password are alphanumeric strings.</p></body></html> - + <html><head/><body><p>Tokens sollten als &quot;Benutzer:Passwort&quot; geschrieben werden, wobei sowohl Benutzer als auch Passwort alphanumerische Zeichenfolgen sind.</p></body></html> Add - Hinzufügen + Hinzufügen Remove - Entfernen + Entfernen Authenticated Tokens: - + Authentifizierte Token: Registered services: - + Registrierte Dienste: Apply settings - Einstellungen übernehmen + Einstellungen übernehmen JSON API - + <h1><img width="24" src=":/icons/help_64.png">&nbsp;&nbsp;Webinterface</h1> <p>Retroshare provides a JSON API allowing other softwares to communicate with its core using token-controlled HTTP requests to http://localhost:[port]. Please refer to the Retroshare documentation for how to use this feature. </p> <p>Unless you know what you're doing, you shouldn't need to change anything in this page. The web interface for instance will automatically register its own token to the JSON API which will be visible in the list of authenticated tokens after you enable it.</p> - + <h1><img width="24" src=":/icons/help_64.png">&nbsp;&nbsp;Webinterface</h1> <p>Retroshare stellt eine JSON-API zur Verfügung, die es anderen Programmen ermöglicht, mit seinem Kern zu kommunizieren, indem sie Token-gesteuerte HTTP-Anfragen an http://localhost:[port] stellen. Bitte lesen Sie in der Retroshare-Dokumentation nach, wie Sie diese Funktion nutzen können. </p> <p>Wenn Sie nicht wissen, was Sie tun, sollten Sie an dieser Seite nichts ändern müssen. Die Weboberfläche beispielsweise registriert automatisch ihr eigenes Token für die JSON-API, das in der Liste der authentifizierten Token angezeigt wird, nachdem Sie es aktiviert haben.</p>> @@ -12957,7 +12964,7 @@ Bitte gib etwas Speicher frei und drücke OK. Close window - + Fenster schließen @@ -13022,17 +13029,17 @@ Bitte gib etwas Speicher frei und drücke OK. Never ask me again - + Frag mich nie wieder This will be saved only for this session. - + Dies wird nur für diese Sitzung gespeichert. This will be saved permanently. You'll need to clean RetroShare.conf to revert. - + Dies wird dauerhaft gespeichert. Um dies rückgängig zu machen, müssen Sie die RetroShare.conf wieder zurücksetzen. @@ -13362,12 +13369,12 @@ Möchtest du die Nachricht in den Entwürfen speichern? Will not reply - + Wird nicht antworten There is no point in replying to a notification message! - + Es hat keinen Sinn, auf eine Benachrichtigung zu antworten! @@ -13627,32 +13634,32 @@ Möchtest du die Nachricht speichern ? Hi,<br>I want to be friends with you on RetroShare.<br> - + Hallo,<br>Ich möchte mit dir auf RetroShare befreundet sein.<br> Invite message - + Einladungsnachricht Respond now: - + Jetzt reagieren: Message Size: %1 - + Größe der Nachricht: %1 It remains %1 characters after HTML conversion. - Es verbleiben %1 Zeichen nach der HTML-Konvertierung. + Es verbleiben %1 Zeichen nach der HTML-Konvertierung. Warning: This message is too big of %1 characters after HTML conversion. - Warnung: Diese Nachricht ist mit %1 Zeichen zu groß nach der HTML-Konvertierung. + Warnung: Diese Nachricht ist mit %1 Zeichen zu groß nach der HTML-Konvertierung. @@ -14058,7 +14065,7 @@ Möchtest du die Nachricht speichern ? %1 (%2) - + @@ -14354,7 +14361,7 @@ Möchtest du die Nachricht speichern ? Stared - + Markiert @@ -14429,7 +14436,7 @@ Möchtest du die Nachricht speichern ? Show in People - + In Personen anzeigen @@ -14439,32 +14446,32 @@ Möchtest du die Nachricht speichern ? No message available in your %1. - + In Ihrem %1 ist keine Nachricht verfügbar. No message using %1 tag available. - + Keine Nachricht mit %1-Tag verfügbar. No %1 message available. - + Keine %1-Nachricht verfügbar. No starred message available. Stars let you give messages a special status to make them easier to find. To star a message, click on the light gray star beside any message. - + Keine markierte Nachricht verfügbar. Mithilfe von Sternen können Sie Nachrichten einen besonderen Status zuweisen, um sie leichter auffindbar zu machen. Um eine Nachricht zu markieren, klicken Sie auf den hellgrauen Stern neben einer Nachricht. Deletion is not recommended - + Eine Löschung wird nicht empfohlen Messages in this box are automatically deleted when received. Manually deleting a message does not guaranty that the message will not be delivered. Messages that cannot be delivered will however stay here indefinitly. Do you want to proceed and delete? - + Nachrichten in diesem Feld werden beim Empfang automatisch gelöscht. Das manuelle Löschen einer Nachricht garantiert nicht, dass die Nachricht nicht zugestellt wird. Nachrichten, die nicht zugestellt werden können, bleiben jedoch auf unbestimmte Zeit hier. Möchten Sie fortfahren und löschen? @@ -14475,7 +14482,7 @@ Möchtest du die Nachricht speichern ? No Box selected. - + Keine Box ausgewählt. @@ -14494,7 +14501,7 @@ Möchtest du die Nachricht speichern ? Mail - + @@ -14535,7 +14542,7 @@ Möchtest du die Nachricht speichern ? Spoiler - + @@ -14775,7 +14782,7 @@ Möchtest du die Nachricht speichern ? Remove this key - + Diesen Schlüssel entfernen @@ -14799,7 +14806,8 @@ Anmerkungen: Dein alter Schlüsselbund wird gesichert. You have selected %1 accepted peers among others, Are you sure you want to un-friend them? - + Sie haben %1 akzeptierte Peers unter anderen ausgewählt, + Bist du sicher, dass du sie wieder entfreunden möchtest? @@ -14813,8 +14821,8 @@ Anmerkungen: Dein alter Schlüsselbund wird gesichert. For security, your keyring was previously backed-up to file - %1 Schlüssel wurden aus dem Schlüsselbund entfernt. -Der Schlüsselbund wurde aus Sicherheitsgründen zuvor in einer Datei gesichert. + %1 Schlüssel wurden aus dem Schlüsselbund entfernt. +Der Schlüsselbund wurde aus Sicherheitsgründen zuvor in einer Datei gesichert. @@ -14954,12 +14962,12 @@ Reported error: ID - + Search ID - Kennung suchen + Kennung suchen @@ -14969,7 +14977,7 @@ Reported error: Show Items - + Elemente anzeigen @@ -14999,7 +15007,7 @@ Reported error: UNKNOWN TYPE - + UNBEKANNTER TYP @@ -15261,22 +15269,22 @@ Mindestens ein Peer wurde nicht zu einer Gruppe hinzugefügt You have %1 logged events - + Sie haben %1 protokollierte Ereignisse You have %1 logged event - + Sie haben %1 protokolliertes Ereignis %1 logged events - + %1 protokollierte Ereignisse %1 logged event - + %1 protokolliertes Ereignis @@ -15496,12 +15504,12 @@ Mindestens ein Peer wurde nicht zu einer Gruppe hinzugefügt You need to sign your node's certificate. - + Sie müssen das Zertifikat Ihres Knotens signieren. You need to sign your forum/chatrooms identity. - + Sie müssen Ihre Forum-/Chatroom-Identität unterschreiben. @@ -15511,7 +15519,7 @@ Mindestens ein Peer wurde nicht zu einer Gruppe hinzugefügt Please enter your Retroshare passphrase - + Bitte geben Sie Ihr Retroshare-Passwort ein @@ -15549,7 +15557,7 @@ Mindestens ein Peer wurde nicht zu einer Gruppe hinzugefügt Encrypted message - Verschlüsselte Nachr. + Verschlüsselte Nachricht @@ -15601,7 +15609,7 @@ Minimalmodus: 10% vom Standarddatenaufkommen und (unfertig) pausiert alle Datei <p>Warning: This Operating mode disables the tunneling service. This means you can use distant chat not anonymously download files and the mail service will be slower.</p><p>This state will be saved after restart, so do not forget that you changed it!</p> - + <p>Warnung: In diesem Betriebsmodus ist der Tunneldienst deaktiviert. Das bedeutet, dass Sie den Distant-Chat nicht anonym nutzen können und der Mail-Dienst langsamer wird.</p><p>Dieser Zustand wird nach dem Neustart gespeichert, vergessen Sie also nicht, dass Sie ihn geändert haben!</p> @@ -15971,7 +15979,7 @@ Warning: In your File-Transfer option, you select allow direct download to No. Trust: - Vertrauen: + Vertrauen: @@ -15996,7 +16004,7 @@ Warning: In your File-Transfer option, you select allow direct download to No. Time offset: - + Zeitdifferenz: @@ -16016,7 +16024,7 @@ Warning: In your File-Transfer option, you select allow direct download to No. Connection refused by peer - + Verbindung von Peer abgelehnt @@ -16026,7 +16034,7 @@ Warning: In your File-Transfer option, you select allow direct download to No. Friend Time Offset - + Zeitversatz des Freundes @@ -16037,7 +16045,7 @@ Warning: In your File-Transfer option, you select allow direct download to No. Unknown peer - + Unbekannter Peer @@ -16049,7 +16057,7 @@ Warning: In your File-Transfer option, you select allow direct download to No. Unknown - Unbekannt + Unbekannt @@ -16092,7 +16100,7 @@ Warning: In your File-Transfer option, you select allow direct download to No. Drag your circles or people to each other. - Ziehe deine Kreise oder Leute zueinander + Ziehe deine Kreise oder Leute zueinander. @@ -16112,7 +16120,7 @@ Warning: In your File-Transfer option, you select allow direct download to No. Invite to Circle - + Zum Kreis einladen @@ -16165,52 +16173,52 @@ Warning: In your File-Transfer option, you select allow direct download to No. <html><head/><body><p>Anyone in your contact list will automatically have a positive opinion if not set. This allows to automatically raise reputations of used nodes. </p></body></html> - + <html><head/><body><p>Jeder in Ihrer Kontaktliste hat automatisch eine positive Meinung, wenn dies nicht festgelegt ist. Dadurch kann die Reputation verwendeter Knoten automatisch erhöht werden. </p></body></html> use "positive" as the default opinion for contacts (instead of neutral) - + use "positive" as the default opinion for contacts (instead of neutral) Automatically add identities owned by friend nodes to my contacts - + Füge automatisch Identitäten von Freundesknoten zu meinen Kontakten hinzu Difference in votes (+/-) to rate an ID negatively: - + Unterschied in den Stimmen (+/-), um eine ID negativ zu bewerten: <html><head/><body><p>When an identity receives more negative votes than positive votes, it switches from &quot;Neutral&quot; to &quot;Negative (according to your friends)&quot;. By default, a one-vote difference is enough, but you can make this harder to happen by selecting a higher number here.</p></body></html> - + <html><head/><body><p>Wenn eine Identität mehr negative als positive Stimmen erhält, wechselt sie von „Neutral“ zu „Neutral“. zu „Negativ (laut deinen Freunden)“. Standardmäßig reicht ein Unterschied von einer Stimme aus, aber Sie können dies erschweren, indem Sie hier eine höhere Zahl auswählen.</p></body></html> <html><head/><body><p>When an identity receives more positive votes than negative votes, it switches from &quot;Neutral&quot; to &quot;Positive (according to your friends)&quot;. By default, a one-vote difference is enough, but you can make this harder to happen by selecting a higher number here.</p></body></html> - + <html><head/><body><p>Wenn eine Identität mehr positive als negative Stimmen erhält, wechselt sie von „Neutral“ zu „Neutral“. zu „Positiv (laut deinen Freunden)“. Standardmäßig reicht ein Unterschied von einer Stimme aus, aber Sie können dies erschweren, indem Sie hier eine höhere Zahl auswählen.</p></body></html> Difference in votes (+/-) to rate an ID positively: - + Differenz in den Stimmen (+/-), um eine ID positiv zu bewerten: Delete banned identities after (0 means indefinitely): - + Gesperrte Identitäten löschen nach (0 bedeutet auf unbestimmte Zeit): Reset reputation of banned identities after (0 means never): - + Reputation gesperrter Identitäten zurücksetzen nach (0 bedeutet nie): <html><head/><body><p>Banned identities are not stamped and therefore lose activity. They get deleted automatically after a finit period of time.</p></body></html> - + <html><head/><body><p>Gesperrte Identitäten werden nicht gestempelt und verlieren daher ihre Aktivität. Sie werden nach einer bestimmten Zeitspanne automatisch gelöscht.</p></body></html> @@ -16221,7 +16229,7 @@ Warning: In your File-Transfer option, you select allow direct download to No. <html><head/><body><p>In order to prevent deleted banned IDs to come back because they are used in e.g. forums or channels, banned identities are kept in a list for some time. After that, they are &quot;cleared&quot; from the banning list, and will be downloaded again as unbanned if used in forus, chat rooms, etc.</p></body></html> - + <html><head/><body><p>Um zu verhindern, dass gelöschte gesperrte IDs zurückkommen, weil sie z. B. in In Foren oder Kanälen werden gesperrte Identitäten für einige Zeit in einer Liste gespeichert. Danach werden sie „gelöscht“. aus der Sperrliste entfernt und bei Verwendung in Foren, Chatrooms usw. erneut als nicht gesperrt heruntergeladen.</p></body></html> @@ -16239,37 +16247,37 @@ Warning: In your File-Transfer option, you select allow direct download to No. Album / Photo Name - + Album-/Fotoname Details - Details + Details 50 % - + 75 % - + 100 % - + 200 % - + Comments - Kommentare + Kommentare @@ -16284,12 +16292,12 @@ Warning: In your File-Transfer option, you select allow direct download to No. Photo Title: - Fototitel + Fototitel: When - Wann: + Wann @@ -16299,7 +16307,7 @@ Warning: In your File-Transfer option, you select allow direct download to No. Album - Album + Album @@ -16483,44 +16491,44 @@ kannst musst du eines auswählen! Photo View - + Fotoansicht TextLabel - TextLabel + TextLabel Posted by - Gepostet von + Gepostet von ago - vor + vor Copy RetroShare link - + RetroShare-Link kopieren Share - + Verteilen information - + Informationen The Retrohare link was copied to your clipboard. - + Der Retrohare-Link wurde in Ihre Zwischenablage kopiert. @@ -16594,7 +16602,7 @@ p, li { white-space: pre-wrap; } File name: - Dateiname: + Dateiname: @@ -16604,7 +16612,7 @@ p, li { white-space: pre-wrap; } Status: - Status: + Status: @@ -16622,22 +16630,22 @@ p, li { white-space: pre-wrap; } Error: instance '%1' can't create a widget - + Fehler: Instanz „%1“ kann kein Widget erstellen Error: failed to remove file %1 (uninstalling plugin '%2') - + Fehler: Datei %1 konnte nicht entfernt werden (Plugin „%2“ wird deinstalliert) Error (uninstall): no plugin with name '%1' found - + Fehler (Deinstallation): Kein Plugin mit dem Namen „%1“ gefunden Error (installation): plugin file %1 doesn't exist - + Fehler (Installation): Plugin-Datei %1 existiert nicht @@ -16777,7 +16785,7 @@ p, li { white-space: pre-wrap; } Dock window - + Fenster andocken @@ -16785,28 +16793,28 @@ p, li { white-space: pre-wrap; } Remote status unknown. - + Remote-Status unbekannt. Can't send message immediately, because there is no tunnel available. - + Kann die Nachricht nicht sofort senden, da kein Tunnel verfügbar ist. Your partner closed the conversation. - + Ihr Partner hat das Gespräch beendet. Closing this window will end the conversation. Unsent messages will be dropped. - + Wenn Sie dieses Fenster schließen, wird die Konversation beendet. Nicht gesendete Nachrichten werden verworfen. Close conversation? - + Gespräch beenden? @@ -16814,94 +16822,94 @@ p, li { white-space: pre-wrap; } Posted by - Gepostet von + Gepostet von Toggle Message Read Status - Lesestatus der Nachricht umschalten + Lesestatus der Nachricht umschalten New - Neu + Neu Vote up - Daumen hoch + Daumen hoch 0 - 0 + 0 Vote down - Daumen runter + Daumen runter \/ - \/ + \/ Comments - Kommentare + Kommentare Share - + Verteilen Set as read and remove item - Als gelesen markieren und Eintrag entfernen + Als gelesen markieren und Eintrag entfernen Remove Item - + Eintrag entfernen PictureLabel - + Comment - Kommentar + Kommentar Comments - Kommentare + Kommentare Loading - Lade + Lade Copy RetroShare Link - RetroShare-Link kopieren + RetroShare-Link kopieren Show author in people tab - Autor auf der Registerkarte Personen anzeigen + Autor auf der Registerkarte Personen anzeigen <p><font color="#ff0000"><b>The author of this message (with ID %1) is banned.</b> - + <p><font color="#ff0000"><b>Der Autor dieser Nachricht (mit der ID %1) ist gesperrt.</b> @@ -16909,7 +16917,7 @@ p, li { white-space: pre-wrap; } Create a new Post - + Neuen Beitrag erstellen @@ -16924,58 +16932,58 @@ p, li { white-space: pre-wrap; } Message is too large.<br />actual size: %1 bytes, maximum size: %2 bytes. - + Nachricht ist zu groß.<br />Aktuelle Größe: %1 Bytes, maximale Größe: %2 Bytes. Error while creating post - + Fehler beim Erstellen eines Beitrags An error occurred while creating the post. - + Beim Erstellen des Beitrags ist ein Fehler aufgetreten. Load Picture File - Bilddatei laden + Bilddatei laden Post image - + Bild posten Do you want to share and link the original image? - + Möchten Sie das Originalbild teilen und verlinken? You already added a link.<br />Do you want to replace it? - + Sie haben bereits einen Link hinzugefügt.<br />Möchten Sie ihn ersetzen? No clipboard image found. - + Kein Bild in der Zwischenablage gefunden. There is no image data in the clipboard to paste - + In der Zwischenablage befinden sich keine Bilddaten zum Einfügen Close this window? - Dieses Fenster schließen? + Dieses Fenster schließen? Do you really want to discard your post? - Wollen Sie Ihren Beitrag wirklich verwerfen? + Wollen Sie Ihren Beitrag wirklich verwerfen? @@ -16985,63 +16993,63 @@ p, li { white-space: pre-wrap; } Create a Post - + Beitrag erstellen Preview - Vorschau + Vorschau Add Picture - Bild hinzufügen + Bild hinzufügen Post size is limited to 32 KB, pictures will be downscaled. - + Die Größe der Beiträge ist auf 32 KB begrenzt, die Bilder werden verkleinert. Paste image from clipboard - + Bild aus Zwischenablage einfügen Paste Picture - + Bild einfügen Remove image - + Bild entfernen Url - + Post as - Veröffentlichen als + Veröffentlichen als Post - Posten + Posten Image - Bild + Bild You are submitting a post. The key to a successful submission is interesting content and a descriptive title. - + Sie reichen einen Beitrag ein. Der Schlüssel zu einem erfolgreichen Beitrag ist ein interessanter Inhalt und ein beschreibender Titel. @@ -17326,37 +17334,37 @@ p, li { white-space: pre-wrap; } Form - Formular + Formular Details - Details + Details Board Details - + Board Details <html><head/><body><p>Maximum number of data items (including posts, comments, votes) across friend nodes.</p></body></html> - + <html><head/><body><p>Maximale Anzahl von Datenelementen (einschließlich Beiträgen, Kommentaren, Abstimmungen) über Freundschaftsknoten hinweg.</p></body></html> Items (at friends): - + Artikel (bei Freunden): 0 - 0 + 0 Administrator: - Administrator: + Administrator: @@ -17364,12 +17372,12 @@ p, li { white-space: pre-wrap; } unknown - unbekannt + unbekannt Distribution: - Verteilung: + Verteilung: @@ -17384,7 +17392,7 @@ p, li { white-space: pre-wrap; } TextLabel - TextLabel + TextLabel @@ -17394,12 +17402,12 @@ p, li { white-space: pre-wrap; } Sync period: - + Sync-Zeitraum: Number of subscribed friend nodes - + Anzahl der abonnierten Freundesknoten @@ -17414,22 +17422,22 @@ p, li { white-space: pre-wrap; } <html><head/><body><p><span style=" font-family:'-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'; font-size:14pt; color:#24292e; background-color:#ffffff;">Select sorting</span></p></body></html> - + <html><head/><body><p><span style="font-family:'-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI-Symbol'; Schriftgröße: 14pt; Farbe: #24292e; Hintergrundfarbe: #ffffff;">Sortierung auswählen</span></p></body></html> New - Neu + Neu Top - Anfang + Top Hot - Heiß + Heiß @@ -17439,7 +17447,7 @@ p, li { white-space: pre-wrap; } Classic view - + Klassische Ansicht @@ -17449,186 +17457,186 @@ p, li { white-space: pre-wrap; } 1-10 - 1-10 + 1-10 Next - Nächstes + Nächstes <html><head/><body><p>Default identity used when voting</p></body></html> - + <html><head/><body><p>Standard-Identität, die bei der Abstimmung verwendet wird</p></body></html> No files in this post, or no post selected - + Keine Dateien in diesem Beitrag, oder kein Beitrag ausgewählt No posts available in this board - + Keine Beiträge in diesem Board vorhanden Click to switch to card view - + Klicken, um zur Kartenansicht zu wechseln Click to switch to compact view - + Klicken, um zur Kompaktansicht zu wechseln Empty - Leer + Leer Copy RetroShare Link - RetroShare-Link kopieren + RetroShare-Link kopieren Copy http Link - + http-Link kopieren Show author in People tab - + Autor auf der Registerkarte Personen anzeigen Edit - Bearbeiten + Bearbeiten information - + Informationen The Retrohare link was copied to your clipboard. - + Der Retrohare-Link wurde in Ihre Zwischenablage kopiert. Link creation error - + Fehler bei der Link-Erstellung Link could not be created: - + Link konnte nicht erstellt werden: [No name] - + [Kein Name] Subscribed - Abonniert + Abonniert Subscribe - Abonnieren + Abonnieren Never - Nie + Nie 5 days - 5 Tage + 5 Tage 2 weeks - 2 Wochen + 2 Wochen 1 month - 1 Monat + 1 Monat 3 months - + 3 Monate 6 months - + 6 Monate 1 year - 1 Jahr + 1 Jahr indefinitly - + Unbegrenzt Unknown - Unbekannt + Unbekannt Public - Öffentlich + Öffentlich Restricted to members of circle " - Beschränkt auf Mitglieder des Kreises " + Beschränkt auf Mitglieder des Kreises " Restricted to members of circle - Beschränkt auf Mitglieder des Kreises + Beschränkt auf Mitglieder des Kreises Your eyes only - Nur Ihre Augen + Nur für Ihre Augen You and your friend nodes - + Sie und Ihr Freund Knotenpunkte No Channel Selected - Keinen Kanal gewählt + Keinen Kanal gewählt Could not vote - + Konnte nicht abstimmen Error occured while voting: - + Bei der Abstimmung ist ein Fehler aufgetreten: @@ -17641,12 +17649,12 @@ p, li { white-space: pre-wrap; } Open each board in a new tab - + Öffnen Sie jedes Board in einem neuen Tab Boards - + @@ -17654,22 +17662,22 @@ p, li { white-space: pre-wrap; } Board Post - + Board Beitrag You have %1 new board posts - + Sie haben %1 neue Beiträge im Board You have %1 new board post - + Sie haben %1 neuen Board Beitrag %1 new board post - + %1 neuer Beitrag im Board @@ -17934,7 +17942,7 @@ und den Import zum Laden verwenden Your Cert is copied to Clipboard, paste and send it to your friend via email or some other way - Dein Zertifikat ist in die Zwischenablage kopiert worden. Du kannst es per E-Mail oder auf andere Weise an deinen Freund senden. + Dein Zertifikat ist in die Zwischenablage kopiert worden. Du kannst es per E-Mail oder auf andere Weise an deinen Freund senden @@ -17967,7 +17975,7 @@ und den Import zum Laden verwenden From: - Von: + Von: @@ -17992,23 +18000,23 @@ und den Import zum Laden verwenden Positive - Positiv + Positiv Neutral - Neutral + Neutral Negative - Negativ + Negativ Whats happening? - + Was geschieht? @@ -18040,7 +18048,7 @@ und den Import zum Laden verwenden Post - + Posten @@ -18050,12 +18058,12 @@ und den Import zum Laden verwenden Post - Posten + Posten Reply to Pulse - + Antworten @@ -18065,7 +18073,7 @@ und den Import zum Laden verwenden Republish Pulse - + Neu veröffentlichen @@ -18403,32 +18411,32 @@ hinzufügen und den Assistent zum Hinzufügen von Freunden zu starten. Warning: Retroshare is about to ask your system to open this file. - + Warnung: Retroshare fordert Ihr System auf, diese Datei zu öffnen. Before you do so, please make sure that this file does not contain malicious executable code. - + Bevor Sie dies tun, stellen Sie bitte sicher, dass diese Datei keinen schädlichen ausführbaren Code enthält. Identity added to People - + Identität zu Personen hinzugefügt The identity was added to people. You can now chat with it, send messages to it, etc. - + Die Identität wurde zu Personen hinzugefügt. Sie können jetzt mit ihm chatten, Nachrichten an ihn senden usw. Identity cannot be added to People - + Identität kann nicht zu Personen hinzugefügt werden The identity was not added to people. Some error occured. The link is probably corrupted. - + Die Identität war nicht an Personen gebunden. Es ist ein Fehler aufgetreten. Der Link ist wahrscheinlich beschädigt. @@ -18543,17 +18551,17 @@ hinzufügen und den Assistent zum Hinzufügen von Freunden zu starten. Posted not found - + Die gepostete Nachricht wurde nicht gefunden Posted message not found - + Die gepostete Nachricht wurde nicht gefunden Posted messages not found - + Gepostete Nachrichten wurden nicht gefunden @@ -18563,22 +18571,22 @@ hinzufügen und den Assistent zum Hinzufügen von Freunden zu starten. Click to browse/download this file collection - + Klickenr, um diese Dateisammlung zu durchsuchen/herunterzuladen %1 (%2) - + Identity link (name=%1, ID=%2) - + Identitätslink (Name=%1, ID=%2) %1 (%2 files, %3) - + %1 (%2 Dateien, %3) @@ -18958,7 +18966,7 @@ Sicherheit: keine anonymen Kennungen Join chat room - + Treten Sie dem Chatroom bei @@ -19036,52 +19044,52 @@ Sicherheit: keine anonymen Kennungen Creating receipt - + Quittung erstellen Signing receipt - + Quittung unterschreiben Serializing - + Serialisierung Creating payload - + Payload erstellen Encrypting payload - + Verschlüsselung der Nutzlast Publishing - + Veröffentlichung Waiting for receipt - + Warte auf die Quittung Receipt received - + Quittung erhalten Receipt signature failed - + Die Signatur der Quittung ist fehlgeschlagen Encryption failed - + Die Verschlüsselung ist fehlgeschlagen @@ -19126,12 +19134,12 @@ Sicherheit: keine anonymen Kennungen Service info - + Serviceinformationen Bandwidth control - + Bandbreitenkontrolle @@ -19142,22 +19150,22 @@ Sicherheit: keine anonymen Kennungen Distant mail - + Distant-Mail Service control - + Servicekontrolle Distant chat - + Distant-Chat GXS Tunnel - + @@ -19188,7 +19196,7 @@ Sicherheit: keine anonymen Kennungen NXS - + @@ -19198,17 +19206,17 @@ Sicherheit: keine anonymen Kennungen GXS Photo - + GXS Wiki - + GXS TheWire - + @@ -19243,12 +19251,12 @@ Sicherheit: keine anonymen Kennungen GXS Transport - + JSon API - + @@ -19262,102 +19270,102 @@ Sicherheit: keine anonymen Kennungen Group admin signature creation - + Erstellung der Gruppenadministratorsignatur Group admin signature validation - + Validierung der Gruppenadministratorsignatur Group author signature creation - + Erstellung der Gruppenautorsignatur Group author signature validation - + Validierung der Signatur des Gruppenautors Message author signature creation - + Erstellung der Signatur des Nachrichtenautors Message author signature validation - + Validierung der Signatur des Nachrichtenautors Routine group author signature check. - + Routinemäßige Ãœberprüfung der Gruppenautorensignatur. Routine message author signature check - + Routinemäßige Ãœberprüfung der Signatur des Nachrichtenautors Chat room signature validation - + Validierung der Chatroom-Signatur Global router message validation - + Globale Router-Nachrichtenvalidierung Global router message creation - + Erstellung globaler Router-Nachrichten DH Key exchange validation for GXS tunnel - + DH-Schlüsselaustauschvalidierung für GXS-Tunnel DH Key exchange creation for GXS tunnel - + Erstellung des DH-Schlüsselaustauschs für den GXS-Tunnel New identity from GXS sync - + Neue Identität durch GXS-Synchronisierung New friend identity from discovery - + Neue Freundesidentität durch Entdeckung New identity requested from friend node - + Neue Identität vom Freundesknoten angefordert Generic signature validation - + Generische Signaturvalidierung Generic signature creation - + Generische Signaturerstellung Generic data decryption - + Generische Datenentschlüsselung Generic data encryption - + Generische Datenverschlüsselung @@ -19367,79 +19375,79 @@ Sicherheit: keine anonymen Kennungen Click to pause the hashing process - + Klicken, um den Hashing-Vorgang anzuhalten [Hashing is paused] - + [Hashing ist pausiert] Click to resume the hashing process - + Klicken, um den Hashing-Vorgang fortzusetzen Idle - Untätig + Untätig Virtual peers available - + Virtuelle Peers verfügbar Passive - + Active - Aktiv + Aktiv Requesting peers - + Peers angefordert Never - Nie + Nie Tunnel OK - + Tunnel active - + Tunnel aktiv Client - + Server - + Missing channel post - + Fehlender Kanalbeitrag [System] - + @@ -19636,7 +19644,7 @@ p, li { white-space: pre-wrap; } Where do you want to have the buttons for the page? - + Wo möchten Sie die Schaltflächen für die Seite haben? @@ -19837,72 +19845,72 @@ p, li { white-space: pre-wrap; } Location info exchange between friends. Helps to find actual address in case of dynamic IPs<br>Without it you will have to rely on DHT only for getting fresh addresses - + Austausch von Standortinformationen zwischen Freunden. Hilft beim Ermitteln der aktuellen Adresse im Falle von dynamischen IPs<br> Ohne sie sind Sie nur auf DHT angewiesen, um an die neue Adressen zu kommen Used by direct F2F chat, distant chat and chat lobbies - + Wird von direkten F2F-Chats, Distanzchats und Chat-Lobbys verwendet Mailing service. Also required for direct f2f chat - + Mailing-Dienst. Auch für direkten f2f-Chat erforderlich Anonymous routing. Used by file transfers and file search,<br> distant chat, distant mail and distant channels/etc sync - + Anonymous routing. Verwendet für Dateiübertragungen und Dateisuche,,<br> Distanz-Chat, Distanz-Mail und Distanz-Kanäle/etc-Synchronisation Checks if peers alive - + Prüft, ob Peers aktiv sind File transfer. If you kill it - you won't be able to dl files from friend shares. Anonymous access unnaffected - + Dateiübertragung. Wenn Sie es abschalten, können Sie keine Dateien von Freunden herunterladen. Anonymer Zugriff nicht betroffen Used by distant mail for immediate delivery using anonymous tunnels (turtle router) - + Wird von Distant-Mails für die sofortige Zustellung über anonyme Tunnel verwendet (Turtle-Router) Exchange shared directories info, aka browsable(visible) files - + Austausch von Informationen über gemeinsam genutzte Verzeichnisse, d. h. durchsuchbare (sichtbare) Dateien Allows your node to tell to your friends which service are ON on your side, and vice-versa - + Ermöglicht Ihrem Knotenpunkt, Ihren Freunden mitzuteilen, welche Dienste auf Ihrer Seite eingeschaltet sind, und umgekehrt Speed management - + Verwaltung der Geschwindigkeit Used by distant chat, distant mail, and distant channels sync for transfer data using anonymous tunnels - + Verwendet von Distanz-Chat, Distanz-Mail und Distanz-Kanal-Synchronisation für die Datenübertragung über anonyme Tunnel IP filter lists exchange - + Austausch von IP-Filterlisten Share user status like online, away, busy with friends - + Teilen Sie den Benutzerstatus, z. B. online, abwesend oder mit Freunden beschäftigt Identity data exchange. Required by all identities-related functions like chats, forums, mail, etc - + Identitätsdatenaustausch. Erforderlich für alle identitätsbezogenen Funktionen wie Chats, Foren, E-Mail usw @@ -19937,22 +19945,22 @@ p, li { white-space: pre-wrap; } Votes exchange - bans/upvotes for Identities - + Stimmenaustausch - Sperren/Upvotes für Identitäten Used by distant mail for deferred delivery - stored at friends when target offline - + Wird von Distant-Mail für die verzögerte Zustellung verwendet – bei Freunden gespeichert, wenn das Ziel offline ist Measures the Round Trip Time between you and your friends - + Misst die Hin- und Rücklaufzeit zwischen Ihnen und Ihren Freunden unknown - unbekannt + unbekannt @@ -19975,12 +19983,12 @@ p, li { white-space: pre-wrap; } View &Source - + Quelltext anzeigen Save image - Bild speichern + Bild speichern @@ -19990,7 +19998,7 @@ p, li { white-space: pre-wrap; } Document source - Quelle des Dokuments + Quelle des Dokuments @@ -20003,33 +20011,33 @@ p, li { white-space: pre-wrap; } Show Header - + Kopfzeile anzeigen Sort by column … - + Nach Spalte sortieren ... Sort Descending Order - + Sortierung absteigend Sort Ascending Order - + Aufsteigend sortieren [no title] - + [kein Titel] Show column … - + Spalte anzeigen ... @@ -20055,7 +20063,7 @@ p, li { white-space: pre-wrap; } Download... - + Herunterladen... @@ -20101,7 +20109,7 @@ p, li { white-space: pre-wrap; } Paragraph formatting - + Absatzformatierung @@ -20117,7 +20125,7 @@ p, li { white-space: pre-wrap; } . - + @@ -20127,33 +20135,33 @@ p, li { white-space: pre-wrap; } Undo (CTRL+Z) - + Rückgängig (STRG+Z) Undo - + Rückgängig Redo - + Wiederholen Cut (CTRL+X) - + Ausschneiden (STRG+X) Cut - + Ausschneiden Copy (CTRL+C) - + Kopieren (STRG+C) @@ -20163,7 +20171,7 @@ p, li { white-space: pre-wrap; } Paste (CTRL+V) - + Einfügen (STRG+V) @@ -20173,12 +20181,12 @@ p, li { white-space: pre-wrap; } Link (CTRL+L) - + Link (STRG+L) Link - Link + Link @@ -20188,7 +20196,7 @@ p, li { white-space: pre-wrap; } Italic (CTRL+I) - + Kursiv (STRG+I) @@ -20198,137 +20206,137 @@ p, li { white-space: pre-wrap; } Underline (CTRL+U) - + Unterstrichen (STRG+U) Underline - Unterstrichen + Unterstrichen Bullet list (CTRL+-) - + Aufzählungsliste (STRG+-) Bullet list - + Aufzählungsliste Ordered list (CTRL+=) - + Geordnete Liste (STRG+=) Ordered list - + Geordnete Liste Decrease indentation (CTRL+,) - + Einzug verkleinern (STRG+,) Increase indentation (CTRL+.) - + Einrückung vergrößern (STRG+.) Attach a Picture - Bild anhängen + Bild anhängen Text - + TextLabel - TextLabel + TextLabel Standard - + Heading 1 - Ãœberschrift 1 + Ãœberschrift 1 Heading 2 - Ãœberschrift 2 + Ãœberschrift 2 Heading 3 - Ãœberschrift 3 + Ãœberschrift 3 Heading 4 - Ãœberschrift 4 + Ãœberschrift 4 Monospace - + Remove character formatting - + Zeichenformatierung entfernen Remove all formatting - + Alle Formatierungen entfernen Edit document source - + Dokumentquelle bearbeiten Document source - Quelle des Dokuments + Quelle des Dokuments Create a link - + Einen Link erstellen Link URL: - + Load Picture File - Bilddatei laden + Bilddatei laden It remains %1 characters after HTML conversion. - Es verbleiben %1 Zeichen nach der HTML-Konvertierung. + Es verbleiben %1 Zeichen nach der HTML-Konvertierung. Warning: This message is too big of %1 characters after HTML conversion. - Warnung: Diese Nachricht ist mit %1 Zeichen zu groß nach der HTML-Konvertierung. + Warnung: Diese Nachricht ist mit %1 Zeichen zu groß nach der HTML-Konvertierung. Text (optional) - + @@ -20562,12 +20570,12 @@ Die betroffenen Dateien sind rot markiert Download files - + Dateien herunterladen Specify... - + Spezifizieren... @@ -20614,7 +20622,7 @@ Die betroffenen Dateien sind rot markiert Do you want to remove them and all their children, too? - + Möchten Sie alle und ihre untergeordneten Elemente ebenfalls entfernen? @@ -20913,84 +20921,84 @@ verhindert, dass die Nachricht an Ihre Freunde weitergeleitet wird. Date - Datum + Datum From - Von + Von To - An + An Subject - Betreff + Betreff Tags - Schlagwörter + Schlagwörter Click to sort by attachments - Klicken, um nach Anhang zu sortieren + Klicken, um nach Anhang zu sortieren Click to sort by subject - Klicken, um nach Betreff zu sortieren + Klicken, um nach Betreff zu sortieren Click to sort by read status - + Klicken, um nach Lesestatus zu sortieren Click to sort by author - + Klicken, um nach Autor zu sortieren Click to sort by destination - + Klicken, um nach Zielort zu sortieren Click to sort by date - Klicken, um nach Datum zu sortieren + Klicken, um nach Datum zu sortieren Click to sort by tags - Klicken, um nach Schlagwörter zu sortieren + Klicken, um nach Schlagwörter zu sortieren Click to sort by star - Klicken, um nach Kennzeichnung zu sortieren + Klicken, um nach Kennzeichnung zu sortieren Click to sort by junk status - + Klicken, um nach Junk-Status zu sortieren [Notification] - [Benachrichtigung] + [Benachrichtigung] [Unknown] - [Unbekannt] + [Unbekannt] @@ -21017,7 +21025,7 @@ verhindert, dass die Nachricht an Ihre Freunde weitergeleitet wird. filename - + Dateiname @@ -21027,7 +21035,7 @@ verhindert, dass die Nachricht an Ihre Freunde weitergeleitet wird. level - + @@ -21037,7 +21045,7 @@ verhindert, dass die Nachricht an Ihre Freunde weitergeleitet wird. style - + Stil @@ -21047,7 +21055,7 @@ verhindert, dass die Nachricht an Ihre Freunde weitergeleitet wird. stylesheet - + @@ -21057,7 +21065,7 @@ verhindert, dass die Nachricht an Ihre Freunde weitergeleitet wird. language - + Sprache @@ -21073,7 +21081,7 @@ verhindert, dass die Nachricht an Ihre Freunde weitergeleitet wird. Invalid operating mode specified: - + Ungültige Betriebsart angegeben: @@ -21088,32 +21096,32 @@ verhindert, dass die Nachricht an Ihre Freunde weitergeleitet wird. opmode - + Sets RetroShare's operating mode. - + Legt den Betriebsmodus von RetroShare fest. RsLinkURL - + Open RsLink with protocol retroshare:// - + RsLink mit Protokoll retroshare:// öffnen Open RsFile with or without arg. - + RsFile mit oder ohne Arg öffnen. RetroShare GUI Usage Information - + RetroShare GUI-Nutzungsinformationen @@ -21356,7 +21364,7 @@ verhindert, dass die Nachricht an Ihre Freunde weitergeleitet wird. Mark as bad - + Als schlecht markieren @@ -21404,7 +21412,7 @@ verhindert, dass die Nachricht an Ihre Freunde weitergeleitet wird. Obtained via - + Erhältlich über @@ -21635,7 +21643,7 @@ verhindert, dass die Nachricht an Ihre Freunde weitergeleitet wird. SSL request - + SSL-Anfrage @@ -21744,7 +21752,7 @@ verhindert, dass die Nachricht an Ihre Freunde weitergeleitet wird. NAT - + @@ -21826,7 +21834,7 @@ Es hilft auch, wenn du dich hinter einer Firewall/VPN befindest. Tor has been automatically configured by Retroshare. You shouldn't need to change anything here. - + Tor wurde von Retroshare automatisch konfiguriert. Hier sollten Sie keine Änderungen vornehmenen. @@ -21836,7 +21844,7 @@ Es hilft auch, wenn du dich hinter einer Firewall/VPN befindest. local - + lokal @@ -21849,7 +21857,10 @@ Es hilft auch, wenn du dich hinter einer Firewall/VPN befindest. List of found external IP: - + + +Liste der gefundenen externen IP: + @@ -21902,23 +21913,23 @@ List of found external IP: SAMv3 is running and accessible - + SAMv3 läuft und ist zugänglich SAMv3 is not accessible! Is i2p running and SAM enabled? - + SAMv3 ist nicht zugänglich! Läuft i2p und ist SAM aktiviert? Your key uses the following algorithms: %1 and %2 - + Ihr Schlüssel verwendet die folgenden Algorithmen: %1 und %2 unkown key type - + unbekannter Schlüsseltyp @@ -21928,51 +21939,60 @@ List of found external IP: When changing options use the buttons at the bottom to restart SAMv3. - + RetroShare verwendet SAMv3, um einen %1-Tunnel bei %2:%3 einzurichten +(ID: %4) + +Wenn Sie Optionen ändern, verwenden Sie die Schaltflächen unten, um SAMv3 neu zu starten. + + Offline, no SAM session is established yet. - + Offline, es wurde noch keine SAM-Sitzung eingerichtet. + SAM is trying to establish a session ... this can take some time. - + SAM versucht, eine Sitzung aufzubauen ... dies kann einige Zeit dauern. + SAM session established! Now setting up a forward session ... - + SAM-Sitzung eingerichtet! Richten Sie jetzt eine Weiterleitungssitzung ein ... + Online, SAM is working as exptected - + Online, SAM funktioniert wie erwartet + You key uses %1 for signing and %2 for crypto - + Ihr Schlüssel verwendet %1 zum Signieren und %2 für die Verschlüsselung stop SAM tunnel first to generate a new key - + Stoppen Sie zunächst den SAM-Tunnel, um einen neuen Schlüssel zu generieren stop SAM tunnel first to load a key - + Stoppen Sie zuerst den SAM-Tunnel, um einen Schlüssel zu laden stop SAM tunnel first to disable SAM - + Stoppen Sie zuerst den SAM-Tunnel, um SAM zu deaktivieren @@ -21982,22 +22002,22 @@ When changing options use the buttons at the bottom to restart SAMv3. server - + Server unknown - unbekannt + unbekannt request a new server key - + Fordern Sie einen neuen Serverschlüssel an load server key from base64 - + Serverschlüssel von Base64 laden @@ -22009,7 +22029,9 @@ When changing options use the buttons at the bottom to restart SAMv3. The proxy is not enabled or broken. Are all services up and running fine?? Also check your ports! - + Der Proxy ist nicht aktiviert oder defekt. +Sind alle Dienste betriebsbereit? +Ãœberprüfen Sie auch Ihre Ports! @@ -22050,7 +22072,8 @@ Also check your ports! WARNING: These values don't take into account the Relays. - + WARNUNG: +Diese Werte berücksichtigen nicht die Relais. @@ -22066,7 +22089,13 @@ Tunnel Wizard -> Client Tunnel -> SOCKS 4/4a/5 -> enter a name -> le Now enter the address (e.g. 127.0.0.1) and the port you've picked before for the I2P Proxy. You can connect to Hidden Nodes, even if you are running a standard Node, so why not setup Tor and/or I2P? - + Tor-Socks-Proxy-Standard: 127.0.0.1:9050. In der Torrc-Konfiguration einstellen und hier aktualisieren. + +I2P-Socks-Proxy: Informationen zum Einrichten eines Client-Tunnels finden Sie unter http://127.0.0.1:7657/i2ptunnelmgr: +Tunnel-Assistent -> Client-Tunnel -> SOCKS 4/4a/5 -> geben Sie einen Namen ein -> lassen Sie „Outproxies“ leer -> geben Sie den Port ein (merken Sie sich!) [Vielleicht möchten Sie auch die Erreichbarkeit auf 127.0.0.1 setzen] -> Weiter -> 'Auto Start' ankreuzen -> Fertig! +Geben Sie nun die Adresse (z. B. 127.0.0.1) und den Port ein, den Sie zuvor für den I2P-Proxy ausgewählt haben. + +Sie können sich mit versteckten Knoten verbinden, auch wenn Sie einen Standardknoten betreiben. Warum also nicht Tor und/oder I2P einrichten? @@ -22081,12 +22110,12 @@ You can connect to Hidden Nodes, even if you are running a standard Node, so why I2P Instance address - + I2P-Instanzadresse 127.0.0.1 - 127.0.0.1 + 127.0.0.1 @@ -22106,17 +22135,17 @@ You can connect to Hidden Nodes, even if you are running a standard Node, so why Tunnel length (in/out) - + Tunnellänge (ein/aus) Tunnel quantity (in/out) - + Tunnelmenge (ein/aus) Tunnel variance (in/out) - + Tunnelvarianz (ein/aus) @@ -22126,22 +22155,22 @@ You can connect to Hidden Nodes, even if you are running a standard Node, so why load key - + Ladeschlüssel Start - Start + Start Restart - + Neustart Stop - Stop + Stop @@ -22177,7 +22206,18 @@ This is your external address on the Tor/I2P network. Finally make sure that the Ports match the configuration. If you have issues connecting over Tor check the Tor logs too. - + Um Verbindungen zu empfangen, müssen Sie zunächst einen versteckten Tor/I2P-Service einrichten. + +Für Tor: Siehe torrc und Dokumentation für HOWTO-Details. + +Für I2P: Informationen zum Einrichten eines Servertunnels finden Sie unter http://127.0.0.1:7657/i2ptunnelmgr: +Tunnel-Assistent -> Servertunnel -> Standard -> Geben Sie einen Namen ein -> Geben Sie die Adresse und den Port ein, den Ihr RS verwendet (siehe Lokale Adresse oben) -> Aktivieren Sie „Autostart“ -> Fertig! + +Sobald dies erledigt ist, fügen Sie die Onion/I2P (Base32)-Adresse in das Feld oben ein. +Dies ist Ihre externe Adresse im Tor/I2P-Netzwerk. +Stellen Sie abschließend sicher, dass die Ports mit der Konfiguration übereinstimmen. + +Wenn Sie Probleme beim Herstellen einer Verbindung über Tor haben, überprüfen Sie auch die Tor-Protokolle. @@ -22192,22 +22232,22 @@ If you have issues connecting over Tor check the Tor logs too. I2P Simple Anonymous Messaging - + SAM accessible - + SAM zugänglich SAM status - + Relay - + Relais @@ -22217,17 +22257,17 @@ If you have issues connecting over Tor check the Tor logs too. Use Relay Servers - + Verwenden Sie Relay-Server Relay options - + Relaisoptionen Number - + Nummer @@ -22237,7 +22277,7 @@ If you have issues connecting over Tor check the Tor logs too. Total Bandwidth - + Gesamtbandbreite @@ -22257,17 +22297,17 @@ If you have issues connecting over Tor check the Tor logs too. Total: - Gesamt: + Gesamt: Warning: This bandwidth adds up to the max bandwidth. - + Warnung: Diese Bandbreite summiert sich zur maximalen Bandbreite. Relay Server Setup - + Relay-Server-Setup @@ -22277,7 +22317,7 @@ If you have issues connecting over Tor check the Tor logs too. Server DHT Key - + Server-DHT-Schlüssel @@ -22393,7 +22433,7 @@ If you have issues connecting over Tor check the Tor logs too. List of OpenDns servers used. - + Liste der verwendeten OpenDns-Server. @@ -22408,7 +22448,7 @@ If you have issues connecting over Tor check the Tor logs too. I2P Socks Proxy - + @@ -22424,7 +22464,7 @@ If you have issues connecting over Tor check the Tor logs too. I2P outgoing Okay - + I2P ausgehend Okay @@ -22543,7 +22583,7 @@ If you have issues connecting over Tor check the Tor logs too. Outgoing Manual Tor/I2P - + Ausgehend manuelles Tor/I2P @@ -22553,7 +22593,7 @@ If you have issues connecting over Tor check the Tor logs too. Tor outgoing Okay - Tor ausgehend o. k. + Tor ausgehend Okay @@ -22862,7 +22902,7 @@ Wähle die Freunde, mit denen du den Kanal teilen willst. <html><head/><body><p>Forces the re-check of all shared directories. While automatic file checking only cares for new/removed files for efficiency reasons, this button will force the re-scan of all files, possibly re-hashing existing files that may have changed. </p></body></html> - + <html><head/><body><p>Erzwingt die erneute Ãœberprüfung aller freigegebenen Verzeichnisse. Während sich die automatische Dateiprüfung aus Effizienzgründen nur um neue/entfernte Dateien kümmert, erzwingt diese Schaltfläche die erneute Prüfung aller Dateien und führt möglicherweise ein erneutes Hashing vorhandener Dateien durch, die sich möglicherweise geändert haben. </p></body></html> @@ -22948,7 +22988,7 @@ Wähle die Freunde, mit denen du den Kanal teilen willst. More than 3000 results. Add more/longer search words to select less. - + Mehr als 3000 Ergebnisse. Fügen Sie mehr/längere Suchbegriffe hinzu, um weniger auszuwählen. @@ -22963,7 +23003,7 @@ Wähle die Freunde, mit denen du den Kanal teilen willst. More than %1 results. Add more/longer search words to select less. - + Mehr als %1 Ergebnisse. Fügen Sie mehr/längere Suchbegriffe hinzu, um weniger auszuwählen. @@ -22991,7 +23031,7 @@ Wähle die Freunde, mit denen du den Kanal teilen willst. New Msg - Neue Nachr. + Neue Nachricht @@ -23960,7 +24000,7 @@ p, li { white-space: pre-wrap; } Maximum depth (0=unlimited): - + Maximale Tiefe (0=unbegrenzt): @@ -24034,7 +24074,7 @@ p, li { white-space: pre-wrap; } Maximum uploads per friend (0 = no limit) - + Maximale Uploads pro Freund (0 = keine Begrenzung) @@ -24144,7 +24184,7 @@ p, li { white-space: pre-wrap; } On Windows systems, randomly writing in the middle of large empty files may hang the software for several seconds. Do you want to use this option anyway (otherwise use "progressive")? - + Auf Windows-Systemen kann das zufällige Schreiben in die Mitte großer leerer Dateien dazu führen, dass die Software mehrere Sekunden lang hängen bleibt. Möchten Sie diese Option trotzdem verwenden (andernfalls „progressiv“ verwenden)? @@ -24424,7 +24464,7 @@ p, li { white-space: pre-wrap; } <h1><img width="%1" src=":/icons/help_64.png">&nbsp;&nbsp; File Transfer</h1><p>Retroshare brings two ways of transferring files: direct transfers from your friends, and distant anonymous tunnelled transfers. In addition, file transfer is multi-source and allows swarming (you can be a source while downloading)</p><p>You can share files using the <img src=":/images/directoryadd_24x24_shadow.png" width=%2 /> icon from the left side bar. These files will be listed in the My Files tab. You can decide for each friend group whether they can or not see these files in their Friends Files tab</p><p>The search tab reports files from your friends' file lists, and distant files that can be reached anonymously using the multi-hop tunnelling system.</p> - + <h1><img width="%1" src=":/icons/help_64.png">&nbsp;&nbsp; Dateiübertragung</h1><p>Retroshare bietet zwei Möglichkeiten, Dateien zu übertragen: direkte Ãœbertragungen von Ihren Freunden und anonyme, getunnelte Fernübertragungen. Außerdem ist der Dateitransfer quellenübergreifend und erlaubt das Schwärmen (Sie können beim Herunterladen eine Quelle sein)</p><p>Sie können Dateien über das Symbol <img src=":/images/directoryadd_24x24_shadow.png" width=%2 /> in der linken Seitenleiste teilen. Diese Dateien werden in der Registerkarte "Meine Dateien" aufgelistet. Sie können für jede Freundesgruppe entscheiden, ob sie diese Dateien in der Registerkarte "Dateien von Freunden" sehen können oder nicht</p><p>Die Registerkarte "Suchen" zeigt Dateien aus den Dateilisten Ihrer Freunde und entfernte Dateien an, die über das Multi-Hop-Tunnelsystem anonym erreicht werden können.</p> @@ -24513,7 +24553,7 @@ p, li { white-space: pre-wrap; } On Windows systems, writing in the middle of large empty files may hang the software for several seconds. Do you want to use this option anyway? - + Auf Windows-Systemen kann das Schreiben in der Mitte großer leerer Dateien dazu führen, dass die Software für einige Sekunden hängen bleibt. Möchten Sie diese Option trotzdem verwenden? @@ -25334,7 +25374,7 @@ p, li { white-space: pre-wrap; } Cancel - Abbrechen + Abbrechen @@ -25680,7 +25720,7 @@ p, li { white-space: pre-wrap; } All Time - Allzeit + Allzeit @@ -25925,7 +25965,7 @@ p, li { white-space: pre-wrap; } PB petabytes (1024 terabytes) - + @@ -26002,7 +26042,7 @@ p, li { white-space: pre-wrap; } Do you accept connections signed by this profile? - + Akzeptieren Sie von diesem Profil signierte Verbindungen? @@ -26012,22 +26052,22 @@ p, li { white-space: pre-wrap; } This column indicates the trust level you indicated and whether you signed the profile PGP key - + In dieser Spalte wird die von Ihnen angegebene Vertrauensstufe angezeigt und ob Sie den PGP-Schlüssel des Profils signiert haben Did that peer sign your own profile PGP key - + Hat dieser Peer Ihren eigenen Profil-PGP-Schlüssel signiert PGP Key Id of that profile - + PGP-Schlüssel-ID dieses Profils Last time this key was used (received time, or to check connection) - + Wann dieser Schlüssel zuletzt verwendet wurde (Empfangszeit oder zur Ãœberprüfung der Verbindung) @@ -26042,12 +26082,12 @@ p, li { white-space: pre-wrap; } Trust level - + Vertrauens Level Has signed your key? - + Haben Sie Ihren Schlüssel signiert? @@ -26067,17 +26107,17 @@ p, li { white-space: pre-wrap; } Marginally trusted peer - + Wenig vertrauenswürdiger Peer Fully trusted peer - + Völlig vertrauenswürdige rPeer Untrusted peer - + Nicht vertrauenswürdiger Peer @@ -26128,7 +26168,8 @@ p, li { white-space: pre-wrap; } has authenticated you. Right-click and select 'make friend' to be able to connect. - + hat dich authentifiziert. +Klicken Sie mit der rechten Maustaste und wählen Sie „Freundschaft schließen“, um eine Verbindung herzustellen. diff --git a/retroshare-gui/src/main.cpp b/retroshare-gui/src/main.cpp index 13710a28b..228f24067 100644 --- a/retroshare-gui/src/main.cpp +++ b/retroshare-gui/src/main.cpp @@ -29,6 +29,10 @@ CrashStackTrace gCrashStackTrace; #include #include #include +#include +#include +#include +#include #include #include "gui/common/FilesDefs.h" @@ -91,10 +95,10 @@ CrashStackTrace gCrashStackTrace; extern "C" { __declspec(dllexport) __cdecl BOOL _OPENSSL_isservice(void) { - DWORD sess; - if (ProcessIdToSessionId(GetCurrentProcessId(),&sess)) - return sess==0; - return FALSE; + DWORD sess; + if (ProcessIdToSessionId(GetCurrentProcessId(),&sess)) + return sess==0; + return FALSE; } } #endif @@ -106,286 +110,468 @@ __declspec(dllexport) __cdecl BOOL _OPENSSL_isservice(void) #include "gui/notifyqt.h" #include +static void showHelp(const argstream& as) +{ + RsInfo() << "\n" << + "+================================================================+\n" + "| o---o o |\n" + "| \\ / - Retroshare GUI - / \\ |\n" + "| o o---o |\n" + "+================================================================+" + << std::endl ; + + std::cerr << as.usage(false) << std::endl; + + char *argv[1]; + int argc=0; + QApplication dummyApp (argc, argv); // needed for QMessageBox + QMessageBox box; + QString text = QString::fromUtf8(as.usage(false,false).c_str()); + QFont font("Courier New",10,50,false); + font.setStyleHint(QFont::TypeWriter,QFont::PreferMatch); + font.setStyle(QFont::StyleNormal); + font.setBold(true); + box.setFont(font); + box.setInformativeText(text); + box.setWindowTitle(QObject::tr("Retroshare commandline arguments")); + + // now compute the size of text and set the size of the box. For the record, this doesn't work... + box.setBaseSize( QSize(QFontMetricsF(font).width(text),QFontMetricsF(font).height()*text.count('\n')) ); + box.exec(); +} + +static bool notifyRunningInstance() +{ + // Connect to the Local Server of the main process to notify it + // that a new process had been started + + RsInfo() << "Trying to contact running instance through socket \"" << TARGET << "\""; + QLocalSocket localSocket; + localSocket.connectToServer(QString(TARGET)); +#ifdef DEBUG + std::cerr << "RsApplication::RsApplication waitForConnected to other instance." << std::endl; +#endif + if( localSocket.waitForConnected(100) ) + { +#ifdef DEBUG + std::cerr << "RsApplication::RsApplication Connection etablished. Waiting for disconnection." << std::endl; +#endif + localSocket.waitForDisconnected(1000); + return true; + } + else + { +#ifdef DEBUG + std::cerr << "RsApplication::RsApplication failed to connect to other instance." << std::endl; +#endif + return false; + } +} + +static void sendArgsToRunningInstance(const QStringList& args) +{ + QString serverName = QString(TARGET); + + // load into shared memory + QBuffer buffer; + buffer.open(QBuffer::ReadWrite); + QDataStream out(&buffer); + out << args; + int size = buffer.size(); + + QSharedMemory newArgs; + newArgs.setKey(serverName + "_newArgs"); + if (newArgs.isAttached()) newArgs.detach(); + + if (!newArgs.create(size)) { + std::cerr << "(EE) RsApplication::RsApplication Unable to create shared memory segment of size:" + << size << " error:" << newArgs.errorString().toStdString() << "." << std::endl; +#ifdef Q_OS_UNIX + std::cerr << "Look with `ipcs -m` for nattch==0 segment. And remove it with `ipcrm -m 'shmid'`." << std::endl; + //No need for windows, as it removes shared segment directly even when crash. +#endif + newArgs.detach(); + ::exit(EXIT_FAILURE); + } + newArgs.lock(); + char *to = (char*)newArgs.data(); + const char *from = buffer.data().data(); + memcpy(to, from, qMin(newArgs.size(), size)); + newArgs.unlock(); + + std::cerr << "RsApplication::RsApplication waitForConnected to other instance." << std::endl; + if(notifyRunningInstance()) + { + newArgs.detach(); + std::cerr << "RsApplication::RsApplication Arguments was sended." << std::endl + << " To disable it, in Options - General - Misc," << std::endl + << " uncheck \"Use Local Server to get new Arguments\"." << std::endl; + ::exit(EXIT_SUCCESS); // Terminate the program using STDLib's exit function + } + else + std::cerr << "RsApplication::RsApplication failed to connect to other instance." << std::endl; + newArgs.detach(); +} + +static bool setLanguage(const std::string& language) +{ + if(!language.empty()) + { + if(!LanguageSupport::translate(QString::fromStdString(language))) + { + RsErr() << "Language \"" << language << "\" is not supported." ; + + QString s; + for(QString ss:LanguageSupport::languageCodes()) + s += ss + ", " ; + + RsErr() << "Possible choices are: " << s.toStdString(); + return false; + } + return true; + } + else + { + LanguageSupport::translate(LanguageSupport::defaultLanguageCode()); + return true; + } +} + + static void displayWarningAboutDSAKeys() { - std::map > unsupported_keys; - RsAccounts::GetUnsupportedKeys(unsupported_keys); - - if(unsupported_keys.empty()) - return ; + std::map > unsupported_keys; + RsAccounts::GetUnsupportedKeys(unsupported_keys); - QMessageBox msgBox; + if(unsupported_keys.empty()) + return ; - QString txt = QObject::tr("You appear to have nodes associated to DSA keys:"); - txt += "
    " ; - for(std::map >::const_iterator it(unsupported_keys.begin());it!=unsupported_keys.end();++it) - { - txt += "
  • " + QString::fromStdString(it->first) ; - txt += "
      " ; + QMessageBox msgBox; - for(uint32_t i=0;isecond.size();++i) - txt += "
    • " + QString::fromStdString(it->second[i]) + "
    • " ; + QString txt = QObject::tr("You appear to have nodes associated to DSA keys:"); + txt += "
        " ; + for(std::map >::const_iterator it(unsupported_keys.begin());it!=unsupported_keys.end();++it) + { + txt += "
      • " + QString::fromStdString(it->first) ; + txt += "
          " ; - txt += "
        " ; - txt += "
      • " ; - } - txt += "
      " ; + for(uint32_t i=0;isecond.size();++i) + txt += "
    • " + QString::fromStdString(it->second[i]) + "
    • " ; - msgBox.setText(txt) ; - msgBox.setInformativeText(QObject::tr("DSA keys are not yet supported by this version of RetroShare. All these nodes will be unusable. We're very sorry for that.")); - msgBox.setStandardButtons(QMessageBox::Ok); - msgBox.setDefaultButton(QMessageBox::Ok); + txt += "
    " ; + txt += "
  • " ; + } + txt += "
" ; + + msgBox.setText(txt) ; + msgBox.setInformativeText(QObject::tr("DSA keys are not yet supported by this version of RetroShare. All these nodes will be unusable. We're very sorry for that.")); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setDefaultButton(QMessageBox::Ok); msgBox.setWindowIcon(FilesDefs::getIconFromQtResourcePath(":/icons/logo_128.png")); - msgBox.exec(); + msgBox.exec(); } #ifdef WINDOWS_SYS #if QT_VERSION >= QT_VERSION_CHECK (5, 0, 0) && QT_VERSION < QT_VERSION_CHECK (5, 3, 0) QStringList filedialog_open_filenames_hook(QWidget * parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options) { - return QFileDialog::getOpenFileNames(parent, caption, dir, filter, selectedFilter, options | QFileDialog::DontUseNativeDialog); + return QFileDialog::getOpenFileNames(parent, caption, dir, filter, selectedFilter, options | QFileDialog::DontUseNativeDialog); } QString filedialog_open_filename_hook(QWidget * parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options) { - return QFileDialog::getOpenFileName(parent, caption, dir, filter, selectedFilter, options | QFileDialog::DontUseNativeDialog); + return QFileDialog::getOpenFileName(parent, caption, dir, filter, selectedFilter, options | QFileDialog::DontUseNativeDialog); } QString filedialog_save_filename_hook(QWidget * parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options) { - return QFileDialog::getSaveFileName(parent, caption, dir, filter, selectedFilter, options | QFileDialog::DontUseNativeDialog); + return QFileDialog::getSaveFileName(parent, caption, dir, filter, selectedFilter, options | QFileDialog::DontUseNativeDialog); } QString filedialog_existing_directory_hook(QWidget *parent, const QString &caption, const QString &dir, QFileDialog::Options options) { - return QFileDialog::getExistingDirectory(parent, caption, dir, options | QFileDialog::DontUseNativeDialog); + return QFileDialog::getExistingDirectory(parent, caption, dir, options | QFileDialog::DontUseNativeDialog); } #endif #endif int main(int argc, char *argv[]) -{ +{ #ifdef WINDOWS_SYS - // The current directory of the application is changed when using the native dialog on Windows - // This is a quick fix until libretroshare is using a absolute path in the portable Version + // The current directory of the application is changed when using the native dialog on Windows + // This is a quick fix until libretroshare is using a absolute path in the portable Version #if QT_VERSION >= QT_VERSION_CHECK (5, 3, 0) - // Do we need a solution in v0.6? + // Do we need a solution in v0.6? #endif #if QT_VERSION >= QT_VERSION_CHECK (5, 0, 0) && QT_VERSION < QT_VERSION_CHECK (5, 3, 0) - typedef QStringList (*_qt_filedialog_open_filenames_hook)(QWidget * parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options); - typedef QString (*_qt_filedialog_open_filename_hook) (QWidget * parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options); - typedef QString (*_qt_filedialog_save_filename_hook) (QWidget * parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options); - typedef QString (*_qt_filedialog_existing_directory_hook)(QWidget *parent, const QString &caption, const QString &dir, QFileDialog::Options options); + typedef QStringList (*_qt_filedialog_open_filenames_hook)(QWidget * parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options); + typedef QString (*_qt_filedialog_open_filename_hook) (QWidget * parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options); + typedef QString (*_qt_filedialog_save_filename_hook) (QWidget * parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options); + typedef QString (*_qt_filedialog_existing_directory_hook)(QWidget *parent, const QString &caption, const QString &dir, QFileDialog::Options options); - extern Q_GUI_EXPORT _qt_filedialog_open_filename_hook qt_filedialog_open_filename_hook; - extern Q_GUI_EXPORT _qt_filedialog_open_filenames_hook qt_filedialog_open_filenames_hook; - extern Q_GUI_EXPORT _qt_filedialog_save_filename_hook qt_filedialog_save_filename_hook; - extern Q_GUI_EXPORT _qt_filedialog_existing_directory_hook qt_filedialog_existing_directory_hook; + extern Q_GUI_EXPORT _qt_filedialog_open_filename_hook qt_filedialog_open_filename_hook; + extern Q_GUI_EXPORT _qt_filedialog_open_filenames_hook qt_filedialog_open_filenames_hook; + extern Q_GUI_EXPORT _qt_filedialog_save_filename_hook qt_filedialog_save_filename_hook; + extern Q_GUI_EXPORT _qt_filedialog_existing_directory_hook qt_filedialog_existing_directory_hook; - qt_filedialog_open_filename_hook = filedialog_open_filename_hook; - qt_filedialog_open_filenames_hook = filedialog_open_filenames_hook; - qt_filedialog_save_filename_hook = filedialog_save_filename_hook; - qt_filedialog_existing_directory_hook = filedialog_existing_directory_hook; + qt_filedialog_open_filename_hook = filedialog_open_filename_hook; + qt_filedialog_open_filenames_hook = filedialog_open_filenames_hook; + qt_filedialog_save_filename_hook = filedialog_save_filename_hook; + qt_filedialog_existing_directory_hook = filedialog_existing_directory_hook; #endif #if QT_VERSION < QT_VERSION_CHECK (5, 0, 0) - extern bool Q_GUI_EXPORT qt_use_native_dialogs; - qt_use_native_dialogs = false; + extern bool Q_GUI_EXPORT qt_use_native_dialogs; + qt_use_native_dialogs = false; #endif - { - /* Set the current directory to the application dir, - because the start dir with autostart from the registry run key is not the exe dir */ - QApplication app(argc, argv); - QDir::setCurrent(QCoreApplication::applicationDirPath()); - } + { + /* Set the current directory to the application dir, + because the start dir with autostart from the registry run key is not the exe dir */ + QApplication app(argc, argv); + QDir::setCurrent(QCoreApplication::applicationDirPath()); + } #endif #ifdef SIGFPE_DEBUG feenableexcept(FE_INVALID | FE_DIVBYZERO); #endif - QStringList args = char_array_to_stringlist(argv+1, argc-1); + QStringList args = char_array_to_stringlist(argv+1, argc-1); Q_INIT_RESOURCE(images); Q_INIT_RESOURCE(icons); - // Loop through all command-line args/values to get help wanted before RsInit exit. - for (int i = 0; i < args.size(); ++i) { - QString arg; - /* Get the argument name and set a blank value */ - arg = args.at(i); - if ((arg.toLower() == "-h") || (arg.toLower() == "--help")) { - QApplication dummyApp (argc, argv); // needed for QMessageBox - Rshare::showUsageMessageBox(); - } - } + // This is needed to allocate rsNotify, so that it can be used to ask for PGP passphrase + // + RsControl::earlyInitNotificationSystem() ; - // This is needed to allocate rsNotify, so that it can be used to ask for PGP passphrase - // - RsControl::earlyInitNotificationSystem() ; + NotifyQt *notify = NotifyQt::Create(); + rsNotify->registerNotifyClient(notify); - NotifyQt *notify = NotifyQt::Create(); - rsNotify->registerNotifyClient(notify); + /* RetroShare Core Objects */ + RsInit::InitRsConfig(); - /* RetroShare Core Objects */ - RsInit::InitRsConfig(); + RsGUIConfigOptions conf; - RsConfigOptions conf; + std::string rslink,rsfile; + std::list links_and_files; + std::string loglevel="off"; + std::string logfilename,language,guistyle,guistylesheetfile; - argstream as(argc,argv); - as >> option('s',"stderr" ,conf.outStderr ,"output to stderr instead of log file." ) - >> option('u',"udp" ,conf.udpListenerOnly,"Only listen to UDP." ) - >> parameter('c',"base-dir" ,conf.optBaseDir ,"directory", "Set base directory." ,false) - >> parameter('l',"log-file" ,conf.logfname ,"logfile" ,"Set Log filename." ,false) - >> parameter('d',"debug-level" ,conf.debugLevel ,"level" ,"Set debug level." ,false) - >> parameter('i',"ip-address" ,conf.forcedInetAddress,"nnn.nnn.nnn.nnn", "Force IP address to use (if cannot be detected)." ,false) - >> parameter('p',"port" ,conf.forcedPort ,"port" ,"Set listenning port to use." ,false) - >> parameter('o',"opmode" ,conf.opModeStr ,"opmode" ,"Set Operating mode (Full, NoTurtle, Gaming, Minimal)." ,false) - >> parameter('t',"opmode" ,conf.userSuppliedTorExecutable,"tor" ,"supply full tor eecutable path." ,false); + argstream as(argc,argv); + as >> option( 's',"stderr" ,conf.outStderr ,"output to stderr instead of log file " ) + >> option( 'u',"udp" ,conf.udpListenerOnly ,"Only listen to UDP " ) + >> option( 'R',"reset" ,conf.optResetParams ,"reset retroshare parameters " ) + >> parameter('c',"base-dir" ,conf.optBaseDir ,"directory" ,"Set base directory " ,false) + >> parameter('l',"log-file" ,logfilename ,"logfile" ,"Set Log filename " ,false) + >> parameter('d',"debug-level" ,loglevel ,"level (debug,info,notice,warn,error,off)","Set debug level " ,false) + >> parameter('i',"ip-address" ,conf.forcedInetAddress ,"nnn.nnn.nnn.nnn" ,"Force IP address " ,false) + >> parameter('p',"port" ,conf.forcedPort ,"port" ,"Set listenning port " ,false) + >> parameter('o',"opmode" ,conf.opModeStr ,"opmode (Full, NoTurtle, Gaming, Minimal)","Set mode" ,false) + >> parameter('t',"tor" ,conf.userSuppliedTorExecutable,"path" ,"supply full tor executable path " ,false) + >> parameter('g',"style" ,guistyle ,"style (fusion,windows,gtk2,breeze)" ,"set GUI style" ,false) + >> parameter('k',"style" ,guistylesheetfile ,"file" ,"gui stylesheet file" ,false) + >> parameter('L',"lang" ,language ,"langage (fr,cn,...)" ,"set language" ,false) + >> parameter('r',"link" ,rslink ,"retroshare link" ,"retroshare link to open (passed to running server)" ,false) + >> parameter('f',"rsfile" ,rsfile ,"rsfile" ,"rscollection file to open (passed to running server)" ,false); #ifdef RS_JSONAPI - as >> parameter('J', "jsonApiPort", conf.jsonApiPort, "jsonApiPort", "Enable JSON API on the specified port", false ) - >> parameter('P', "jsonApiBindAddress", conf.jsonApiBindAddress, "jsonApiBindAddress", "JSON API Bind Address.", false); + as >> parameter('J', "jsonApiPort" ,conf.jsonApiPort ,"jsonApiPort" ,"Enable JSON API on the specified port" ,false) + >> parameter('P', "jsonApiBindAddress",conf.jsonApiBindAddress ,"jsonApiBindAddress" ,"JSON API Bind Address " ,false); #endif // ifdef RS_JSONAPI #ifdef LOCALNET_TESTING - as >> parameter('R',"restrict-port" ,portRestrictions ,"port1-port2","Apply port restriction" ,false); + as >> parameter('R',"restrict-port" ,portRestrictions ,"port1-port2","Apply port restriction " ,false); #endif // ifdef LOCALNET_TESTING #ifdef RS_AUTOLOGIN - as >> option('a',"auto-login" ,conf.autoLogin ,"AutoLogin (Windows Only) + StartMinimised"); + as >> option('a',"auto-login" ,conf.autoLogin ,"AutoLogin (Windows Only) + StartMinimised"); #endif // ifdef RS_AUTOLOGIN + as >> values(std::back_inserter(links_and_files),"links and rscollection files") + >> help('h',"help",QObject::tr("Display this help").toStdString().c_str()); + + if(!as.isOk()) + { + std::cerr << "Incorrect arguments." << std::endl; + std::cerr << as.usage() << std::endl; + return 0; + } + conf.logFileName = QString::fromStdString(logfilename); + conf.logLevel = QString::fromStdString(loglevel); // these will be checked when used in RsApplication + conf.guiStyle = QString::fromStdString(guistyle); // these will be checked when used in RsApplication + conf.guiStyleSheetFile = QString::fromUtf8(guistylesheetfile.c_str());// these will be checked when used in RsApplication + + if(as.helpRequested()) + { + showHelp(as); + return 0; + } + // Look for parameters to be transmitted to running server + + if((!rslink.empty() || !rsfile.empty() || !links_and_files.empty() || !conf.opModeStr.empty()) && notifyRunningInstance()) + { + QStringList args; + RsErr() << "Sending rscollection files, retroshare links and opmode parameters to the runnning retroshare server." ; + + if(!rslink.empty()) { args.push_back("-l"); args.push_back(QString::fromUtf8(rslink.c_str())); } + if(!rsfile.empty()) { args.push_back("-f"); args.push_back(QString::fromUtf8(rsfile.c_str())); } + + for(auto s:links_and_files) + args.push_back(QString::fromUtf8(s.c_str())); + + if(!conf.opModeStr.empty()) { args.push_back("-o"); args.push_back(QString::fromStdString(conf.opModeStr)); } + + sendArgsToRunningInstance(args); + return 0; + } + + // Now start RS login system conf.main_executable_path = argv[0]; - int initResult = RsInit::InitRetroShare(conf); + int initResult = RsInit::InitRetroShare(conf); - if(initResult == RS_INIT_NO_KEYRING) // happens when we already have accounts, but no pgp key. This is when switching to the openpgp-sdk version. - { - QApplication dummyApp (argc, argv); // needed for QMessageBox - /* Translate into the desired language */ - LanguageSupport::translate(LanguageSupport::defaultLanguageCode()); + if(initResult == RS_INIT_NO_KEYRING) // happens when we already have accounts, but no pgp key. This is when switching to the openpgp-sdk version. + { + QApplication dummyApp (argc, argv); // needed for QMessageBox + /* Translate into the desired language */ - QMessageBox msgBox; - msgBox.setText(QObject::tr("This version of RetroShare is using OpenPGP-SDK. As a side effect, it's not using the system shared PGP keyring, but has it's own keyring shared by all RetroShare instances.

You do not appear to have such a keyring, although PGP keys are mentioned by existing RetroShare accounts, probably because you just changed to this new version of the software.")); - msgBox.setInformativeText(QObject::tr("Choose between:
  • Ok to copy the existing keyring from gnupg (safest bet), or
  • Close without saving to start fresh with an empty keyring (you will be asked to create a new PGP key to work with RetroShare, or import a previously saved pgp keypair).
  • Cancel to quit and forge a keyring by yourself (needs some PGP skills)
")); - msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Discard | QMessageBox::Cancel); - msgBox.setDefaultButton(QMessageBox::Ok); + if(!setLanguage(language)) + return 1; + + QMessageBox msgBox; + msgBox.setText(QObject::tr("This version of RetroShare is using OpenPGP-SDK. As a side effect, it's not using the system shared PGP keyring, but has it's own keyring shared by all RetroShare instances.

You do not appear to have such a keyring, although PGP keys are mentioned by existing RetroShare accounts, probably because you just changed to this new version of the software.")); + msgBox.setInformativeText(QObject::tr("Choose between:
  • Ok to copy the existing keyring from gnupg (safest bet), or
  • Close without saving to start fresh with an empty keyring (you will be asked to create a new PGP key to work with RetroShare, or import a previously saved pgp keypair).
  • Cancel to quit and forge a keyring by yourself (needs some PGP skills)
")); + msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Discard | QMessageBox::Cancel); + msgBox.setDefaultButton(QMessageBox::Ok); msgBox.setWindowIcon(FilesDefs::getIconFromQtResourcePath(":/icons/logo_128.png")); - int ret = msgBox.exec(); + int ret = msgBox.exec(); - if(ret == QMessageBox::Cancel) - return 0 ; - if(ret == QMessageBox::Ok) - { - if(!RsAccounts::CopyGnuPGKeyrings()) - return 0 ; + if(ret == QMessageBox::Cancel) + return 0 ; + if(ret == QMessageBox::Ok) + { + if(!RsAccounts::CopyGnuPGKeyrings()) + return 0 ; - initResult = RsInit::InitRetroShare(conf); + initResult = RsInit::InitRetroShare(conf); - displayWarningAboutDSAKeys() ; + displayWarningAboutDSAKeys() ; - } - else - initResult = RS_INIT_OK ; - } + } + else + initResult = RS_INIT_OK ; + } - if (initResult < 0) { - /* Error occured */ - QApplication dummyApp (argc, argv); // needed for QMessageBox - /* Translate into the desired language */ - LanguageSupport::translate(LanguageSupport::defaultLanguageCode()); + if (initResult < 0) { + /* Error occured */ + QApplication dummyApp (argc, argv); // needed for QMessageBox + /* Translate into the desired language */ - displayWarningAboutDSAKeys(); + if(!setLanguage(language)) + return 1; - QMessageBox mb(QMessageBox::Critical, QObject::tr("RetroShare"), "", QMessageBox::Ok); + displayWarningAboutDSAKeys(); + + QMessageBox mb(QMessageBox::Critical, QObject::tr("RetroShare"), "", QMessageBox::Ok); mb.setWindowIcon(FilesDefs::getIconFromQtResourcePath(":/icons/logo_128.png")); - switch (initResult) - { - case RS_INIT_AUTH_FAILED: - std::cerr << "RsInit::InitRetroShare AuthGPG::InitAuth failed" << std::endl; - mb.setText(QObject::tr("Initialization failed. Wrong or missing installation of PGP.")); - break; - default: - /* Unexpected return code */ - std::cerr << "RsInit::InitRetroShare unexpected return code " << initResult << std::endl; - mb.setText(QObject::tr("An unexpected error occurred. Please report 'RsInit::InitRetroShare unexpected return code %1'.").arg(initResult)); - break; - } - mb.exec(); - return 1; - } + switch (initResult) + { + case RS_INIT_AUTH_FAILED: + std::cerr << "RsInit::InitRetroShare AuthGPG::InitAuth failed" << std::endl; + mb.setText(QObject::tr("Initialization failed. Wrong or missing installation of PGP.")); + break; + default: + /* Unexpected return code */ + std::cerr << "RsInit::InitRetroShare unexpected return code " << initResult << std::endl; + mb.setText(QObject::tr("An unexpected error occurred. Please report 'RsInit::InitRetroShare unexpected return code %1'.").arg(initResult)); + break; + } + mb.exec(); + return 1; + } - /* create global settings object - path maybe wrong, when no profile exist - in this case it can be use only for default values */ - RshareSettings::Create (); + /* create global settings object + path maybe wrong, when no profile exist + in this case it can be use only for default values */ + RshareSettings::Create (); - /* Setup The GUI Stuff */ - Rshare rshare(args, argc, argv, QString::fromUtf8(RsAccounts::ConfigDirectory().c_str())); + if(LanguageSupport::isValidLanguageCode(QString::fromStdString(language))) + conf.language = QString::fromStdString(language); - /* Start RetroShare */ - QString sDefaultGXSIdToCreate = ""; - switch (initResult) { - case RS_INIT_OK: - { - /* Login Dialog */ - /* check for existing Certificate */ - bool genCert = false; - std::list accountIds; - if (RsAccounts::GetAccountIds(accountIds) && (accountIds.size() > 0)) - { - StartDialog sd; - if (sd.exec() == QDialog::Rejected) { - return 1; - } + /* Setup The GUI Stuff */ + //Rshare rshare(args, argc, argv, QString::fromUtf8(RsAccounts::ConfigDirectory().c_str())); + RsApplication rshare(conf); - /* if we're logged in */ - genCert = sd.requestedNewCert(); - } - else - { - genCert = true; - } + if(!setLanguage(language)) + return 1; - if (genCert) - { - GenCertDialog gd(false); + /* Start RetroShare */ + QString sDefaultGXSIdToCreate = ""; + switch (initResult) { + case RS_INIT_OK: + { + /* Login Dialog */ + /* check for existing Certificate */ + bool genCert = false; + std::list accountIds; + if (RsAccounts::GetAccountIds(accountIds) && (accountIds.size() > 0)) + { + StartDialog sd; + if (sd.exec() == QDialog::Rejected) { + return 1; + } - if (gd.exec () == QDialog::Rejected) - return 1; + /* if we're logged in */ + genCert = sd.requestedNewCert(); + } + else + { + genCert = true; + } - sDefaultGXSIdToCreate = gd.getGXSNickname(); - } + if (genCert) + { + GenCertDialog gd(false); - //splashScreen.show(); - } - break; - case RS_INIT_HAVE_ACCOUNT: - { - //splashScreen.show(); - //splashScreen.showMessage(rshare.translate("SplashScreen", "Load profile"), Qt::AlignHCenter | Qt::AlignBottom); + if (gd.exec () == QDialog::Rejected) + return 1; - RsPeerId preferredId; - RsAccounts::GetPreferredAccountId(preferredId); + sDefaultGXSIdToCreate = gd.getGXSNickname(); + } - // true: note auto-login is active - Rshare::loadCertificate(preferredId, true); - } - break; - default: - /* Unexpected return code */ - std::cerr << "RsInit::InitRetroShare unexpected return code " << initResult << std::endl; - QMessageBox::warning(0, QObject::tr("RetroShare"), QObject::tr("An unexpected error occured. Please report 'RsInit::InitRetroShare unexpected return code %1'.").arg(initResult)); - return 1; - } + //splashScreen.show(); + } + break; + case RS_INIT_HAVE_ACCOUNT: + { + //splashScreen.show(); + //splashScreen.showMessage(rshare.translate("SplashScreen", "Load profile"), Qt::AlignHCenter | Qt::AlignBottom); + + RsPeerId preferredId; + RsAccounts::GetPreferredAccountId(preferredId); + + // true: note auto-login is active + if(!RsApplication::loadCertificate(preferredId, true)) + { + RsErr() << "Retroshare auto-login startup failed." ; + return 1; + } + } + break; + default: + /* Unexpected return code */ + std::cerr << "RsInit::InitRetroShare unexpected return code " << initResult << std::endl; + QMessageBox::warning(0, QObject::tr("RetroShare"), QObject::tr("An unexpected error occured. Please report 'RsInit::InitRetroShare unexpected return code %1'.").arg(initResult)); + return 1; + } /* recreate global settings object, now with correct path, specific to the selected node */ - RshareSettings::Create(true); - Rshare::resetLanguageAndStyle(); + RshareSettings::Create(true); + RsApplication::resetLanguageAndStyle(); - SoundManager::create(); + SoundManager::create(); bool is_hidden_node = false; bool is_auto_tor = false ; @@ -394,15 +580,15 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO); RsAccounts::getCurrentAccountOptions(is_hidden_node,is_auto_tor,is_first_time); if(is_auto_tor) - { + { if(!conf.userSuppliedTorExecutable.empty()) RsTor::setTorExecutablePath(conf.userSuppliedTorExecutable); - // Now that we know the Tor service running, and we know the SSL id, we can make sure it provides a viable hidden service + // Now that we know the Tor service running, and we know the SSL id, we can make sure it provides a viable hidden service std::string tor_hidden_service_dir = RsAccounts::AccountDirectory() + "/hidden_service/" ; - RsTor::setTorDataDirectory(Rshare::dataDirectory().toStdString() + "/tor/"); + RsTor::setTorDataDirectory(RsApplication::dataDirectory().toStdString() + "/tor/"); RsTor::setHiddenServiceDirectory(tor_hidden_service_dir); // re-set it, because now it's changed to the specific location that is run RsDirUtil::checkCreateDirectory(std::string(tor_hidden_service_dir)) ; @@ -410,72 +596,72 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO); //RsTor::setupHiddenService(); if(! RsTor::start() || RsTor::hasError()) - { + { QMessageBox::critical(NULL,QObject::tr("Cannot start Tor Manager!"),QObject::tr("Tor cannot be started on your system: \n\n")+QString::fromStdString(RsTor::errorMessage())) ; - return 1 ; - } + return 1 ; + } - { + { TorControlDialog tcd; - QString error_msg ; - tcd.show(); + QString error_msg ; + tcd.show(); - while(tcd.checkForTor(error_msg) != TorControlDialog::TOR_STATUS_OK || tcd.checkForHiddenService() != TorControlDialog::HIDDEN_SERVICE_STATUS_OK) // runs until some status is reached: either tor works, or it fails. - { - QCoreApplication::processEvents(); - rstime::rs_usleep(0.2*1000*1000) ; + while(tcd.checkForTor(error_msg) != TorControlDialog::TOR_STATUS_OK || tcd.checkForHiddenService() != TorControlDialog::HIDDEN_SERVICE_STATUS_OK) // runs until some status is reached: either tor works, or it fails. + { + QCoreApplication::processEvents(); + rstime::rs_usleep(0.2*1000*1000) ; - if(!error_msg.isNull()) - { - QMessageBox::critical(NULL,QObject::tr("Cannot start Tor"),QObject::tr("Sorry but Tor cannot be started on your system!\n\nThe error reported is:\"")+error_msg+"\"") ; - return 1; - } - } + if(!error_msg.isNull()) + { + QMessageBox::critical(NULL,QObject::tr("Cannot start Tor"),QObject::tr("Sorry but Tor cannot be started on your system!\n\nThe error reported is:\"")+error_msg+"\"") ; + return 1; + } + } - tcd.hide(); + tcd.hide(); - if(tcd.checkForHiddenService() != TorControlDialog::HIDDEN_SERVICE_STATUS_OK) - { - QMessageBox::critical(NULL,QObject::tr("Cannot start a hidden tor service!"),QObject::tr("It was not possible to start a hidden service.")) ; - return 1 ; - } - } - } + if(tcd.checkForHiddenService() != TorControlDialog::HIDDEN_SERVICE_STATUS_OK) + { + QMessageBox::critical(NULL,QObject::tr("Cannot start a hidden tor service!"),QObject::tr("It was not possible to start a hidden service.")) ; + return 1 ; + } + } + } QSplashScreen splashScreen(FilesDefs::getPixmapFromQtResourcePath(":/images/logo/logo_splash.png")/* , Qt::WindowStaysOnTopHint*/); - splashScreen.show(); - splashScreen.showMessage(rshare.translate("SplashScreen", "Load configuration"), Qt::AlignHCenter | Qt::AlignBottom); + splashScreen.show(); + splashScreen.showMessage(rshare.translate("SplashScreen", "Load configuration"), Qt::AlignHCenter | Qt::AlignBottom); - QCoreApplication::processEvents(); + QCoreApplication::processEvents(); - /* stop Retroshare if startup fails */ - if (!RsControl::instance()->StartupRetroShare()) - { - std::cerr << "libretroshare failed to startup!" << std::endl; - return 1; - } + /* stop Retroshare if startup fails */ + if (!RsControl::instance()->StartupRetroShare()) + { + std::cerr << "libretroshare failed to startup!" << std::endl; + return 1; + } if(is_auto_tor) - { - // Tor works with viable hidden service. Let's use it! + { + // Tor works with viable hidden service. Let's use it! std::string service_id ; std::string onion_address ; - uint16_t service_port ; - uint16_t service_target_port ; - uint16_t proxy_server_port ; + uint16_t service_port ; + uint16_t service_target_port ; + uint16_t proxy_server_port ; std::string service_target_address ; std::string proxy_server_address ; RsTor::getHiddenServiceInfo(service_id,onion_address,service_port,service_target_address,service_target_port); RsTor::getProxyServerInfo(proxy_server_address,proxy_server_port) ; - std::cerr << "Got hidden service info: " << std::endl; + std::cerr << "Got hidden service info: " << std::endl; std::cerr << " onion address : " << onion_address << std::endl; std::cerr << " service_id : " << service_id << std::endl; - std::cerr << " service port : " << service_port << std::endl; - std::cerr << " target port : " << service_target_port << std::endl; + std::cerr << " service port : " << service_port << std::endl; + std::cerr << " target port : " << service_target_port << std::endl; std::cerr << " target address : " << service_target_address << std::endl; std::cerr << "Setting proxy server to " << service_target_address << ":" << service_target_port << std::endl; @@ -483,95 +669,93 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO); rsPeers->setLocalAddress(rsPeers->getOwnId(), service_target_address, service_target_port); rsPeers->setHiddenNode(rsPeers->getOwnId(), onion_address, service_port); rsPeers->setProxyServer(RS_HIDDEN_TYPE_TOR, proxy_server_address,proxy_server_port) ; - } + } - Rshare::initPlugins(); + RsApplication::initPlugins(); - splashScreen.showMessage(rshare.translate("SplashScreen", "Create interface"), Qt::AlignHCenter | Qt::AlignBottom); - QCoreApplication::processEvents(); // forces splashscreen to show up + splashScreen.showMessage(rshare.translate("SplashScreen", "Create interface"), Qt::AlignHCenter | Qt::AlignBottom); + QCoreApplication::processEvents(); // forces splashscreen to show up - RsharePeerSettings::Create(); + RsharePeerSettings::Create(); - Emoticons::load(); - AvatarDialog::load(); + Emoticons::load(); + AvatarDialog::load(); - if (Settings->value(QString::fromUtf8("FirstRun"), true).toBool()) { - splashScreen.hide(); + if (Settings->value(QString::fromUtf8("FirstRun"), true).toBool()) { + splashScreen.hide(); - Settings->setValue(QString::fromUtf8("FirstRun"), false); + Settings->setValue(QString::fromUtf8("FirstRun"), false); - SoundManager::initDefault(); + SoundManager::initDefault(); #ifdef __APPLE__ - /* For OSX, we set the default to "cleanlooks", as the AQUA style hides some input boxes - * only on the first run - as the user might want to change it ;) - */ - QString osx_style("cleanlooks"); - Rshare::setStyle(osx_style); - Settings->setInterfaceStyle(osx_style); + /* For OSX, we set the default to "cleanlooks", as the AQUA style hides some input boxes + * only on the first run - as the user might want to change it ;) + */ + QString osx_style("cleanlooks"); + RsApplication::setStyle(osx_style); + Settings->setInterfaceStyle(osx_style); #endif // This is now disabled - as it doesn't add very much. // Need to make sure that defaults are sensible! #ifdef ENABLE_QUICKSTART_WIZARD - QuickStartWizard qstartWizard; - qstartWizard.exec(); + QuickStartWizard qstartWizard; + qstartWizard.exec(); #endif - } + } - MainWindow *w = MainWindow::Create (); - splashScreen.finish(w); + MainWindow *w = MainWindow::Create (); + splashScreen.finish(w); - w->processLastArgs(); + if (!sDefaultGXSIdToCreate.isEmpty()) { + RsIdentityParameters params; + params.nickname = sDefaultGXSIdToCreate.toUtf8().constData(); + params.isPgpLinked = true; + params.mImage.clear(); + uint32_t token = 0; + rsIdentity->createIdentity(token, params); + } + // I'm using a signal to transfer the hashing info to the mainwindow, because Qt schedules signals properly to + // avoid clashes between infos from threads. + // - if (!sDefaultGXSIdToCreate.isEmpty()) { - RsIdentityParameters params; - params.nickname = sDefaultGXSIdToCreate.toUtf8().constData(); - params.isPgpLinked = true; - params.mImage.clear(); - uint32_t token = 0; - rsIdentity->createIdentity(token, params); - } - // I'm using a signal to transfer the hashing info to the mainwindow, because Qt schedules signals properly to - // avoid clashes between infos from threads. - // - - qRegisterMetaType("RsPeerId") ; + qRegisterMetaType("RsPeerId") ; #ifdef DEBUG - std::cerr << "connecting signals and slots" << std::endl ; + std::cerr << "connecting signals and slots" << std::endl ; #endif - QObject::connect(notify,SIGNAL(deferredSignatureHandlingRequested()),notify,SLOT(handleSignatureEvent()),Qt::QueuedConnection) ; - QObject::connect(notify,SIGNAL(chatLobbyTimeShift(int)),notify,SLOT(handleChatLobbyTimeShift(int)),Qt::QueuedConnection) ; - QObject::connect(notify,SIGNAL(diskFull(int,int)) ,w ,SLOT(displayDiskSpaceWarning(int,int))) ; + QObject::connect(notify,SIGNAL(deferredSignatureHandlingRequested()),notify,SLOT(handleSignatureEvent()),Qt::QueuedConnection) ; + QObject::connect(notify,SIGNAL(chatLobbyTimeShift(int)),notify,SLOT(handleChatLobbyTimeShift(int)),Qt::QueuedConnection) ; + QObject::connect(notify,SIGNAL(diskFull(int,int)) ,w ,SLOT(displayDiskSpaceWarning(int,int))) ; QObject::connect(notify,SIGNAL(filesPostModChanged(bool)) ,w ,SLOT(postModDirectories(bool)) ,Qt::QueuedConnection ) ; - QObject::connect(notify,SIGNAL(transfersChanged()) ,w->transfersDialog ,SLOT(insertTransfers() )) ; - QObject::connect(notify,SIGNAL(publicChatChanged(int)) ,w->friendsDialog ,SLOT(publicChatChanged(int) )); - QObject::connect(notify,SIGNAL(neighboursChanged()) ,w->friendsDialog->networkDialog ,SLOT(securedUpdateDisplay())) ; + QObject::connect(notify,SIGNAL(transfersChanged()) ,w->transfersDialog ,SLOT(insertTransfers() )) ; + QObject::connect(notify,SIGNAL(publicChatChanged(int)) ,w->friendsDialog ,SLOT(publicChatChanged(int) )); + QObject::connect(notify,SIGNAL(neighboursChanged()) ,w->friendsDialog->networkDialog ,SLOT(securedUpdateDisplay())) ; - QObject::connect(notify,SIGNAL(chatStatusChanged(const QString&,const QString&,bool)),w->friendsDialog,SLOT(updatePeerStatusString(const QString&,const QString&,bool))); - QObject::connect(notify,SIGNAL(ownStatusMessageChanged()),w->friendsDialog,SLOT(loadmypersonalstatus())); + QObject::connect(notify,SIGNAL(chatStatusChanged(const QString&,const QString&,bool)),w->friendsDialog,SLOT(updatePeerStatusString(const QString&,const QString&,bool))); + QObject::connect(notify,SIGNAL(ownStatusMessageChanged()),w->friendsDialog,SLOT(loadmypersonalstatus())); // QObject::connect(notify,SIGNAL(logInfoChanged(const QString&)) ,w->friendsDialog->networkDialog,SLOT(setLogInfo(QString))) ; - QObject::connect(notify,SIGNAL(discInfoChanged()) ,w->friendsDialog->networkView,SLOT(update()),Qt::QueuedConnection) ; - QObject::connect(notify,SIGNAL(errorOccurred(int,int,const QString&)),w,SLOT(displayErrorMessage(int,int,const QString&))) ; + QObject::connect(notify,SIGNAL(discInfoChanged()) ,w->friendsDialog->networkView,SLOT(update()),Qt::QueuedConnection) ; + QObject::connect(notify,SIGNAL(errorOccurred(int,int,const QString&)),w,SLOT(displayErrorMessage(int,int,const QString&))) ; - w->installGroupChatNotifier(); + w->installGroupChatNotifier(); - /* only show window, if not startMinimized */ - if (RsInit::getStartMinimised() || Settings->getStartMinimized()) - { - splashScreen.close(); - } else { - w->show(); - } + /* only show window, if not startMinimized */ + if (RsInit::getStartMinimised() || Settings->getStartMinimized()) + { + splashScreen.close(); + } else { + w->show(); + } - /* Startup a Timer to keep the gui's updated */ - QTimer *timer = new QTimer(w); - timer -> connect(timer, SIGNAL(timeout()), notify, SLOT(UpdateGUI())); - timer->start(1000); + /* Startup a Timer to keep the gui's updated */ + QTimer *timer = new QTimer(w); + timer -> connect(timer, SIGNAL(timeout()), notify, SLOT(UpdateGUI())); + timer->start(1000); - notify->enable() ; // enable notification system after GUI creation, to avoid data races in Qt. + notify->enable() ; // enable notification system after GUI creation, to avoid data races in Qt. // Read webui params in settings. We cannot save them to some webui.cfg because cfg needs the node id and // jsonapi is started before node ID selection in retroshare-service. @@ -586,31 +770,31 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO); RsInit::startupWebServices(conf,false); #endif - /* dive into the endless loop */ - int ti = rshare.exec(); - delete w ; + /* dive into the endless loop */ + int ti = rshare.exec(); + delete w ; #ifdef RS_JSONAPI - JsonApiPage::checkShutdownJsonApi(); + JsonApiPage::checkShutdownJsonApi(); #endif // RS_JSONAPI - /* cleanup */ - ChatDialog::cleanupChat(); + /* cleanup */ + ChatDialog::cleanupChat(); #ifdef RS_ENABLE_GXS - RsGxsUpdateBroadcast::cleanup(); + RsGxsUpdateBroadcast::cleanup(); #endif - if (is_auto_tor) { - RsTor::stop(); - } + if (is_auto_tor) { + RsTor::stop(); + } - RsControl::instance()->rsGlobalShutDown(); + RsControl::instance()->rsGlobalShutDown(); - delete(soundManager); - soundManager = NULL; + delete(soundManager); + soundManager = NULL; - Settings->sync(); - delete(Settings); + Settings->sync(); + delete(Settings); - return ti ; + return ti ; } diff --git a/retroshare-gui/src/rshare.cpp b/retroshare-gui/src/rshare.cpp index e5f450f57..d867f1545 100644 --- a/retroshare-gui/src/rshare.cpp +++ b/retroshare-gui/src/rshare.cpp @@ -50,55 +50,22 @@ #include #include +#include #include #include #include #include "rshare.h" -/* Available command-line arguments. */ -#define ARG_RESET "reset" /**< Reset Rshare's saved settings. */ -#define ARG_DATADIR "datadir" /**< Directory to use for data files. */ -#define ARG_LOGFILE "logfile" /**< Location of our logfile. */ -#define ARG_LOGLEVEL "loglevel" /**< Log verbosity. */ -#define ARG_GUISTYLE "style" /**< Argument specfying GUI style. */ -#define ARG_GUISTYLESHEET "stylesheet" /**< Argument specfying GUI style. */ -#define ARG_LANGUAGE "lang" /**< Argument specifying language. */ -#define ARG_OPMODE_S "o" /**< OpMode (Full, NoTurtle, Gaming, Minimal) */ -#define ARG_OPMODE_L "opmode" /**< OpMode (Full, NoTurtle, Gaming, Minimal) */ -#define ARG_RSLINK_S "r" /**< Open RsLink with protocol retroshare:// */ -#define ARG_RSLINK_L "link" /**< Open RsLink with protocol retroshare:// */ -#define ARG_RSFILE_S "f" /**< Open RsFile with or without arg. */ -#define ARG_RSFILE_L "rsfile" /**< Open RsFile with or without arg. */ -//Other defined for server in /libretroshare/src/rsserver/rsinit.cc:351 +#ifdef __APPLE__ +QStringList RsApplication::_links; /**< List of links passed by arguments. */ +QStringList RsApplication::_files; /**< List of files passed by arguments. */ +#endif -// The arguments here can be send to a running instance. -// If the command line contains arguments not listed here, we have to start a new instance. -// For example, the user wants to start a second instance using --base-dir arg of libretroshare. -static const char* const forwardableArgs[] = { - ARG_OPMODE_S, - ARG_OPMODE_L, - ARG_RSLINK_S, - ARG_RSLINK_L, - ARG_RSFILE_S, - ARG_RSFILE_L, - NULL, -}; - -/* Static member variables */ -QMap Rshare::_args; /**< List of command-line arguments. */ -Log Rshare::_log; /**< Logs debugging messages to file or stdout. */ -QString Rshare::_style; /**< The current GUI style. */ -QString Rshare::_stylesheet; /**< The current GUI stylesheet. */ -QString Rshare::_language; /**< The current language. */ -QString Rshare::_dateformat; /**< The format of dates in feed items etc. */ -QString Rshare::_opmode; /**< The operating mode passed by args. */ -QStringList Rshare::_links; /**< List of links passed by arguments. */ -QStringList Rshare::_files; /**< List of files passed by arguments. */ -QDateTime Rshare::mStartupTime; -bool Rshare::useConfigDir; -QString Rshare::configDir; -QLocalServer* Rshare::localServer; +Log RsApplication::log_output; /**< Logs debugging messages to file or stdout. */ +RsGUIConfigOptions RsApplication::options; +QDateTime RsApplication::mStartupTime; +QLocalServer* RsApplication::localServer; /** Catches debugging messages from Qt and sends them to RetroShare's logs. If Qt * emits a QtFatalMsg, we will write the message to the log and then abort(). @@ -133,194 +100,87 @@ void qt_msg_handler(QtMsgType type, const char *msg) } } -static bool notifyRunningInstance() -{ - // Connect to the Local Server of the main process to notify it - // that a new process had been started - QLocalSocket localSocket; - localSocket.connectToServer(QString(TARGET)); -#ifdef DEBUG - std::cerr << "Rshare::Rshare waitForConnected to other instance." << std::endl; -#endif - if( localSocket.waitForConnected(100) ) - { -#ifdef DEBUG - std::cerr << "Rshare::Rshare Connection etablished. Waiting for disconnection." << std::endl; -#endif - localSocket.waitForDisconnected(1000); - return true; - } - else - { -#ifdef DEBUG - std::cerr << "Rshare::Rshare failed to connect to other instance." << std::endl; -#endif - return false; - } -} - -/** Constructor. Parses the command-line arguments, resets Rshare's +/** Constructor. Parses the command-line arguments, resets RsApplication's * configuration (if requested), and sets up the GUI style and language - * translation. */ -Rshare::Rshare(QStringList args, int &argc, char **argv, const QString &dir) -: QApplication(argc, argv) + * translation. + * the const_cast below is truely horrible, but it allows to hide these unused argc/argv + * when initing RsApplication + */ + +RsApplication::RsApplication(const RsGUIConfigOptions& conf) +: QApplication(const_cast(&conf)->argc,const_cast(&conf)->argv) { - mStartupTime = QDateTime::currentDateTime(); - localServer = NULL; + mStartupTime = QDateTime::currentDateTime(); + localServer = NULL; + options = conf; - //Initialize connection to LocalServer to know if other process runs. - { - QString serverName = QString(TARGET); + // So we start a Local Server to listen for connections from new process + localServer= new QLocalServer(); + QObject::connect(localServer, SIGNAL(newConnection()), this, SLOT(slotConnectionEstablished())); + updateLocalServer(); - // check if another instance is running - bool haveRunningInstance = notifyRunningInstance(); - - bool sendArgsToRunningInstance = haveRunningInstance; - if(args.empty()) - sendArgsToRunningInstance = false; - // if we find non-forwardable args, start a new instance - for(int iCurs = 0; iCurs < args.size(); ++iCurs) - { - const char* const* argit = forwardableArgs; - bool found = false; - while(*argit && iCurs < args.size()) - { - if(args.value(iCurs) == "-"+QString(*argit) || args.value(iCurs) == "--"+QString(*argit)) - { - found = true; - if(argNeedsValue(*argit)) - iCurs++; - } - argit++; - } - if(!found) - sendArgsToRunningInstance = false; - } - - if (sendArgsToRunningInstance) { - // load into shared memory - QBuffer buffer; - buffer.open(QBuffer::ReadWrite); - QDataStream out(&buffer); - out << args; - int size = buffer.size(); - - QSharedMemory newArgs; - newArgs.setKey(serverName + "_newArgs"); - if (newArgs.isAttached()) newArgs.detach(); - - if (!newArgs.create(size)) { - std::cerr << "(EE) Rshare::Rshare Unable to create shared memory segment of size:" - << size << " error:" << newArgs.errorString().toStdString() << "." << std::endl; -#ifdef Q_OS_UNIX - std::cerr << "Look with `ipcs -m` for nattch==0 segment. And remove it with `ipcrm -m 'shmid'`." << std::endl; - //No need for windows, as it removes shared segment directly even when crash. -#endif + // clear out any old arguments (race condition?) + QSharedMemory newArgs; + newArgs.setKey(QString(TARGET) + "_newArgs"); + if(newArgs.attach(QSharedMemory::ReadWrite)) newArgs.detach(); - ::exit(EXIT_FAILURE); - } - newArgs.lock(); - char *to = (char*)newArgs.data(); - const char *from = buffer.data().data(); - memcpy(to, from, qMin(newArgs.size(), size)); - newArgs.unlock(); - - std::cerr << "Rshare::Rshare waitForConnected to other instance." << std::endl; - if(notifyRunningInstance()) - { - newArgs.detach(); - std::cerr << "Rshare::Rshare Arguments was sended." << std::endl - << " To disable it, in Options - General - Misc," << std::endl - << " uncheck \"Use Local Server to get new Arguments\"." << std::endl; - ::exit(EXIT_SUCCESS); // Terminate the program using STDLib's exit function - } - else - std::cerr << "Rshare::Rshare failed to connect to other instance." << std::endl; - newArgs.detach(); - } - - if(!haveRunningInstance) - { - // No main process exists - // Or started without arguments - // So we start a Local Server to listen for connections from new process - localServer= new QLocalServer(); - QObject::connect(localServer, SIGNAL(newConnection()), this, SLOT(slotConnectionEstablished())); - updateLocalServer(); - // clear out any old arguments (race condition?) - QSharedMemory newArgs; - newArgs.setKey(QString(TARGET) + "_newArgs"); - if(newArgs.attach(QSharedMemory::ReadWrite)) - newArgs.detach(); - } - } #if QT_VERSION >= QT_VERSION_CHECK (5, 0, 0) - qInstallMessageHandler(qt_msg_handler); + qInstallMessageHandler(qt_msg_handler); #else - qInstallMsgHandler(qt_msg_handler); + qInstallMsgHandler(qt_msg_handler); #endif #ifndef __APPLE__ - /* set default window icon */ - setWindowIcon(FilesDefs::getIconFromQtResourcePath(":/icons/logo_128.png")); + /* set default window icon */ + setWindowIcon(FilesDefs::getIconFromQtResourcePath(":/icons/logo_128.png")); #endif - mBlink = true; - QTimer *timer = new QTimer(this); - timer->setInterval(500); - connect(timer, SIGNAL(timeout()), this, SLOT(blinkTimer())); - timer->start(); + mBlink = true; + QTimer *timer = new QTimer(this); + timer->setInterval(500); + connect(timer, SIGNAL(timeout()), this, SLOT(blinkTimer())); + timer->start(); - timer = new QTimer(this); - timer->setInterval(60000); - connect(timer, SIGNAL(timeout()), this, SIGNAL(minuteTick())); - timer->start(); + timer = new QTimer(this); + timer->setInterval(60000); + connect(timer, SIGNAL(timeout()), this, SIGNAL(minuteTick())); + timer->start(); - /* Read in all our command-line arguments. */ - parseArguments(args); + /* Check if we're supposed to reset our config before proceeding. */ + if (options.optResetParams) + { + RsInfo() << "Resetting Retroshare config parameters, as requested (option -R)"; + Settings->reset(); + } - /* Check if we're supposed to reset our config before proceeding. */ - if (_args.contains(ARG_RESET)) { - Settings->reset(); - } - - /* Handle the -loglevel and -logfile options. */ - if (_args.contains(ARG_LOGFILE)) - _log.open(_args.value(ARG_LOGFILE)); - if (_args.contains(ARG_LOGLEVEL)) { - _log.setLogLevel(Log::stringToLogLevel( - _args.value(ARG_LOGLEVEL))); - if (!_args.contains(ARG_LOGFILE)) - _log.open(stdout); - } - if (!_args.contains(ARG_LOGLEVEL) && - !_args.contains(ARG_LOGFILE)) - _log.setLogLevel(Log::Off); + /* Handle the -loglevel and -logfile options. */ + if (options.logLevel != "Off") + { + if (!options.logFileName.isNull()) + log_output.open(options.logFileName); + else + log_output.open(stdout); - /* config directory */ - useConfigDir = false; - if (dir != "") - { - setConfigDirectory(dir); - } + log_output.setLogLevel(Log::stringToLogLevel(options.logLevel)); + } - /** Initialize support for language translations. */ - //LanguageSupport::initialize(); + /** Initialize support for language translations. */ + //LanguageSupport::initialize(); - resetLanguageAndStyle(); + resetLanguageAndStyle(); - /* Switch off auto shutdown */ - setQuitOnLastWindowClosed ( false ); + /* Switch off auto shutdown */ + setQuitOnLastWindowClosed ( false ); - /* Initialize GxsIdDetails */ - GxsIdDetails::initialize(); + /* Initialize GxsIdDetails */ + GxsIdDetails::initialize(); } /** Destructor */ -Rshare::~Rshare() +RsApplication::~RsApplication() { /* Cleanup GxsIdDetails */ GxsIdDetails::cleanup(); @@ -334,7 +194,7 @@ Rshare::~Rshare() /** * @brief Executed when new instance connect command is sent to LocalServer */ -void Rshare::slotConnectionEstablished() +void RsApplication::slotConnectionEstablished() { QSharedMemory newArgs; newArgs.setKey(QString(TARGET) + "_newArgs"); @@ -346,7 +206,7 @@ void Rshare::slotConnectionEstablished() /* this is not an error. It just means we were notified to check newArgs, but none had been set yet. TODO: implement separate ping/take messages - std::cerr << "(EE) Rshare::slotConnectionEstablished() Unable to attach to shared memory segment." + std::cerr << "(EE) RsApplication::slotConnectionEstablished() Unable to attach to shared memory segment." << newArgs.errorString().toStdString() << std::endl; */ socket->close(); @@ -357,36 +217,41 @@ void Rshare::slotConnectionEstablished() socket->close(); delete socket; - QBuffer buffer; - QDataStream in(&buffer); - QStringList args; + if(newArgs.error()) + { + RsErr() << "Something when wrong in receiving arguments from operating system: " << newArgs.errorString().toStdString() ; + return ; + } + QBuffer buffer; + QDataStream in(&buffer); + QStringList args; - newArgs.lock(); - buffer.setData((char*)newArgs.constData(), newArgs.size()); - buffer.open(QBuffer::ReadOnly); - in >> args; - newArgs.unlock(); - newArgs.detach(); + newArgs.lock(); + buffer.setData((char*)newArgs.constData(), newArgs.size()); + buffer.open(QBuffer::ReadOnly); + in >> args; + newArgs.unlock(); + newArgs.detach(); - emit newArgsReceived(args); - while (!args.empty()) - { - std::cerr << "Rshare::slotConnectionEstablished args:" << QString(args.takeFirst()).toStdString() << std::endl; - } + emit newArgsReceived(args); + while (!args.empty()) + { + std::cerr << "RsApplication::slotConnectionEstablished args:" << QString(args.takeFirst()).toStdString() << std::endl; + } } -QString Rshare::retroshareVersion(bool) { return RS_HUMAN_READABLE_VERSION; } +QString RsApplication::retroshareVersion(bool) { return RS_HUMAN_READABLE_VERSION; } /** Enters the main event loop and waits until exit() is called. The signal * running() will be emitted when the event loop has started. */ int -Rshare::run() +RsApplication::run() { QTimer::singleShot(0, rApp, SLOT(onEventLoopStarted())); return rApp->exec(); } -QDateTime Rshare::startupTime() +QDateTime RsApplication::startupTime() { return mStartupTime; } @@ -395,203 +260,17 @@ QDateTime Rshare::startupTime() * will emit the running() signal to indicate that the application's event * loop is running. */ void -Rshare::onEventLoopStarted() +RsApplication::onEventLoopStarted() { emit running(); } -/** Display usage information regarding command-line arguments. */ -/*void -Rshare::printUsage(QString errmsg) -{ - QTextStream out(stdout);*/ - - /* If there was an error message, print it out. */ - /*if (!errmsg.isEmpty()) { - out << "** " << errmsg << " **" << endl << endl; - }*/ - - /* Now print the application usage */ - //out << "Usage: " << endl; - //out << "\t" << qApp->arguments().at(0) << " [options]" << endl; - - /* And available options */ - //out << endl << "Available Options:" << endl; - //out << "\t-"ARG_RESET"\t\tResets ALL stored Rshare settings." << endl; - //out << "\t-"ARG_DATADIR"\tSets the directory Rshare uses for data files"<< endl; - //out << "\t-"ARG_GUISTYLE"\t\tSets Rshare's interface style." << endl; - //out << "\t-"ARG_GUISTYLESHEET"\t\tSets Rshare's stylesheet." << endl; - //out << "\t\t\t[" << QStyleFactory::keys().join("|") << "]" << endl; - //out << "\t-"ARG_LANGUAGE"\t\tSets Rshare's language." << endl; - //out << "\t\t\t[" << LanguageSupport::languageCodes().join("|") << "]" << endl; -//} - -/** Displays usage information for command-line args. */ -void -Rshare::showUsageMessageBox() -{ - QString usage; - QTextStream out(&usage); - - out << "Available Options:" << endl; - out << ""; - //out << trow(tcol("-"ARG_HELP) + - // tcol(tr("Displays this usage message and exits."))); - out << trow(tcol("-" ARG_RESET) + - tcol(tr("Resets ALL stored RetroShare settings."))); - out << trow(tcol("-" ARG_DATADIR" <dir>") + - tcol(tr("Sets the directory RetroShare uses for data files."))); - out << trow(tcol("-" ARG_LOGFILE" <" + tr("filename") + ">") + - tcol(tr("Sets the name and location of RetroShare's logfile."))); - out << trow(tcol("-" ARG_LOGLEVEL" <" + tr("level") + ">") + - tcol(tr("Sets the verbosity of RetroShare's logging.") + - "
[" + Log::logLevels().join("|") +"]")); - out << trow(tcol("-" ARG_GUISTYLE" <" + tr("style") +">") + - tcol(tr("Sets RetroShare's interface style.") + - "
[" + QStyleFactory::keys().join("|") + "]")); - out << trow(tcol("-" ARG_GUISTYLESHEET" <" + tr("stylesheet") + ">") + - tcol(tr("Sets RetroShare's interface stylesheets."))); - out << trow(tcol("-" ARG_LANGUAGE" <" + tr("language") + ">") + - tcol(tr("Sets RetroShare's language.") + - "
[" + LanguageSupport::languageCodes().join("|") + "]")); - out << trow(tcol("--" ARG_OPMODE_L" <" + tr("opmode") + ">") + - tcol(tr("Sets RetroShare's operating mode.") + - "
[full|noturtle|gaming|minimal]")); - out << trow(tcol("-" ARG_RSLINK_L" <" + tr("RsLinkURL") + ">") + - tcol(tr("Open RsLink with protocol retroshare://"))); - out << trow(tcol("-" ARG_RSFILE_L" <" + tr("filename") + ">") + - tcol(tr("Open RsFile with or without arg."))); - out << "
"; - - VMessageBox::information(0, - tr("RetroShare GUI Usage Information"), usage, VMessageBox::Ok); -} - -/** Returns true if the specified argument expects a value. */ -bool -Rshare::argNeedsValue(const QString &argName) -{ - return ( - argName == ARG_DATADIR || - argName == ARG_LOGFILE || - argName == ARG_LOGLEVEL || - argName == ARG_GUISTYLE || - argName == ARG_GUISTYLESHEET || - argName == ARG_LANGUAGE || - argName == ARG_OPMODE_S || - argName == ARG_OPMODE_L || - argName == ARG_RSLINK_S || - argName == ARG_RSLINK_L || - argName == ARG_RSFILE_S || - argName == ARG_RSFILE_L ); -} - -/** Parses the list of command-line arguments for their argument names and - * values. */ -void -Rshare::parseArguments(QStringList args, bool firstRun) -{ - QString arg, argl, value; - - /* Loop through all command-line args/values and put them in a map */ - for (int iCurs = 0; iCurs < args.size(); ++iCurs) { - /* Get the argument name and set a blank value */ - arg = args.at(iCurs);//.toLower(); Need Upper case for file name. - argl = arg.toLower(); - if (argl == "empty") continue; - value = ""; - - /* Check if it starts with a - or -- */ - if (arg.startsWith("-")) { - arg = arg.mid((arg.startsWith("--") ? 2 : 1)); - /* Check if it takes a value and there is one on the command-line */ - if (iCurs < args.size()-1 && argNeedsValue(arg)) { - value = args.at(++iCurs); - } - } else { - /* Check if links or files without arg */ - if (argl.startsWith("retroshare://")) { - value = arg; - arg = ARG_RSLINK_L; - } else { - if (QFile(arg).exists()) { - value = arg; - arg = ARG_RSFILE_L; - } - } - } - - /* handle opmode that could be change while running.*/ - QString omValue = QString(value).prepend(";").append(";").toLower(); - QString omValues = QString(";full;noturtle;gaming;minimal;"); - if ((arg == ARG_OPMODE_S || arg == ARG_OPMODE_L ) - && omValues.contains(omValue)) { - _opmode = value; - } - - /* Don't send theses argument to _args map to allow multiple. */ - if (arg == ARG_RSLINK_S || arg == ARG_RSLINK_L) { - _links.append(value); - } else if (arg == ARG_RSFILE_S || arg == ARG_RSFILE_L) { - _files.append(value); - } else if (firstRun) { - /* Place this arg/value in the map only first time*/ - _args.insert(arg, value); - } - } -} - -/** Verifies that all specified arguments were valid. */ -bool -Rshare::validateArguments(QString &errmsg) -{ - /* Check for a writable log file */ - if (_args.contains(ARG_LOGFILE) && !_log.isOpen()) { - errmsg = tr("Unable to open log file '%1': %2") - .arg( _args.value(ARG_LOGFILE) - , _log.errorString()); - return false; - } - /* Check for a valid log level */ - if (_args.contains(ARG_LOGLEVEL) && - !Log::logLevels().contains(_args.value(ARG_LOGLEVEL))) { - errmsg = tr("Invalid log level specified:")+" " + _args.value(ARG_LOGLEVEL); - return false; - } - /* Check for a valid GUI style */ - if (_args.contains(ARG_GUISTYLE) && - !QStyleFactory::keys().contains(_args.value(ARG_GUISTYLE), - Qt::CaseInsensitive)) { - errmsg = tr("Invalid GUI style specified:")+" " + _args.value(ARG_GUISTYLE); - return false; - } - /* Check for a language that Retroshare recognizes. */ - if (_args.contains(ARG_LANGUAGE) && - !LanguageSupport::isValidLanguageCode(_args.value(ARG_LANGUAGE))) { - errmsg = tr("Invalid language code specified:")+" " + _args.value(ARG_LANGUAGE); - return false; - } - /* Check for an opmode that Retroshare recognizes. */ - if (_args.contains(ARG_OPMODE_S) && - !QString(";full;noturtle;gaming;minimal;").contains(QString(_args.value(ARG_OPMODE_S)).prepend(";").append(";").toLower())) { - errmsg = tr("Invalid operating mode specified:")+" " + _args.value(ARG_OPMODE_S); - return false; - } - /* Check for an opmode that Retroshare recognizes. */ - if (_args.contains(ARG_OPMODE_L) && - !QString(";full;noturtle;gaming;minimal;").contains(QString(_args.value(ARG_OPMODE_L)).prepend(";").append(";").toLower())) { - errmsg = tr("Invalid operating mode specified:")+" " + _args.value(ARG_OPMODE_L); - return false; - } - return true; -} - /** Sets the translation RetroShare will use. If one was specified on the * command-line, we will use that. Otherwise, we'll check to see if one was * saved previously. If not, we'll default to one appropriate for the system * locale. */ bool -Rshare::setLanguage(QString languageCode) +RsApplication::setLanguage(QString languageCode) { /* If the language code is empty, use the previously-saved setting */ if (languageCode.isEmpty()) { @@ -599,7 +278,7 @@ Rshare::setLanguage(QString languageCode) } /* Translate into the desired language */ if (LanguageSupport::translate(languageCode)) { - _language = languageCode; + options.language = languageCode; return true; } return false; @@ -610,7 +289,7 @@ Rshare::setLanguage(QString languageCode) * saved previously. If not, we'll default to the system * locale. */ bool -Rshare::setLocale(QString languageCode) +RsApplication::setLocale(QString languageCode) { bool retVal = false; /* If the language code is empty, use the previously-saved setting */ @@ -626,20 +305,20 @@ Rshare::setLocale(QString languageCode) } /** customize date format for feeds etc. */ -void Rshare::customizeDateFormat() +void RsApplication::customizeDateFormat() { QLocale locale = QLocale(); // set to default locale /* get long date format without weekday */ - _dateformat = locale.dateFormat(QLocale::LongFormat); - _dateformat.replace(QRegExp("^dddd,*[^ ]* *('[^']+' )*"), ""); - _dateformat.replace(QRegExp(",* *dddd"), ""); - _dateformat = _dateformat.trimmed(); + options.dateformat = locale.dateFormat(QLocale::LongFormat); + options.dateformat.replace(QRegExp("^dddd,*[^ ]* *('[^']+' )*"), ""); + options.dateformat.replace(QRegExp(",* *dddd"), ""); + options.dateformat = options.dateformat.trimmed(); } /** Get custom date format (defaultlongformat) */ -QString Rshare::customDateFormat() +QString RsApplication::customDateFormat() { - return _dateformat; + return options.dateformat; } /** Sets the GUI style RetroShare will use. If one was specified on the @@ -647,49 +326,50 @@ QString Rshare::customDateFormat() * saved previously. If not, we'll default to one appropriate for the * operating system. */ bool -Rshare::setStyle(QString styleKey) +RsApplication::setStyle(QString styleKey) { /* If no style was specified, use the previously-saved setting */ if (styleKey.isEmpty()) { styleKey = Settings->getInterfaceStyle(); } /* Apply the specified GUI style */ - if (QApplication::setStyle(styleKey)) { - _style = styleKey; + if (QApplication::setStyle(styleKey)) + { + options.guiStyle = styleKey; return true; } return false; } bool -Rshare::setSheet(QString sheet) +RsApplication::setSheet(QString sheet) { /* If no stylesheet was specified, use the previously-saved setting */ if (sheet.isEmpty()) { sheet = Settings->getSheetName(); } /* Apply the specified GUI stylesheet */ - _stylesheet = sheet; + options.guiStyleSheetFile = sheet; /* load the StyleSheet*/ - loadStyleSheet(_stylesheet); + loadStyleSheet(options.guiStyleSheetFile); return true; } -void Rshare::resetLanguageAndStyle() +void RsApplication::resetLanguageAndStyle() { /** Translate the GUI to the appropriate language. */ - setLanguage(_args.value(ARG_LANGUAGE)); + setLanguage(options.language); /** Set the locale appropriately. */ - setLocale(_args.value(ARG_LANGUAGE)); + setLocale(options.language); /** Set the GUI style appropriately. */ - setStyle(_args.value(ARG_GUISTYLE)); + setStyle(options.guiStyle); /** Set the GUI stylesheet appropriately. */ - setSheet(_args.value(ARG_GUISTYLESHEET)); + setSheet(options.guiStyleSheetFile); } // RetroShare: @@ -714,7 +394,7 @@ void Rshare::resetLanguageAndStyle() // Language depended stylesheet // _.lqss -void Rshare::loadStyleSheet(const QString &sheetName) +void RsApplication::loadStyleSheet(const QString &sheetName) { QString locale = QLocale().name(); QString styleSheet; @@ -785,7 +465,7 @@ void Rshare::loadStyleSheet(const QString &sheetName) } /** get list of available stylesheets **/ -void Rshare::getAvailableStyleSheets(QMap &styleSheets) +void RsApplication::getAvailableStyleSheets(QMap &styleSheets) { QFileInfoList fileInfoList = QDir(":/qss/stylesheet/").entryInfoList(QStringList("*.qss")); QFileInfo fileInfo; @@ -813,7 +493,7 @@ void Rshare::getAvailableStyleSheets(QMap &styleSheets) } } -void Rshare::refreshStyleSheet(QWidget *widget, bool processChildren) +void RsApplication::refreshStyleSheet(QWidget *widget, bool processChildren) { if (widget != NULL) { // force widget to recalculate valid style @@ -839,40 +519,35 @@ void Rshare::refreshStyleSheet(QWidget *widget, bool processChildren) } /** Initialize plugins. */ -void Rshare::initPlugins() +void RsApplication::initPlugins() { - loadStyleSheet(_stylesheet); - LanguageSupport::translatePlugins(_language); + loadStyleSheet(options.guiStyleSheetFile); + LanguageSupport::translatePlugins(options.language); } /** Returns the directory RetroShare uses for its data files. */ -QString -Rshare::dataDirectory() +QString RsApplication::dataDirectory() { - if (useConfigDir) - { - return configDir; - } - else if (_args.contains(ARG_DATADIR)) { - return _args.value(ARG_DATADIR); - } - return defaultDataDirectory(); + if(!options.optBaseDir.empty()) + return QString::fromUtf8(options.optBaseDir.c_str()); + else + return defaultDataDirectory(); } /** Returns the default location of RetroShare's data directory. */ QString -Rshare::defaultDataDirectory() +RsApplication::defaultDataDirectory() { #if defined(Q_OS_WIN) return (win32_app_data_folder() + "\\RetroShare"); #else - return (QDir::homePath() + "/.RetroShare"); + return (QDir::homePath() + "/.retroshare"); #endif } -/** Creates Rshare's data directory, if it doesn't already exist. */ +/** Creates RsApplication's data directory, if it doesn't already exist. */ bool -Rshare::createDataDirectory(QString *errmsg) +RsApplication::createDataDirectory(QString *errmsg) { QDir datadir(dataDirectory()); if (!datadir.exists()) { @@ -885,33 +560,29 @@ Rshare::createDataDirectory(QString *errmsg) return true; } -/** Set Rshare's data directory - externally */ -bool Rshare::setConfigDirectory(const QString& dir) +/** Set RsApplication's data directory - externally */ +bool RsApplication::setConfigDirectory(const QString& dir) { - useConfigDir = true; - configDir = dir; + options.optBaseDir = std::string(dir.toUtf8()); return true; } /** Writes msg with severity level to RetroShare's log. */ -Log::LogMessage -Rshare::log(Log::LogLevel level, QString msg) +Log::LogMessage RsApplication::log(Log::LogLevel level, QString msg) { - return _log.log(level, msg); + return log_output.log(level, msg); } /** Creates and binds a shortcut such that when key is pressed in * sender's context, receiver's slot will be called. */ -void -Rshare::createShortcut(const QKeySequence &key, QWidget *sender, - QWidget *receiver, const char *slot) +void RsApplication::createShortcut(const QKeySequence &key, QWidget *sender, QWidget *receiver, const char *slot) { QShortcut *s = new QShortcut(key, sender); connect(s, SIGNAL(activated()), receiver, slot); } #ifdef __APPLE__ -bool Rshare::event(QEvent *event) +bool RsApplication::event(QEvent *event) { switch (event->type()) { case QEvent::FileOpen:{ @@ -933,7 +604,7 @@ bool Rshare::event(QEvent *event) } #endif -void Rshare::blinkTimer() +void RsApplication::blinkTimer() { mBlink = !mBlink; emit blink(mBlink); @@ -944,7 +615,7 @@ void Rshare::blinkTimer() } } -bool Rshare::loadCertificate(const RsPeerId &accountId, bool autoLogin) +bool RsApplication::loadCertificate(const RsPeerId &accountId, bool autoLogin) { if (!RsAccounts::SelectAccount(accountId)) { @@ -985,14 +656,14 @@ bool Rshare::loadCertificate(const RsPeerId &accountId, bool autoLogin) // QObject::tr("Login Failure"), // QObject::tr("Maybe password is wrong") ); return false; - default: std::cerr << "Rshare::loadCertificate() unexpected switch value " << retVal << std::endl; + default: std::cerr << "RsApplication::loadCertificate() unexpected switch value " << retVal << std::endl; return false; } return true; } -bool Rshare::updateLocalServer() +bool RsApplication::updateLocalServer() { if (localServer) { QString serverName = QString(TARGET); diff --git a/retroshare-gui/src/rshare.h b/retroshare-gui/src/rshare.h index 2b59b7875..be6af336c 100644 --- a/retroshare-gui/src/rshare.h +++ b/retroshare-gui/src/rshare.h @@ -36,9 +36,10 @@ #include "util/log.h" #include "retroshare/rstypes.h" +#include "retroshare/rsinit.h" /** Pointer to this RetroShare application instance. */ -#define rApp (static_cast(qApp)) +#define rApp (static_cast(qApp)) #define rDebug(fmt) (rApp->log(Log::Debug, (fmt))) #define rInfo(fmt) (rApp->log(Log::Info, (fmt))) @@ -46,33 +47,40 @@ #define rWarn(fmt) (rApp->log(Log::Warn, (fmt))) #define rError(fmt) (rApp->log(Log::Error, (fmt))) +struct RsGUIConfigOptions: public RsConfigOptions +{ + RsGUIConfigOptions() + : optResetParams(false), logLevel("Off"), argc(0) + {} -class Rshare : public QApplication + bool optResetParams; // reset all GUI parameters + + QString dateformat; // The format for dates in feed items etc. + QString language; // The current language. + + QString logFileName; // output filename for log + QString logLevel; // severity threshold for log output + + QString guiStyle; // CSS Style for the GUI + QString guiStyleSheetFile; // CSS Style for the GUI + + int argc ; // stores argc parameter. Only used by the creator of QApplication + char *argv[1] ; // stores argv parameter. Only used by the creator of QApplication +}; + +class RsApplication : public QApplication { Q_OBJECT public: /** Constructor. */ - Rshare(QStringList args, int &argc, char **argv, const QString &dir); + RsApplication(const RsGUIConfigOptions& conf); /** Destructor. */ - ~Rshare(); + ~RsApplication(); /** Return the version info */ static QString retroshareVersion(bool=true); - /** Return the map of command-line arguments and values. */ - static QMap arguments() { return _args; } - /** Parse the list of command-line arguments. */ - static void parseArguments(QStringList args, bool firstRun = true); - /** Validates that all arguments were well-formed. */ - bool validateArguments(QString &errmsg); - /** Prints usage information to the given text stream. */ - //void printUsage(QString errmsg = QString()); - /** Displays usage information for command-line args. */ - static void showUsageMessageBox(); - /** Returns true if the user wants to see usage information. */ - static bool showUsage(); - /** Sets the current language. */ static bool setLanguage(QString languageCode = QString()); /** Sets the current locale. */ @@ -105,17 +113,22 @@ public: static void initPlugins(); /** Returns the current GUI style. */ - static QString style() { return _style; } + static QString style() { return options.guiStyle; } /** Returns the current GUI stylesheet. */ - static QString stylesheet() { return _stylesheet; } + static QString stylesheet() { return options.guiStyleSheetFile; } /** Returns the current language. */ - static QString language() { return _language; } - /** Returns the operating mode. */ - static QString opmode() { return _opmode; } + static QString language() { return options.language; } + + /** Sets/Returns the operating mode. */ + static void setOpMode(const QString& op ) { options.opModeStr = op.toStdString(); } + static QString opmode() { return QString::fromStdString(options.opModeStr); } + +#ifdef __APPLE__ /** Returns links passed by arguments. */ static QStringList* links() { return &_links; } /** Returns files passed by arguments. */ static QStringList* files() {return &_files; } +#endif /** Returns Rshare's application startup time. */ static QDateTime startupTime(); @@ -176,24 +189,20 @@ private: /** customize the date format (defaultlongformat) */ static void customizeDateFormat(); +#ifdef TO_REMOVE /** Returns true if the specified arguments wants a value. */ static bool argNeedsValue(const QString &argName); +#endif - static QMap _args; /**< List of command-line arguments. */ - static Log _log; /**< Logs debugging messages to file or stdout. */ - static QString _style; /**< The current GUI style. */ - static QString _stylesheet; /**< The current GUI stylesheet. */ - static QString _language; /**< The current language. */ - static QString _dateformat; /**< The format for dates in feed items etc. */ - static QString _opmode; /**< The operating mode passed by args. */ +#ifdef __APPLE__ static QStringList _links; /**< List of links passed by arguments. */ static QStringList _files; /**< List of files passed by arguments. */ +#endif static QDateTime mStartupTime; // startup time - - static bool useConfigDir; - static QString configDir; bool mBlink; static QLocalServer* localServer; + static RsGUIConfigOptions options; + static Log log_output; }; #endif diff --git a/retroshare-gui/src/util/DateTime.cpp b/retroshare-gui/src/util/DateTime.cpp index b93a4dfe1..658772c5a 100644 --- a/retroshare-gui/src/util/DateTime.cpp +++ b/retroshare-gui/src/util/DateTime.cpp @@ -30,7 +30,7 @@ QString DateTime::formatLongDate(time_t dateValue) QString DateTime::formatLongDate(const QDate &dateValue) { - QString customDateFormat = Rshare::customDateFormat(); + QString customDateFormat = RsApplication::customDateFormat(); if (customDateFormat.isEmpty()) { return dateValue.toString(Qt::ISODate);