Merge remote-tracking branch 'origin/1.8'

This commit is contained in:
Olivier Goffart 2015-03-23 14:37:16 +01:00
commit 9d7cf6b852
27 changed files with 247 additions and 3097 deletions

View file

@ -4,7 +4,7 @@ set( MIRALL_VERSION_PATCH 0 )
set( MIRALL_SOVERSION 0 )
if ( NOT DEFINED MIRALL_VERSION_SUFFIX )
set( MIRALL_VERSION_SUFFIX "rc1") #e.g. beta1, beta2, rc1
set( MIRALL_VERSION_SUFFIX "") #e.g. beta1, beta2, rc1
endif( NOT DEFINED MIRALL_VERSION_SUFFIX )
if( NOT DEFINED MIRALL_VERSION_BUILD )

View file

@ -6,3 +6,4 @@ killall @APPLICATION_EXECUTABLE@
# Unload the Finder plugin. see issue #2105
killall Finder
exit 0

View file

@ -15,6 +15,8 @@ StrCpy $PageReinstall_SAME_Field_3 "Desinstal.lar ${APPLICATION_NAME}"
StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstal.lar ${APPLICATION_NAME}"
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Escolliu l'opció de manteniment per executar-ho."
StrCpy $SEC_APPLICATION_DETAILS "Instal·lant ${APPLICATION_NAME} essencial."
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integració per Windows Explorer"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Instal·lant integració per Windows Explorer"
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Accés directe del programa al menú d'inici"
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Afegint la drecera per ${APPLICATION_NAME} al menú d'inici."
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Drecera a l'escriptori"
@ -42,5 +44,3 @@ StrCpy $INIT_INSTALLER_RUNNING "L'instal·lador ja s'està executant."
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Aquest desinstal·lador requereix accés d'administrador, intenteu-ho de nou."
StrCpy $INIT_UNINSTALLER_RUNNING "El desinstal·lador ja s'està executant."
StrCpy $SectionGroup_Shortcuts "Dreceres"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integration for Windows Explorer"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installing Integration for Windows Explorer"

2
binary

@ -1 +1 @@
Subproject commit 01d73965dc8b862d1b2310d3ef801c297b697ec7
Subproject commit 1fb9ddfa9a9a1b4dbc447eee10dbed89172d968a

View file

@ -67,7 +67,7 @@ class SocketConnect(GObject.GObject):
print("Sending failed.")
self.reconnect()
else:
print "Cannot send, not connected!"
print("Cannot send, not connected!")
def addListener(self, listener):
self._listeners.append(listener)
@ -85,7 +85,7 @@ class SocketConnect(GObject.GObject):
self.connected = True
print("Setting connected to %r" % self.connected )
self._watch_id = GObject.io_add_watch(self._sock, GObject.IO_IN, self._handle_notify)
print "Socket watch id: "+str(self._watch_id)
print("Socket watch id: "+str(self._watch_id))
return False # don't run again
except Exception as e:
print("Could not connect to unix socket." + str(e))
@ -175,7 +175,7 @@ class MenuExtension(GObject.GObject, Nautilus.MenuProvider):
def menu_share(self, menu, file):
filename = get_local_path(file.get_uri())
print "Share file "+filename
print("Share file "+filename)
socketConnect.sendCommand("SHARE:"+filename+"\n")

View file

@ -83,7 +83,6 @@
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;OCCONTEXTMENU_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>..\OCUtil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
@ -101,8 +100,8 @@
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;OCCONTEXTMENU_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\OCUtil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>NDEBUG;_USING_V110_SDK71_;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@ -132,6 +131,7 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<AdditionalIncludeDirectories>..\OCUtil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>NDEBUG;_USING_V110_SDK71_;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>..\$(Configuration)\$(Platform);</AdditionalLibraryDirectories>

View file

@ -127,6 +127,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>..\OCUtil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>NDEBUG;_USING_V110_SDK71_;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
@ -145,6 +146,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>..\OCUtil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>NDEBUG;_USING_V110_SDK71_;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>

View file

@ -120,6 +120,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PrecompiledHeader>Use</PrecompiledHeader>
<PreprocessorDefinitions>NDEBUG;_USING_V110_SDK71_;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
@ -136,6 +137,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PrecompiledHeader>Use</PrecompiledHeader>
<PreprocessorDefinitions>NDEBUG;_USING_V110_SDK71_;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>

View file

@ -179,6 +179,15 @@ void AccountState::checkConnectivity()
conValidator->checkAuthentication();
} else {
// Check the server and then the auth.
#ifdef Q_OS_WIN
// There seems to be a bug in Qt on Windows where QNAM sometimes stops
// working correctly after the computer woke up from sleep. See #2895 #2899
// and #2973.
// As an attempted workaround, reset the QNAM regularly if the account is
// disconnected.
account()->resetNetworkAccessManager();
#endif
conValidator->checkServerAndAuth();
}
}

View file

@ -239,10 +239,13 @@ FolderWizardRemotePath::FolderWizardRemotePath(AccountPtr account)
connect(_ui.addFolderButton, SIGNAL(clicked()), SLOT(slotAddRemoteFolder()));
connect(_ui.refreshButton, SIGNAL(clicked()), SLOT(slotRefreshFolders()));
connect(_ui.folderTreeWidget, SIGNAL(itemClicked(QTreeWidgetItem*,int)), SIGNAL(completeChanged()));
connect(_ui.folderTreeWidget, SIGNAL(itemActivated(QTreeWidgetItem*,int)), SIGNAL(completeChanged()));
connect(_ui.folderTreeWidget, SIGNAL(itemExpanded(QTreeWidgetItem*)), SLOT(slotItemExpanded(QTreeWidgetItem*)));
connect(_ui.folderTreeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(slotCurrentItemChanged(QTreeWidgetItem*)));
connect(_ui.folderEntry, SIGNAL(textEdited(QString)), SLOT(slotFolderEntryEdited(QString)));
_lscolTimer.setInterval(500);
_lscolTimer.setSingleShot(true);
connect(&_lscolTimer, SIGNAL(timeout()), SLOT(slotLsColFolderEntry()));
}
void FolderWizardRemotePath::slotAddRemoteFolder()
@ -315,27 +318,58 @@ static QTreeWidgetItem* findFirstChild(QTreeWidgetItem *parent, const QString& t
void FolderWizardRemotePath::recursiveInsert(QTreeWidgetItem *parent, QStringList pathTrail, QString path)
{
QFileIconProvider prov;
QIcon folderIcon = prov.icon(QFileIconProvider::Folder);
if (pathTrail.size() == 0) {
if (path.endsWith('/')) {
path.chop(1);
}
parent->setToolTip(0, path);
parent->setData(0, Qt::UserRole, path);
} else {
QTreeWidgetItem *item = findFirstChild(parent, pathTrail.first());
if (!item) {
item = new QTreeWidgetItem(parent);
item->setIcon(0, folderIcon);
item->setText(0, pathTrail.first());
item->setData(0, Qt::UserRole, pathTrail.first());
item->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);
}
if (pathTrail.isEmpty())
return;
pathTrail.removeFirst();
recursiveInsert(item, pathTrail, path);
const QString parentPath = parent->data(0, Qt::UserRole).toString();
const QString folderName = pathTrail.first();
QString folderPath;
if (parentPath == QLatin1String("/")) {
folderPath = folderName;
} else {
folderPath = parentPath + "/" + folderName;
}
QTreeWidgetItem *item = findFirstChild(parent, folderName);
if (!item) {
item = new QTreeWidgetItem(parent);
QFileIconProvider prov;
QIcon folderIcon = prov.icon(QFileIconProvider::Folder);
item->setIcon(0, folderIcon);
item->setText(0, folderName);
item->setData(0, Qt::UserRole, folderPath);
item->setToolTip(0, folderPath);
item->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);
}
pathTrail.removeFirst();
recursiveInsert(item, pathTrail, path);
}
bool FolderWizardRemotePath::selectByPath(QString path)
{
if (path.startsWith(QLatin1Char('/'))) {
path = path.mid(1);
}
if (path.endsWith(QLatin1Char('/'))) {
path.chop(1);
}
QTreeWidgetItem *it = _ui.folderTreeWidget->topLevelItem(0);
if (!path.isEmpty()) {
const QStringList pathTrail = path.split(QLatin1Char('/'));
foreach (const QString& path, pathTrail) {
if (!it) {
return false;
}
it = findFirstChild(it, path);
}
}
if (!it) {
return false;
}
_ui.folderTreeWidget->setCurrentItem(it);
return true;
}
void FolderWizardRemotePath::slotUpdateDirectories(const QStringList &list)
@ -367,6 +401,7 @@ void FolderWizardRemotePath::slotRefreshFolders()
SLOT(slotUpdateDirectories(QStringList)));
job->start();
_ui.folderTreeWidget->clear();
_ui.folderEntry->clear();
}
void FolderWizardRemotePath::slotItemExpanded(QTreeWidgetItem *item)
@ -379,6 +414,49 @@ void FolderWizardRemotePath::slotItemExpanded(QTreeWidgetItem *item)
job->start();
}
void FolderWizardRemotePath::slotCurrentItemChanged(QTreeWidgetItem *item)
{
if (item) {
QString dir = item->data(0, Qt::UserRole).toString();
if (!dir.startsWith(QLatin1Char('/'))) {
dir.prepend(QLatin1Char('/'));
}
_ui.folderEntry->setText(dir);
}
emit completeChanged();
}
void FolderWizardRemotePath::slotFolderEntryEdited(const QString& text)
{
if (selectByPath(text)) {
_lscolTimer.stop();
return;
}
_ui.folderTreeWidget->setCurrentItem(0);
_lscolTimer.start(); // avoid sending a request on each keystroke
}
void FolderWizardRemotePath::slotLsColFolderEntry()
{
QString path = _ui.folderEntry->text();
if (path.startsWith(QLatin1Char('/')))
path = path.mid(1);
LsColJob *job = new LsColJob(_account, path, this);
job->setProperties(QList<QByteArray>() << "resourcetype");
connect(job, SIGNAL(directoryListingSubfolders(QStringList)),
SLOT(slotTypedPathFound(QStringList)));
job->start();
}
void FolderWizardRemotePath::slotTypedPathFound(const QStringList& subpaths)
{
slotUpdateDirectories(subpaths);
selectByPath(_ui.folderEntry->text());
}
FolderWizardRemotePath::~FolderWizardRemotePath()
{
}

View file

@ -86,11 +86,17 @@ protected slots:
void slotUpdateDirectories(const QStringList&);
void slotRefreshFolders();
void slotItemExpanded(QTreeWidgetItem*);
void slotCurrentItemChanged(QTreeWidgetItem*);
void slotFolderEntryEdited(const QString& text);
void slotLsColFolderEntry();
void slotTypedPathFound(const QStringList& subpaths);
private:
void recursiveInsert(QTreeWidgetItem *parent, QStringList pathTrail, QString path);
bool selectByPath(QString path);
Ui_FolderWizardTargetPage _ui;
bool _warnWasVisible;
AccountPtr _account;
QTimer _lscolTimer;
};

View file

@ -14,7 +14,10 @@
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_6">
<item row="3" column="0">
<item row="1" column="0">
<widget class="QLineEdit" name="folderEntry"/>
</item>
<item row="2" column="0">
<widget class="QFrame" name="warnFrame">
<property name="palette">
<palette>
@ -179,7 +182,7 @@
</layout>
</widget>
</item>
<item row="4" column="0">
<item row="3" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>

View file

@ -185,8 +185,9 @@ void SocketApi::slotNewConnection()
broadcastMessage(QLatin1String("ICON_PATH"), iconPath );
#endif
foreach( QString alias, FolderMan::instance()->map().keys() ) {
slotRegisterPath(alias);
foreach( Folder *f, FolderMan::instance()->map() ) {
QString message = buildRegisterPathMessage(f->path());
sendMessage(socket, message);
}
}
@ -226,7 +227,10 @@ void SocketApi::slotRegisterPath( const QString& alias )
{
Folder *f = FolderMan::instance()->folder(alias);
if (f) {
broadcastMessage(QLatin1String("REGISTER_PATH"), f->path() );
QString message = buildRegisterPathMessage(f->path());
foreach(SocketType *socket, _listeners) {
sendMessage(socket, message);
}
}
}
@ -449,6 +453,14 @@ void SocketApi::command_SHARE_MENU_TITLE(const QString &, SocketType* socket)
sendMessage(socket, QLatin1String("SHARE_MENU_TITLE:") + tr("Share with %1", "parameter is ownCloud").arg(Theme::instance()->appNameGUI()));
}
QString SocketApi::buildRegisterPathMessage(const QString& path)
{
QFileInfo fi(path);
QString message = QLatin1String("REGISTER_PATH:");
message.append(QDir::toNativeSeparators(fi.absoluteFilePath()));
return message;
}
SqlQuery* SocketApi::getSqlQuery( Folder *folder )
{
if( !folder ) {

View file

@ -82,6 +82,7 @@ private:
Q_INVOKABLE void command_VERSION(const QString& argument, SocketType* socket);
Q_INVOKABLE void command_SHARE_MENU_TITLE(const QString& argument, SocketType* socket);
QString buildRegisterPathMessage(const QString& path);
#ifdef SOCKETAPI_TCP
QTcpServer _localServer;

View file

@ -271,6 +271,21 @@ void Account::clearCookieJar()
_am->setCookieJar(new CookieJar);
}
void Account::resetNetworkAccessManager()
{
if (!_credentials || !_am) {
return;
}
qDebug() << "Resetting QNAM";
QNetworkCookieJar* jar = _am->cookieJar();
_am->deleteLater();
_am = _credentials->getQNAM();
_am->setCookieJar(jar); // takes ownership of the old cookie jar
connect(_am, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)),
SLOT(slotHandleErrors(QNetworkReply*,QList<QSslError>)));
}
QNetworkAccessManager *Account::networkAccessManager()
{
return _am;

View file

@ -156,6 +156,7 @@ public:
void clearCookieJar();
void resetNetworkAccessManager();
QNetworkAccessManager* networkAccessManager();
/// Called by network jobs on credential errors.

View file

@ -103,7 +103,7 @@ void CookieJar::save()
qDebug() << storagePath();
file.open(QIODevice::WriteOnly);
QDataStream stream(&file);
stream << allCookies();
stream << removeExpired(allCookies());
file.close();
}

View file

@ -368,6 +368,7 @@ void PropagateDownloadFileQNAM::start()
_job->start();
}
const char owncloudCustomSoftErrorStringC[] = "owncloud-custom-soft-error-string";
void PropagateDownloadFileQNAM::slotGetFinished()
{
_propagator->_activeJobs--;
@ -407,7 +408,18 @@ void PropagateDownloadFileQNAM::slotGetFinished()
return;
}
// This gives a custom QNAM (by the user of libowncloudsync) to abort() a QNetworkReply in its metaDataChanged() slot and
// set a custom error string to make this a soft error. In contrast to the default hard error this won't bring down
// the whole sync and allows for a custom error message.
QNetworkReply *reply = job->reply();
if (err == QNetworkReply::OperationCanceledError && reply->property(owncloudCustomSoftErrorStringC).isValid()) {
job->setErrorString(reply->property(owncloudCustomSoftErrorStringC).toString());
job->setErrorStatus(SyncFileItem::SoftError);
}
SyncFileItem::Status status = job->errorStatus();
if (status == SyncFileItem::NoStatus) {
status = classifyError(err, _item._httpErrorCode);
}

View file

@ -78,8 +78,10 @@ public:
qint64 currentDownloadPosition();
QString errorString() const;
void setErrorString(const QString& s) { _errorString = s; }
SyncFileItem::Status errorStatus() { return _errorStatus; }
void setErrorStatus(const SyncFileItem::Status & s) { _errorStatus = s; }
virtual void slotTimeout() Q_DECL_OVERRIDE;

View file

@ -85,9 +85,10 @@ void PropagateRemoteDelete::slotDeleteJobFinished()
<< (_job->reply()->error() == QNetworkReply::NoError ? QLatin1String("") : _job->reply()->errorString());
QNetworkReply::NetworkError err = _job->reply()->error();
_item._httpErrorCode = _job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
const int httpStatus = _job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
_item._httpErrorCode = httpStatus;
if (err != QNetworkReply::NoError) {
if (err != QNetworkReply::NoError && err != QNetworkReply::ContentNotFoundError) {
if( checkForProblemsWithShared(_item._httpErrorCode,
tr("The file has been removed from a read only share. It was restored.")) ) {
@ -102,7 +103,11 @@ void PropagateRemoteDelete::slotDeleteJobFinished()
_item._requestDuration = _job->duration();
_item._responseTimeStamp = _job->responseTimestamp();
if (_item._httpErrorCode != 204 ) {
// A 404 reply is also considered a success here: We want to make sure
// a file is gone from the server. It not being there in the first place
// is ok. This will happen for files that are in the DB but not on
// the server or the local file system.
if (httpStatus != 204 && httpStatus != 404) {
// Normaly we expect "204 No Content"
// If it is not the case, it might be because of a proxy or gateway intercepting the request, so we must
// throw an error.

View file

@ -402,6 +402,7 @@ void PropagateUploadFileQNAM::startNextChunk()
return;
}
// job takes ownership of device via a QScopedPointer. Job deletes itself when finishing
PUTFileJob* job = new PUTFileJob(_propagator->account(), _propagator->_remoteFolder + path, device, headers, _currentChunk);
_jobs.append(job);
connect(job, SIGNAL(finishedSignal()), this, SLOT(slotPutFinished()));

View file

@ -1783,7 +1783,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharedialog.ui" line="75"/>
<source>OwnCloud Path:</source>
<translation type="unfinished"/>
<translation>Διαδρομή ownCloud:</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="89"/>
@ -1909,7 +1909,7 @@ It is not advisable to use it.</source>
<location filename="../src/gui/socketapi.cpp" line="431"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation type="unfinished"/>
<translation>Διαμοιρασμός με %1</translation>
</message>
</context>
<context>
@ -2218,7 +2218,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/syncengine.cpp" line="156"/>
<source>The mounted directory is temporarily not available on the server</source>
<translation type="unfinished"/>
<translation>Ο προσαρτημένος κατάλογος δεν είναι προσωρινά διαθέσιμος στον δικομιστή</translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="159"/>

View file

@ -916,7 +916,7 @@ Les items cochés seront également supprimés s&apos;ils empêchent la suppress
<message>
<location filename="../src/gui/updater/ocupdater.cpp" line="275"/>
<source>Skip this version</source>
<translation>Ignorer cette version.</translation>
<translation>Ignorer cette version</translation>
</message>
<message>
<location filename="../src/gui/updater/ocupdater.cpp" line="276"/>
@ -1007,7 +1007,7 @@ Les items cochés seront également supprimés s&apos;ils empêchent la suppress
<message>
<location filename="../src/gui/networksettings.cpp" line="34"/>
<source>Hostname of proxy server</source>
<translation>Nom d&apos;hôte ou serveur mandataire</translation>
<translation>Nom d&apos;hôte du serveur mandataire</translation>
</message>
<message>
<location filename="../src/gui/networksettings.cpp" line="35"/>
@ -2389,7 +2389,7 @@ Il est déconseillé de l&apos;utiliser.</translation>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="295"/>
<source>None.</source>
<translation>Aucun.</translation>
<translation>Aucune</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="299"/>

View file

@ -2265,7 +2265,7 @@ Recomendámoslle que non o use.</translation>
<message>
<location filename="../src/libsync/syncengine.cpp" line="567"/>
<source>Unable to initialize a sync journal.</source>
<translation>Non é posíbel iniciar un rexistro de sincronización.</translation>
<translation>Non é posíbel preparar un rexistro de sincronización.</translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="648"/>

View file

@ -1926,7 +1926,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sslbutton.cpp" line="101"/>
<source>Subject Alternative Names:</source>
<translation>Subject Alternative Names():</translation>
<translation>:</translation>
</message>
<message>
<location filename="../src/gui/sslbutton.cpp" line="103"/>
@ -1971,7 +1971,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sslbutton.cpp" line="115"/>
<source>Expires on:</source>
<translation>:</translation>
<translation>:</translation>
</message>
<message>
<location filename="../src/gui/sslbutton.cpp" line="118"/>

View file

@ -733,7 +733,7 @@ Are you sure you want to perform this operation?</source>
<message>
<location filename="../src/gui/generalsettings.ui" line="47"/>
<source>Show crash reporter</source>
<translation type="unfinished"/>
<translation>Показати звіти про помилки</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="57"/>
@ -1202,7 +1202,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="193"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation type="unfinished"/>
<translation>Перевищено час очікування з&apos;єднання до %1 на %2.</translation>
</message>
<message>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="204"/>
@ -1212,7 +1212,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="253"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation type="unfinished"/>
<translation>Доступ заборонений сервером. Щоб довести, що у Вас є права доступу, &lt;a href=&quot;%1&quot;&gt;клікніть тут&lt;/a&gt; для входу через Ваш браузер.</translation>
</message>
<message>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="275"/>
@ -1361,7 +1361,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/propagateupload.cpp" line="121"/>
<source>Invalid JSON reply from the poll URL</source>
<translation type="unfinished"/>
<translation>Неправильна JSON відповідь на сформований URL</translation>
</message>
</context>
<context>
@ -1420,7 +1420,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/owncloudpropagator.cpp" line="104"/>
<source>Continue blacklisting: </source>
<translation type="unfinished"/>
<translation>Продовжити занесення до чорного списку:</translation>
</message>
<message>
<location filename="../src/libsync/owncloudpropagator.cpp" line="200"/>
@ -1477,7 +1477,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/propagateremotedelete.cpp" line="103"/>
<source>Wrong HTTP code returned by server. Expected 204, but recieved &quot;%1 %2&quot;.</source>
<translation type="unfinished"/>
<translation>Сервер відповів неправильним HTTP кодом. Очікувався 204, але отриманий &quot;%1 %2&quot;.</translation>
</message>
</context>
<context>
@ -1485,7 +1485,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/propagateremotemkdir.cpp" line="67"/>
<source>Wrong HTTP code returned by server. Expected 201, but recieved &quot;%1 %2&quot;.</source>
<translation type="unfinished"/>
<translation>Сервер відповів неправильним HTTP кодом. Очікувався 201, але отриманий &quot;%1 %2&quot;.</translation>
</message>
</context>
<context>
@ -1508,7 +1508,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/propagateremotemove.cpp" line="127"/>
<source>Wrong HTTP code returned by server. Expected 201, but recieved &quot;%1 %2&quot;.</source>
<translation type="unfinished"/>
<translation>Сервер відповів неправильним HTTP кодом. Очікувався 201, але отриманий &quot;%1 %2&quot;.</translation>
</message>
</context>
<context>
@ -1551,7 +1551,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/propagateupload.cpp" line="468"/>
<source>Poll URL missing</source>
<translation type="unfinished"/>
<translation>Не вистачає сформованого URL</translation>
</message>
<message>
<location filename="../src/libsync/propagateupload.cpp" line="493"/>
@ -1645,13 +1645,19 @@ It is not advisable to use it.</source>
<location filename="../src/gui/protocolwidget.cpp" line="265"/>
<source>%n files are ignored because of previous errors.
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>%n файл пропущено через попередні помилки.
</numerusform><numerusform>%n файлів пропущено через попередні помилки.
</numerusform><numerusform>%n файлів пропущено через попередні помилки.
</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/gui/protocolwidget.cpp" line="266"/>
<source>%n files are partially downloaded.
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>%n файлів частково завантажений.
</numerusform><numerusform>%n файлів частково завантажені.
</numerusform><numerusform>%n файлів частково завантажено.
</numerusform></translation>
</message>
<message>
<location filename="../src/gui/protocolwidget.cpp" line="267"/>
@ -1669,12 +1675,12 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/selectivesyncdialog.cpp" line="318"/>
<source>Choose What to Sync: Select remote subfolders you wish to synchronize.</source>
<translation type="unfinished"/>
<translation>Виберіть Що Синхронізувати: Виберіть папки на віддаленому сервері, які Ви хотіли б синхронізувати.</translation>
</message>
<message>
<location filename="../src/gui/selectivesyncdialog.cpp" line="319"/>
<source>Choose What to Sync: Deselect remote subfolders you do not wish to synchronize.</source>
<translation type="unfinished"/>
<translation>Виберіть Що Синхронізувати: Зніміть вибір папок на віддаленому сервері, які Ви не хочете синхронізувати.</translation>
</message>
<message>
<location filename="../src/gui/selectivesyncdialog.cpp" line="325"/>
@ -1761,12 +1767,12 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharedialog.ui" line="14"/>
<source>Share NewDocument.odt</source>
<translation type="unfinished"/>
<translation>Поділитися NewDocument.odt</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="26"/>
<source>Share Info</source>
<translation type="unfinished"/>
<translation>Поділитися Інформацією</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="34"/>
@ -1777,12 +1783,12 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharedialog.ui" line="53"/>
<source>share label</source>
<translation type="unfinished"/>
<translation>поділитися міткою</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="75"/>
<source>OwnCloud Path:</source>
<translation type="unfinished"/>
<translation>Шлях до OwnCloud:</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="89"/>
@ -1803,12 +1809,12 @@ It is not advisable to use it.</source>
<location filename="../src/gui/sharedialog.cpp" line="67"/>
<location filename="../src/gui/sharedialog.cpp" line="461"/>
<source>%1 path: %2</source>
<translation type="unfinished"/>
<translation>%1 шлях: %2</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="68"/>
<source>%1 Sharing</source>
<translation type="unfinished"/>
<translation>Ви поділилися %1</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="141"/>
@ -1823,27 +1829,27 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharedialog.cpp" line="351"/>
<source>OCS API error code: %1</source>
<translation type="unfinished"/>
<translation>OCS API код помилки: %1</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="374"/>
<source>There is no sync folder configured.</source>
<translation type="unfinished"/>
<translation>Немає папок налаштованих для синхронізації.</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="386"/>
<source>Can not find an folder to upload to.</source>
<translation type="unfinished"/>
<translation>Неможливо знайти папку для завантаження в неї.</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="393"/>
<source>Sharing of external directories is not yet working.</source>
<translation type="unfinished"/>
<translation>Функція відкриття доступу до зовнішніх папок поки не працює.</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="408"/>
<source>A sync file with the same name exists. The file can not be registered to sync.</source>
<translation type="unfinished"/>
<translation>Існує файл з ім&apos;ям як у синхронізованого. Файл не може бути прийнятий до синхронізації.</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="420"/>
@ -1853,17 +1859,17 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharedialog.cpp" line="422"/>
<source>Unable to register in sync space.</source>
<translation type="unfinished"/>
<translation>Неможливо зареєструватися в синхронізованому просторі.</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="453"/>
<source>The file can not be synced.</source>
<translation type="unfinished"/>
<translation>Файл не може бути синхронізований.</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="463"/>
<source>Sync of registered file was not successful yet.</source>
<translation type="unfinished"/>
<translation>Синхронізація зареєстрованого файлу поки не була успішною.</translation>
</message>
</context>
<context>
@ -1908,7 +1914,7 @@ It is not advisable to use it.</source>
<location filename="../src/gui/socketapi.cpp" line="431"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation type="unfinished"/>
<translation>Поділитися з %1</translation>
</message>
</context>
<context>
@ -2122,7 +2128,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/syncengine.cpp" line="99"/>
<source>CSync failed to load the journal file. The journal file is corrupted.</source>
<translation type="unfinished"/>
<translation>CSync не вдалося завантажити файл журналу. Файл журналу пошкоджений.</translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="102"/>
@ -2217,12 +2223,12 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/syncengine.cpp" line="156"/>
<source>The mounted directory is temporarily not available on the server</source>
<translation type="unfinished"/>
<translation>Приєднана тека тимчасово недоступна на сервері</translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="159"/>
<source>An error opening a directory happened</source>
<translation type="unfinished"/>
<translation>Сталася помилка при відкритті теки</translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="162"/>
@ -2345,7 +2351,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/theme.cpp" line="237"/>
<source>&lt;p&gt;Copyright ownCloud, Incorporated&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;p&gt; Права належать ownCloud, Incorporated &lt;/p&gt;</translation>
</message>
<message>
<location filename="../src/libsync/theme.cpp" line="238"/>
@ -2453,7 +2459,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="435"/>
<source>Crash now</source>
<translation type="unfinished"/>
<translation>Критична помилка</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="446"/>
@ -2501,7 +2507,7 @@ It is not advisable to use it.</source>
<message utf8="true">
<location filename="../src/libsync/owncloudtheme.cpp" line="48"/>
<source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud, Inc.&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;p&gt;Версія %2. Для більш детальної інформації відвідайте &lt;a href=&quot;%3&quot;&gt;%4&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;small&gt; Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz та інші.&lt;/ small&gt;&lt;/p&gt; &lt;p&gt; Права належать ownCloud, Inc. &lt;/p&gt; &lt;p&gt; Під ліцензією GNU General Public License (GPL) Version 2.0 &lt;br/&gt; ownCloud і логотип ownCloud є зареєстрованими товарними знаками ownCloud, Inc. в США та інших країнах. &lt;/p&gt;</translation>
</message>
</context>
<context>
@ -2560,7 +2566,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="224"/>
<source>S&amp;ync everything from server</source>
<translation type="unfinished"/>
<translation>Синхронізувати все з сервером</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="306"/>
@ -2578,7 +2584,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="43"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Failed to connect to the secure server address specified. How do you wish to proceed?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"/>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; Не вдалося підключитися до безпечного серверу за наданною адресою. Як Ви хочете продовжити? &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="55"/>
@ -2588,17 +2594,17 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="62"/>
<source>Retry unencrypted over HTTP (insecure)</source>
<translation type="unfinished"/>
<translation>Спробувати без шифрування через HTTP (небезпечно)</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="69"/>
<source>Configure client-side TLS certificate</source>
<translation type="unfinished"/>
<translation>Налаштувати TLS сертифікат клієнта</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.cpp" line="18"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Failed to connect to the secure server address &lt;em&gt;%1&lt;/em&gt;. How do you wish to proceed?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"/>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Не вдалося підключитися до безпечного серверу за адресою &lt;em&gt;%1&lt;/em&gt;. Як Ви хочете продовжити?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
@ -2747,22 +2753,22 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/utility.cpp" line="113"/>
<source>%L1 TiB</source>
<translation type="unfinished"/>
<translation>%L1 Тіб</translation>
</message>
<message>
<location filename="../src/libsync/utility.cpp" line="116"/>
<source>%L1 GiB</source>
<translation type="unfinished"/>
<translation>%L1 ГіБ</translation>
</message>
<message>
<location filename="../src/libsync/utility.cpp" line="119"/>
<source>%L1 MiB</source>
<translation type="unfinished"/>
<translation>%L1 МіБ</translation>
</message>
<message>
<location filename="../src/libsync/utility.cpp" line="122"/>
<source>%L1 KiB</source>
<translation type="unfinished"/>
<translation>%L1 КіБ </translation>
</message>
<message>
<location filename="../src/libsync/utility.cpp" line="125"/>

File diff suppressed because it is too large Load diff