diff --git a/CMakeLists.txt b/CMakeLists.txt index 805b0f4bd..67fef50e2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -246,6 +246,7 @@ set(WITH_TESTING ${UNIT_TESTING}) if(BUILD_CLIENT) add_subdirectory(src) if(NOT BUILD_LIBRARIES_ONLY) + add_subdirectory(man) add_subdirectory(doc) add_subdirectory(doc/dev) if(IS_DIRECTORY ${CMAKE_SOURCE_DIR}/admin) diff --git a/ChangeLog b/ChangeLog index 412f60b36..f470b78bf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,9 +1,10 @@ ChangeLog ========= -version 2.4.0 (2017-11-XX) +version 2.4.0 (2017-12-XX) * If you're using 2.4.0 alpha1, please upgrade as the alpha1 had an issue with hidden files! * OAuth2 authentication support by opening external browser (#5668) +* Shibboleth: Change to use OAuth2 if supported (#6198) * Sharing: Add support for multiple public link shares (#5655) * Sharing: Add option to copy/email private links (#5023, #5627) * Sharing: Add option "show file listing" (#5837) @@ -61,6 +62,7 @@ version 2.4.0 (2017-11-XX) * Sync: Introduce overall errors that are not tied to a file (#5746) * Sync: Better messaging for 507 Insufficient Storage (#5537) * Sync: Create conflicts by comparing the hash of files with identical mtime/size (#5589) +* Sync: Avoid downloads by comparing the hash of files with identical mtime/size (#6153) * Sync: Upload conflict files if OWNCLOUD_UPLOAD_CONFLICT_FILES environment variable is set (#6038) * Sync: Blacklist: Don't let errors become warnings (#5516) * Sync: Check etag again after active sync (#4116) diff --git a/cmake/modules/QtVersionAbstraction.cmake b/cmake/modules/QtVersionAbstraction.cmake index 0a13fe5e0..ce48b4487 100644 --- a/cmake/modules/QtVersionAbstraction.cmake +++ b/cmake/modules/QtVersionAbstraction.cmake @@ -98,7 +98,7 @@ set(QT_RCC_EXECUTABLE "${Qt5Core_RCC_EXECUTABLE}") #Enable deprecated symbols add_definitions("-DQT_DISABLE_DEPRECATED_BEFORE=0") - +add_definitions("-DQT_DEPRECATED_WARNINGS") add_definitions("-DQT_USE_QSTRINGBUILDER") #optimize string concatenation add_definitions("-DQT_MESSAGELOGCONTEXT") #enable function name and line number in debug output diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index f706a701c..762a42830 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -4,7 +4,6 @@ if(SPHINX_FOUND) set(SPHINX_CACHE_DIR "${CMAKE_CURRENT_BINARY_DIR}/_doctrees") # HTML output directory set(SPHINX_HTML_DIR "${CMAKE_CURRENT_BINARY_DIR}/html") - set(SPHINX_MAN_DIR "${CMAKE_CURRENT_BINARY_DIR}/man1") set(SPHINX_PDF_DIR "${CMAKE_CURRENT_BINARY_DIR}/latex") set(SPHINX_QCH_DIR "${CMAKE_CURRENT_BINARY_DIR}/qthelp") set(SPHINX_HTMLHELP_DIR "${CMAKE_CURRENT_BINARY_DIR}/htmlhelp") @@ -17,8 +16,6 @@ if(SPHINX_FOUND) install(DIRECTORY ${SPHINX_PDF_DIR} DESTINATION ${APPLICATION_DOC_DIR} OPTIONAL) install(DIRECTORY ${SPHINX_QCH_DIR} DESTINATION ${APPLICATION_DOC_DIR} OPTIONAL) - install(DIRECTORY ${SPHINX_MAN_DIR} DESTINATION ${CMAKE_INSTALL_MANDIR} OPTIONAL) - configure_file("${CMAKE_CURRENT_SOURCE_DIR}/conf.py.in" conf.py @ONLY) if(WITH_DOC) @@ -79,11 +76,6 @@ if(SPHINX_FOUND) -D html_theme=owncloud_com ${CMAKE_CURRENT_SOURCE_DIR} ${SPHINX_HTML_DIR}/com ) - add_custom_target( doc-man ${SPHINX_EXECUTABLE} - -q -c . -b man - -d ${SPHINX_CACHE_DIR}/man - ${CMAKE_CURRENT_SOURCE_DIR} - ${SPHINX_MAN_DIR} ) ## Building CHM files requires HTML Help Workshop. Since it requires wine ## with special dependencies, it's impossible to write a cmake check for it. @@ -98,4 +90,4 @@ if(SPHINX_FOUND) ${SPHINX_HTMLHELP_DIR} ) add_custom_target( doc-chm pushd ${SPHINX_HTMLHELP_DIR}; ${MSHTML_COMPILER} *.hhp; popd DEPENDS doc-chm-sphinx ) -endif(SPHINX_FOUND) +endif(SPHINX_FOUND) \ No newline at end of file diff --git a/doc/autoupdate.rst b/doc/autoupdate.rst index ad0ff0340..e581a70ae 100644 --- a/doc/autoupdate.rst +++ b/doc/autoupdate.rst @@ -119,7 +119,7 @@ Preventing Automatic Updates in Linux Environments Because the Linux client does not provide automatic updating functionality, there is no need to remove the automatic-update check. However, if you want to disable it edit your desktop -client configuration file, ``$HOME/.local/share/data/ownCloud/owncloud.cfg``. +client configuration file, ``$HOME/.config/ownCloud/owncloud.cfg``. Add this line to the [General] section:: skipUpdateCheck=true diff --git a/doc/conffile.rst b/doc/conffile.rst index 3fdcc179b..dda2bd68b 100644 --- a/doc/conffile.rst +++ b/doc/conffile.rst @@ -1,13 +1,13 @@ The ownCloud Client reads a configuration file. You can locate this configuration file as follows: On Linux distributions: - ``$HOME/.local/share/data/ownCloud/owncloud.cfg`` + ``$HOME/.config/ownCloud/owncloud.cfg`` On Microsoft Windows systems: - ``%LOCALAPPDATA%\ownCloud\owncloud.cfg`` + ``%APPDATA%\ownCloud\owncloud.cfg`` On MAC OS X systems: - ``$HOME/Library/Application Support/ownCloud/owncloud.cfg`` + ``$HOME/Library/Preferences/ownCloud/owncloud.cfg`` The configuration file contains settings using the Microsoft Windows .ini file diff --git a/man/CMakeLists.txt b/man/CMakeLists.txt new file mode 100644 index 000000000..f99b0dee6 --- /dev/null +++ b/man/CMakeLists.txt @@ -0,0 +1,14 @@ +if(SPHINX_FOUND) + + # Sphinx cache with pickled ReST documents + set(SPHINX_CACHE_DIR "${CMAKE_CURRENT_BINARY_DIR}/_doctrees") + + # HTML output directory + set(SPHINX_MAN_DIR "${CMAKE_CURRENT_BINARY_DIR}/man1") + install(DIRECTORY ${SPHINX_MAN_DIR} DESTINATION ${CMAKE_INSTALL_MANDIR} OPTIONAL) + add_custom_target( doc-man ${SPHINX_EXECUTABLE} + -c ${CMAKE_SOURCE_DIR}/doc -b man + -d ${SPHINX_CACHE_DIR}/man + ${CMAKE_CURRENT_SOURCE_DIR} + ${SPHINX_MAN_DIR} ) +endif(SPHINX_FOUND) diff --git a/man/index.rst b/man/index.rst new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/man/index.rst @@ -0,0 +1 @@ + diff --git a/man/owncloud.1.rst b/man/owncloud.1.rst new file mode 100644 index 000000000..5f34fbb6e --- /dev/null +++ b/man/owncloud.1.rst @@ -0,0 +1,33 @@ +:orphan: + +owncloud(1) +———— + +SYNOPSIS +======== +*owncloud* [`OPTIONS`...] + + +DESCRIPTION +=========== +The ownCloud Client is a file synchronization desktop utility. It synchronizes files on your local computer, tablet, or handheld device with an ownCloud Server. If you make a change to the files on one device, the change is propagated to all other synchronized devices using the desktop synchronization clients. + +Normally, you start the client by clicking on the desktop icon or by starting it from the client application menu. After starting, an ownCloud icon appears in the computer system tray or on your tablet or handheld device. + +Options +======= +.. include:: ../doc/options.rst + +Config File +=========== +.. include:: ../doc/conffile.rst + +BUGS +==== + +Please report bugs at https://github.com/owncloud/client/issues. + + +SEE ALSO +======== +:manpage:`owncloudcmd(1)` diff --git a/man/owncloudcmd.1.rst b/man/owncloudcmd.1.rst new file mode 100644 index 000000000..8d2e54f9c --- /dev/null +++ b/man/owncloudcmd.1.rst @@ -0,0 +1,97 @@ +:orphan: + +owncloudcmd(1) +————— + +SYNOPSIS +======== +*owncloudcmd* [`OPTIONS`...] sourcedir owncloudurl + +DESCRIPTION +=========== +owncloudcmd is the command line tool used for the ownCloud file synchronization +desktop utility. + +Contrary to the :manpage:`owncloud(1)` GUI client, `owncloudcmd` only performs +a single sync run and then exits. In so doing, `owncloudcmd` replaces the +`ocsync` binary used for the same purpose in earlier releases. + +A *sync run* synchronizes a single local directory using a WebDAV share on a +remote ownCloud server. + +To invoke the command line client, provide the local and the remote repository: +The first parameter is the local directory. The second parameter is +the server URL. + +.. note:: Prior to the 1.6 release of owncloudcmd, the tool only accepted + ``owncloud://`` or ``ownclouds://`` in place of ``http://`` and ``https://`` as + a scheme. See ``Examples`` for details. + +OPTIONS +======= +``—user``, ``-u`` ``[user]`` + Use ``user`` as the login name. + +``—password``, ``-p`` ``[password]`` + Use ``password`` as the password. + +``-n`` + Use ``netrc (5)`` for login. + +``—non-interactive`` + Do not prompt for questions. + +``—silent``, ``—s`` + Inhibits verbose log output. + +``—trust`` + Trust any SSL certificate, including invalid ones. + +``—httpproxy http://[user@pass:]:`` + Uses ``server`` as HTTP proxy. + +``—nonshib`` + Uses Non Shibboleth WebDAV Authentication + +``—davpath [path]`` + Overrides the WebDAV Path with ``path`` + +``—exclude [file]`` + Exclude list file + +``—unsyncedfolders [file]`` + File containing the list of unsynced folders (selective sync) + +``—max-sync-retries [n]`` + Retries maximum n times (defaults to 3) + +``-h`` + Sync hidden files,do not ignore them + +Example +======= +To synchronize the ownCloud directory ``Music`` to the local directory ``media/music`` +through a proxy listening on port ``8080`` on the gateway machine ``192.168.178.1``, +the command line would be:: + + $ owncloudcmd —httpproxy http://192.168.178.1:8080 \ + $HOME/media/music \ + https://server/owncloud/remote.php/webdav/Music + +``owncloudcmd`` will enquire user name and password, unless they have +been specified on the command line or ``-n`` (see `netrc(5)`) has been passed. + +Using the legacy scheme, it would be:: + + $ owncloudcmd —httpproxy http://192.168.178.1:8080 \ + $HOME/media/music \ + ownclouds://server/owncloud/remote.php/webdav/Music + + +BUGS +==== +Please report bugs at https://github.com/owncloud/client/issues. + +SEE ALSO +======== +:manpage:`owncloud(1)` \ No newline at end of file diff --git a/mirall.desktop.in b/mirall.desktop.in index 0d8b87b3a..79b65d54b 100644 --- a/mirall.desktop.in +++ b/mirall.desktop.in @@ -8,253 +8,6 @@ GenericName=Folder Sync Icon=@APPLICATION_EXECUTABLE@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - -# Translations - - # Translations diff --git a/shell_integration/windows/OCOverlays/OCOverlay.rc b/shell_integration/windows/OCOverlays/OCOverlay.rc index 4e6dd6ac7..7e937bd90 100644 Binary files a/shell_integration/windows/OCOverlays/OCOverlay.rc and b/shell_integration/windows/OCOverlays/OCOverlay.rc differ diff --git a/shell_integration/windows/OCOverlays/OverlayConstants.h b/shell_integration/windows/OCOverlays/OverlayConstants.h index 5e35d749c..06c58ac37 100644 --- a/shell_integration/windows/OCOverlays/OverlayConstants.h +++ b/shell_integration/windows/OCOverlays/OverlayConstants.h @@ -22,7 +22,7 @@ #define OVERLAY_GUID_WARNING L"{0960F096-F328-48A3-B746-276B1E3C3722}" #define OVERLAY_GUID_WARNING_SHARED L"{0960F097-F328-48A3-B746-276B1E3C3722}" -#define OVERLAY_GENERIC_NAME L"OC Overlay Handler" +#define OVERLAY_GENERIC_NAME L"ownCloud overlay handler" // two spaces to put us ahead of the competition :/ #define OVERLAY_NAME_ERROR L" OCError" @@ -47,4 +47,4 @@ #define GET_FILE_OVERLAY_ID L"getFileIconId" -#define PORT 34001 \ No newline at end of file +#define PORT 34001 diff --git a/src/3rdparty/sqlite3/sqlite3.c b/src/3rdparty/sqlite3/sqlite3.c index 320d6355e..4bb7b461f 100644 --- a/src/3rdparty/sqlite3/sqlite3.c +++ b/src/3rdparty/sqlite3/sqlite3.c @@ -180331,7 +180331,7 @@ static int sessionBindRow( ** iterator pIter points to to the SELECT and attempts to seek to the table ** entry. If a row is found, the SELECT statement left pointing at the row ** and SQLITE_ROW is returned. Otherwise, if no row is found and no error -** has occured, the statement is reset and SQLITE_OK is returned. If an +** has occurred, the statement is reset and SQLITE_OK is returned. If an ** error occurs, the statement is reset and an SQLite error code is returned. ** ** If this function returns SQLITE_ROW, the caller must eventually reset() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5319fbdc2..172422988 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -8,20 +8,29 @@ if(NOT TOKEN_AUTH_ONLY) find_package(Qt5Keychain REQUIRED) endif() -if(WIN32) - # Enable DEP & ASLR - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--nxcompat -Wl,--dynamicbase") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--nxcompat -Wl,--dynamicbase") -elseif(UNIX AND NOT APPLE) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector-strong") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-strong") +if(NOT MSVC) + if(NOT (CMAKE_SYSTEM_PROCESSOR MATCHES "^(parisc|hppa)")) + if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") AND (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector --param=ssp-buffer-size=4") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector --param=ssp-buffer-size=4") + else() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector-strong") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-strong") + endif() + endif() string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER) if(CMAKE_BUILD_TYPE_LOWER MATCHES "(release|relwithdebinfo|minsizerel)") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_FORTIFY_SOURCE=2") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_FORTIFY_SOURCE=2") endif() +endif() +if(WIN32) + # Enable DEP & ASLR + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--nxcompat -Wl,--dynamicbase") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--nxcompat -Wl,--dynamicbase") +elseif(UNIX AND NOT APPLE) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro -Wl,-z,now") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,relro -Wl,-z,now") endif() diff --git a/src/cmd/CMakeLists.txt b/src/cmd/CMakeLists.txt index f1727d7d1..8a62f0779 100644 --- a/src/cmd/CMakeLists.txt +++ b/src/cmd/CMakeLists.txt @@ -31,7 +31,7 @@ endif() if(NOT BUILD_LIBRARIES_ONLY) add_executable(${cmd_NAME} ${cmd_SRC}) - qt5_use_modules(${cmd_NAME} Network Sql) + qt5_use_modules(${cmd_NAME} Network ) set_target_properties(${cmd_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${BIN_OUTPUT_DIRECTORY} ) set_target_properties(${cmd_NAME} PROPERTIES diff --git a/src/cmd/cmd.cpp b/src/cmd/cmd.cpp index 056c748c6..7544ae5cc 100644 --- a/src/cmd/cmd.cpp +++ b/src/cmd/cmd.cpp @@ -53,7 +53,7 @@ using namespace OCC; -static void nullMessageHandler(QtMsgType, const char *) +static void nullMessageHandler(QtMsgType, const QMessageLogContext &, const QString &) { } @@ -333,7 +333,7 @@ int main(int argc, char **argv) csync_set_log_level(options.silent ? 1 : 11); if (options.silent) { - qInstallMsgHandler(nullMessageHandler); + qInstallMessageHandler(nullMessageHandler); } else { qSetMessagePattern("%{time MM-dd hh:mm:ss:zzz} [ %{type} %{category} ]%{if-debug}\t[ %{function} ]%{endif}:\t%{message}"); } @@ -534,7 +534,7 @@ restart_sync: engine.excludedFiles().addExcludeFilePath(systemExcludeFile); } - if (!engine.excludedFiles().reloadExcludes()) { + if (!engine.excludedFiles().reloadExcludeFiles()) { qFatal("Cannot load system exclude list or list supplied via --exclude"); return EXIT_FAILURE; } diff --git a/src/cmd/simplesslerrorhandler.cpp b/src/cmd/simplesslerrorhandler.cpp index 437438507..b25e9958f 100644 --- a/src/cmd/simplesslerrorhandler.cpp +++ b/src/cmd/simplesslerrorhandler.cpp @@ -11,7 +11,6 @@ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ -#include "configfile.h" #include "common/utility.h" #include "account.h" #include "simplesslerrorhandler.h" diff --git a/src/common/ownsql.cpp b/src/common/ownsql.cpp index 55dbec40b..c4277a130 100644 --- a/src/common/ownsql.cpp +++ b/src/common/ownsql.cpp @@ -344,6 +344,7 @@ void SqlQuery::bindValue(int pos, const QVariant &value) break; case QVariant::UInt: case QVariant::LongLong: + case QVariant::ULongLong: res = sqlite3_bind_int64(_stmt, pos, value.toLongLong()); break; case QVariant::DateTime: { diff --git a/src/common/syncjournaldb.cpp b/src/common/syncjournaldb.cpp index 324cced6e..3710f36d3 100644 --- a/src/common/syncjournaldb.cpp +++ b/src/common/syncjournaldb.cpp @@ -45,7 +45,7 @@ Q_LOGGING_CATEGORY(lcDb, "sync.database", QtInfoMsg) static void fillFileRecordFromGetQuery(SyncJournalFileRecord &rec, SqlQuery &query) { rec._path = query.baValue(0); - rec._inode = query.intValue(1); + rec._inode = query.int64Value(1); rec._modtime = query.int64Value(2); rec._type = query.intValue(3); rec._etag = query.baValue(4); diff --git a/src/common/utility.cpp b/src/common/utility.cpp index 1653bd3d2..bdf603515 100644 --- a/src/common/utility.cpp +++ b/src/common/utility.cpp @@ -296,9 +296,7 @@ namespace { QString description(quint64 value) const { - return QCoreApplication::translate( - "Utility", name, 0, QCoreApplication::UnicodeUTF8, - value); + return QCoreApplication::translate("Utility", name, 0, value); } }; // QTBUG-3945 and issue #4855: QT_TRANSLATE_NOOP does not work with plural form because lupdate @@ -520,11 +518,11 @@ void Utility::sortFilenames(QStringList &fileNames) QCollator collator; collator.setNumericMode(true); collator.setCaseSensitivity(Qt::CaseInsensitive); - qSort(fileNames.begin(), fileNames.end(), collator); + std::sort(fileNames.begin(), fileNames.end(), collator); } QUrl Utility::concatUrlPath(const QUrl &url, const QString &concatPath, - const QList> &queryItems) + const QUrlQuery &queryItems) { QString path = url.path(); if (!concatPath.isEmpty()) { @@ -540,9 +538,7 @@ QUrl Utility::concatUrlPath(const QUrl &url, const QString &concatPath, QUrl tmpUrl = url; tmpUrl.setPath(path); - if (queryItems.size() > 0) { - tmpUrl.setQueryItems(queryItems); - } + tmpUrl.setQuery(queryItems); return tmpUrl; } diff --git a/src/common/utility.h b/src/common/utility.h index 1f63302b7..666e44cfd 100644 --- a/src/common/utility.h +++ b/src/common/utility.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -70,7 +71,7 @@ namespace Utility { * @param unit an optional unit that is appended if present. * @return the formatted string. */ - OCSYNC_EXPORT QString compactFormatDouble(double value, int prec, const QString &unit = QString::null); + OCSYNC_EXPORT QString compactFormatDouble(double value, int prec, const QString &unit = QString()); // porting methods OCSYNC_EXPORT QString escape(const QString &); @@ -175,7 +176,7 @@ namespace Utility { /** Appends concatPath and queryItems to the url */ OCSYNC_EXPORT QUrl concatUrlPath( const QUrl &url, const QString &concatPath, - const QList> &queryItems = (QList>())); + const QUrlQuery &queryItems = {}); /** Returns a new settings pre-set in a specific group. The Settings will be created with the given parent. If no parent is specified, the caller must destroy the settings */ diff --git a/src/common/utility_mac.cpp b/src/common/utility_mac.cpp index 6c789b17a..4d09db99b 100644 --- a/src/common/utility_mac.cpp +++ b/src/common/utility_mac.cpp @@ -58,7 +58,7 @@ bool hasLaunchOnStartup_private(const QString &) LSSharedFileListItemRef item = (LSSharedFileListItemRef)CFArrayGetValueAtIndex(itemsArray, i); CFURLRef itemUrlRef = NULL; - if (LSSharedFileListItemResolve(item, 0, &itemUrlRef, NULL) == noErr) { + if (LSSharedFileListItemResolve(item, 0, &itemUrlRef, NULL) == noErr && itemUrlRef) { CFStringRef itemUrlString = CFURLGetString(itemUrlRef); if (CFStringCompare(itemUrlString, appUrlRefString, 0) == kCFCompareEqualTo) { returnValue = true; @@ -100,7 +100,7 @@ void setLaunchOnStartup_private(const QString &appName, const QString &guiName, LSSharedFileListItemRef item = (LSSharedFileListItemRef)CFArrayGetValueAtIndex(itemsArray, i); CFURLRef itemUrlRef = NULL; - if (LSSharedFileListItemResolve(item, 0, &itemUrlRef, NULL) == noErr) { + if (LSSharedFileListItemResolve(item, 0, &itemUrlRef, NULL) == noErr && itemUrlRef) { CFStringRef itemUrlString = CFURLGetString(itemUrlRef); if (CFStringCompare(itemUrlString, appUrlRefString, 0) == kCFCompareEqualTo) { LSSharedFileListItemRemove(loginItems, item); // remove it! diff --git a/src/csync/csync.cpp b/src/csync/csync.cpp index 9c8593e31..f80d4d4d2 100644 --- a/src/csync/csync.cpp +++ b/src/csync/csync.cpp @@ -77,7 +77,7 @@ int csync_update(CSYNC *ctx) { csync_memstat_check(); - if (!ctx->excludes) { + if (!ctx->exclude_traversal_fn) { CSYNC_LOG(CSYNC_LOG_PRIORITY_INFO, "No exclude file loaded or defined!"); } @@ -211,14 +211,14 @@ static int _csync_treewalk_visitor(csync_file_stat_t *cur, CSYNC * ctx) { if (other_file_it == other_tree->cend()) { /* Check the renamed path as well. */ - QByteArray renamed_path = csync_rename_adjust_path(ctx, cur->path); + QByteArray renamed_path = csync_rename_adjust_parent_path(ctx, cur->path); if (renamed_path != cur->path) other_file_it = other_tree->find(renamed_path); } if (other_file_it == other_tree->cend()) { /* Check the source path as well. */ - QByteArray renamed_path = csync_rename_adjust_path_source(ctx, cur->path); + QByteArray renamed_path = csync_rename_adjust_parent_path_source(ctx, cur->path); if (renamed_path != cur->path) other_file_it = other_tree->find(renamed_path); } @@ -314,6 +314,9 @@ int csync_s::reinitialize() { local.files.clear(); remote.files.clear(); + renames.folder_renamed_from.clear(); + renames.folder_renamed_to.clear(); + local_discovery_style = LocalDiscoveryStyle::FilesystemOnly; locally_touched_dirs.clear(); diff --git a/src/csync/csync.h b/src/csync/csync.h index 4dfa989f1..8c59f1707 100644 --- a/src/csync/csync.h +++ b/src/csync/csync.h @@ -108,7 +108,8 @@ enum csync_status_codes_e { CSYNC_STATUS_INDIVIDUAL_STAT_FAILED, CSYNC_STATUS_FORBIDDEN, CSYNC_STATUS_INDIVIDUAL_TOO_DEEP, - CSYNC_STATUS_INDIVIDUAL_IS_CONFLICT_FILE + CSYNC_STATUS_INDIVIDUAL_IS_CONFLICT_FILE, + CSYNC_STATUS_INDIVIDUAL_CANNOT_ENCODE }; typedef enum csync_status_codes_e CSYNC_STATUS; diff --git a/src/csync/csync_exclude.cpp b/src/csync/csync_exclude.cpp index 6ba643fc7..c090b1f1a 100644 --- a/src/csync/csync_exclude.cpp +++ b/src/csync/csync_exclude.cpp @@ -40,6 +40,7 @@ #include "common/utility.h" #include +#include #ifdef _WIN32 #include @@ -50,25 +51,6 @@ #define CSYNC_LOG_CATEGORY_NAME "csync.exclude" #include "csync_log.h" -#ifndef WITH_TESTING -static -#endif -int _csync_exclude_add(c_strlist_t **inList, const char *string) { - size_t i = 0; - - // We never want duplicates, so check whether the string is already - // in the list first. - if (*inList) { - for (i = 0; i < (*inList)->count; ++i) { - char *pattern = (*inList)->vector[i]; - if (c_streq(pattern, string)) { - return 1; - } - } - } - return c_strlist_add_grow(inList, string); -} - /** Expands C-like escape sequences. * * The returned string is heap-allocated and owned by the caller. @@ -87,7 +69,6 @@ static const char *csync_exclude_expand_escapes(const char * input) case '\'': out[o++] = '\''; break; case '"': out[o++] = '"'; break; case '?': out[o++] = '?'; break; - case '\\': out[o++] = '\\'; break; case '#': out[o++] = '#'; break; case 'a': out[o++] = '\a'; break; case 'b': out[o++] = '\b'; break; @@ -97,6 +78,9 @@ static const char *csync_exclude_expand_escapes(const char * input) case 't': out[o++] = '\t'; break; case 'v': out[o++] = '\v'; break; default: + // '\*' '\?' '\[' '\\' will be processed during regex translation + // '\\' is intentionally not expanded here (to avoid '\\*' and '\*' + // ending up meaning the same thing) out[o++] = input[i]; out[o++] = input[i+1]; break; @@ -109,7 +93,8 @@ static const char *csync_exclude_expand_escapes(const char * input) return out; } -int csync_exclude_load(const char *fname, c_strlist_t **list) { +/** Loads patterns from a file and adds them to excludes */ +int csync_exclude_load(const char *fname, QList *excludes) { int fd = -1; int i = 0; int rc = -1; @@ -162,14 +147,9 @@ int csync_exclude_load(const char *fname, c_strlist_t **list) { buf[i] = '\0'; if (*entry != '#') { const char *unescaped = csync_exclude_expand_escapes(entry); - rc = _csync_exclude_add(list, unescaped); - if( rc == 0 ) { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Adding entry: %s", unescaped); - } + excludes->append(unescaped); + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Adding entry: %s", unescaped); SAFE_FREE(unescaped); - if (rc < 0) { - goto out; - } } } entry = buf + i + 1; @@ -193,6 +173,11 @@ static const char *win_reserved_words_4[] = { }; static const char *win_reserved_words_n[] = { "CLOCK$", "$Recycle.Bin" }; +/** + * @brief Checks if filename is considered reserved by Windows + * @param file_name filename + * @return true if file is reserved, false otherwise + */ bool csync_is_windows_reserved_word(const char *filename) { size_t len_filename = strlen(filename); @@ -233,14 +218,12 @@ bool csync_is_windows_reserved_word(const char *filename) return false; } -static CSYNC_EXCLUDE_TYPE _csync_excluded_common(c_strlist_t *excludes, const char *path, int filetype, bool check_leading_dirs) { - size_t i = 0; +static CSYNC_EXCLUDE_TYPE _csync_excluded_common(const char *path) +{ const char *bname = NULL; size_t blen = 0; int rc = -1; CSYNC_EXCLUDE_TYPE match = CSYNC_NOT_EXCLUDED; - CSYNC_EXCLUDE_TYPE type = CSYNC_NOT_EXCLUDED; - c_strlist_t *path_components = NULL; /* split up the path */ bname = strrchr(path, '/'); @@ -322,10 +305,12 @@ static CSYNC_EXCLUDE_TYPE _csync_excluded_common(c_strlist_t *excludes, const ch #endif /* We create a desktop.ini on Windows for the sidebar icon, make sure we don't sync them. */ - rc = csync_fnmatch("Desktop.ini", bname, 0); - if (rc == 0) { - match = CSYNC_FILE_SILENTLY_EXCLUDED; - goto out; + if (blen == 11) { + rc = csync_fnmatch("Desktop.ini", bname, 0); + if (rc == 0) { + match = CSYNC_FILE_SILENTLY_EXCLUDED; + goto out; + } } if (!OCC::Utility::shouldUploadConflictFiles()) { @@ -335,192 +320,393 @@ static CSYNC_EXCLUDE_TYPE _csync_excluded_common(c_strlist_t *excludes, const ch } } - if( ! excludes ) { - goto out; - } - - if (check_leading_dirs) { - /* Build a list of path components to check. */ - path_components = c_strlist_new(32); - char *path_split = strdup(path); - size_t len = strlen(path_split); - for (i = len; ; --i) { - // read backwards until a path separator is found - if (i != 0 && path_split[i-1] != '/') { - continue; - } - - // check 'basename', i.e. for "/foo/bar/fi" we'd check 'fi', 'bar', 'foo' - if (path_split[i] != 0) { - c_strlist_add_grow(&path_components, path_split + i); - } - - if (i == 0) { - break; - } - - // check 'dirname', i.e. for "/foo/bar/fi" we'd check '/foo/bar', '/foo' - path_split[i-1] = '\0'; - c_strlist_add_grow(&path_components, path_split); - } - SAFE_FREE(path_split); - } - - /* Loop over all exclude patterns and evaluate the given path */ - for (i = 0; match == CSYNC_NOT_EXCLUDED && i < excludes->count; i++) { - bool match_dirs_only = false; - char *pattern = excludes->vector[i]; - - type = CSYNC_FILE_EXCLUDE_LIST; - if (!pattern[0]) { /* empty pattern */ - continue; - } - /* Excludes starting with ']' means it can be cleanup */ - if (pattern[0] == ']') { - ++pattern; - if (filetype == CSYNC_FTW_TYPE_FILE) { - type = CSYNC_FILE_EXCLUDE_AND_REMOVE; - } - } - /* Check if the pattern applies to pathes only. */ - if (pattern[strlen(pattern)-1] == '/') { - if (!check_leading_dirs && filetype == CSYNC_FTW_TYPE_FILE) { - continue; - } - match_dirs_only = true; - pattern[strlen(pattern)-1] = '\0'; /* Cut off the slash */ - } - - /* check if the pattern contains a / and if, compare to the whole path */ - if (strchr(pattern, '/')) { - rc = csync_fnmatch(pattern, path, FNM_PATHNAME); - if( rc == 0 ) { - match = type; - } - /* if the pattern requires a dir, but path is not, its still not excluded. */ - if (match_dirs_only && filetype != CSYNC_FTW_TYPE_DIR) { - match = CSYNC_NOT_EXCLUDED; - } - } - - /* if still not excluded, check each component and leading directory of the path */ - if (match == CSYNC_NOT_EXCLUDED && check_leading_dirs) { - size_t j = 0; - if (match_dirs_only && filetype == CSYNC_FTW_TYPE_FILE) { - j = 1; // skip the first entry, which is bname - } - for (; j < path_components->count; ++j) { - rc = csync_fnmatch(pattern, path_components->vector[j], 0); - if (rc == 0) { - match = type; - break; - } - } - } else if (match == CSYNC_NOT_EXCLUDED && !check_leading_dirs) { - rc = csync_fnmatch(pattern, bname, 0); - if (rc == 0) { - match = type; - } - } - if (match_dirs_only) { - /* restore the '/' */ - pattern[strlen(pattern)] = '/'; - } - } - c_strlist_destroy(path_components); - out: return match; } -/* Only for bnames (not paths) */ -static QString convertToBnameRegexpSyntax(QString exclude) + +using namespace OCC; + +ExcludedFiles::ExcludedFiles() { - QString s = QRegularExpression::escape(exclude).replace("\\*", ".*").replace("\\?", "."); - return s; } -void csync_exclude_traversal_prepare(CSYNC *ctx) +ExcludedFiles::~ExcludedFiles() { - ctx->parsed_traversal_excludes.prepare(ctx->excludes); } -void csync_s::TraversalExcludes::prepare(c_strlist_t *excludes) +void ExcludedFiles::addExcludeFilePath(const QString &path) { - c_strlist_destroy(list_patterns_fnmatch); - list_patterns_fnmatch = nullptr; + _excludeFiles.insert(path); +} - // Start out with regexes that would match nothing - QString exclude_only = "a^"; - QString exclude_and_remove = "a^"; +void ExcludedFiles::addManualExclude(const QByteArray &expr) +{ + _manualExcludes.append(expr); + _allExcludes.append(expr); + prepare(); +} - size_t exclude_count = excludes ? excludes->count : 0; - for (unsigned int i = 0; i < exclude_count; i++) { - char *exclude = excludes->vector[i]; - QString *builderToUse = & exclude_only; - if (exclude[0] == '\n') continue; // empty line - if (exclude[0] == '\r') continue; // empty line +void ExcludedFiles::clearManualExcludes() +{ + _manualExcludes.clear(); + reloadExcludeFiles(); +} - /* If an exclude entry contains some fnmatch-ish characters, we use the C-style codepath without QRegularEpression */ - if (strchr(exclude, '/') || strchr(exclude, '[') || strchr(exclude, '{') || strchr(exclude, '\\')) { - _csync_exclude_add(&list_patterns_fnmatch, exclude); - continue; - } +bool ExcludedFiles::reloadExcludeFiles() +{ + _allExcludes.clear(); + bool success = true; + foreach (const QString &file, _excludeFiles) { + if (csync_exclude_load(file.toUtf8(), &_allExcludes) < 0) + success = false; + } + _allExcludes.append(_manualExcludes); + prepare(); + return success; +} - /* Those will attempt to use QRegularExpression */ - if (exclude[0] == ']'){ - exclude++; - builderToUse = &exclude_and_remove; - } - if (builderToUse->size() > 0) { - builderToUse->append("|"); - } - builderToUse->append(convertToBnameRegexpSyntax(exclude)); +bool ExcludedFiles::isExcluded( + const QString &filePath, + const QString &basePath, + bool excludeHidden) const +{ + if (!filePath.startsWith(basePath, Utility::fsCasePreserving() ? Qt::CaseInsensitive : Qt::CaseSensitive)) { + // Mark paths we're not responsible for as excluded... + return true; } - QString pattern = "^(" + exclude_only + ")$|^(" + exclude_and_remove + ")$"; - regexp_exclude.setPattern(pattern); - QRegularExpression::PatternOptions patternOptions = QRegularExpression::OptimizeOnFirstUsageOption; - if (OCC::Utility::fsCasePreserving()) - patternOptions |= QRegularExpression::CaseInsensitiveOption; - regexp_exclude.setPatternOptions(patternOptions); - regexp_exclude.optimize(); -} - -CSYNC_EXCLUDE_TYPE csync_excluded_traversal(CSYNC *ctx, const char *path, int filetype) { - CSYNC_EXCLUDE_TYPE match = CSYNC_NOT_EXCLUDED; - - /* Check only static patterns and only with the reduced list which is empty usually */ - match = _csync_excluded_common(ctx->parsed_traversal_excludes.list_patterns_fnmatch, path, filetype, false); - if (match != CSYNC_NOT_EXCLUDED) { - return match; - } - - if (ctx->excludes) { - /* Now check with our optimized regexps */ - const char *bname = NULL; - /* split up the path */ - bname = strrchr(path, '/'); - if (bname) { - bname += 1; // don't include the / - } else { - bname = path; - } - QString p = QString::fromUtf8(bname); - auto m = ctx->parsed_traversal_excludes.regexp_exclude.match(p); - if (m.hasMatch()) { - if (!m.captured(1).isEmpty()) { - match = CSYNC_FILE_EXCLUDE_LIST; - } else if (!m.captured(2).isEmpty()) { - match = CSYNC_FILE_EXCLUDE_AND_REMOVE; + if (excludeHidden) { + QString path = filePath; + // Check all path subcomponents, but to *not* check the base path: + // We do want to be able to sync with a hidden folder as the target. + while (path.size() > basePath.size()) { + QFileInfo fi(path); + if (fi.isHidden() || fi.fileName().startsWith(QLatin1Char('.'))) { + return true; } + + // Get the parent path + path = fi.absolutePath(); + } + } + + QFileInfo fi(filePath); + csync_ftw_type_e type = CSYNC_FTW_TYPE_FILE; + if (fi.isDir()) { + type = CSYNC_FTW_TYPE_DIR; + } + + QString relativePath = filePath.mid(basePath.size()); + if (relativePath.endsWith(QLatin1Char('/'))) { + relativePath.chop(1); + } + + return fullPatternMatch(relativePath.toUtf8(), type) != CSYNC_NOT_EXCLUDED; +} + +CSYNC_EXCLUDE_TYPE ExcludedFiles::traversalPatternMatch(const char *path, int filetype) const +{ + auto match = _csync_excluded_common(path); + if (match != CSYNC_NOT_EXCLUDED) + return match; + if (_allExcludes.isEmpty()) + return CSYNC_NOT_EXCLUDED; + + // Check the bname part of the path to see whether the full + // regex should be run. + + const char *bname = strrchr(path, '/'); + if (bname) { + bname += 1; // don't include the / + } else { + bname = path; + } + QString bnameStr = QString::fromUtf8(bname); + + QRegularExpressionMatch m; + if (filetype == CSYNC_FTW_TYPE_DIR) { + m = _bnameActivationRegexDir.match(bnameStr); + } else { + m = _bnameActivationRegexFile.match(bnameStr); + } + if (!m.hasMatch()) + return match; + + // Now run the full match + + QString pathStr = QString::fromUtf8(path); + if (filetype == CSYNC_FTW_TYPE_DIR) { + m = _fullRegexDir.match(pathStr); + } else { + m = _fullRegexFile.match(pathStr); + } + if (m.hasMatch()) { + if (!m.captured(1).isEmpty()) { + match = CSYNC_FILE_EXCLUDE_LIST; + } else if (!m.captured(2).isEmpty()) { + match = CSYNC_FILE_EXCLUDE_AND_REMOVE; } } return match; } -CSYNC_EXCLUDE_TYPE csync_excluded_no_ctx(c_strlist_t *excludes, const char *path, int filetype) { - return _csync_excluded_common(excludes, path, filetype, true); +CSYNC_EXCLUDE_TYPE ExcludedFiles::fullPatternMatch(const char *path, int filetype) const +{ + auto match = _csync_excluded_common(path); + if (match != CSYNC_NOT_EXCLUDED) + return match; + if (_allExcludes.isEmpty()) + return CSYNC_NOT_EXCLUDED; + + QString p = QString::fromUtf8(path); + QRegularExpressionMatch m; + if (filetype == CSYNC_FTW_TYPE_DIR) { + m = _fullRegexDir.match(p); + } else { + m = _fullRegexFile.match(p); + } + if (m.hasMatch()) { + if (!m.captured(1).isEmpty()) { + return CSYNC_FILE_EXCLUDE_LIST; + } else if (!m.captured(2).isEmpty()) { + return CSYNC_FILE_EXCLUDE_AND_REMOVE; + } + } + return CSYNC_NOT_EXCLUDED; } +auto ExcludedFiles::csyncTraversalMatchFun() const + -> std::function +{ + return [this](const char *path, int filetype) { return this->traversalPatternMatch(path, filetype); }; +} + +static QString convertToRegexpSyntax(QString exclude) +{ + // Translate *, ?, [...] to their regex variants. + // The escape sequences \*, \?, \[. \\ have a special meaning, + // the other ones have already been expanded before + // (like "\\n" being replaced by "\n"). + // + // QString being UTF-16 makes unicode-correct escaping tricky. + // If we escaped each UTF-16 code unit we'd end up splitting 4-byte + // code points. To avoid problems we delegate as much work as possible to + // QRegularExpression::escape(): It always receives as long a sequence + // as code units as possible. + QString regex; + int i = 0; + int charsToEscape = 0; + auto flush = [&]() { + regex.append(QRegularExpression::escape(exclude.mid(i - charsToEscape, charsToEscape))); + charsToEscape = 0; + }; + auto len = exclude.size(); + for (; i < len; ++i) { + switch (exclude[i].unicode()) { + case '*': + flush(); + regex.append("[^/]*"); + break; + case '?': + flush(); + regex.append("[^/]"); + break; + case '[': { + flush(); + // Find the end of the bracket expression + auto j = i + 1; + for (; j < len; ++j) { + if (exclude[j] == ']') + break; + if (j != len - 1 && exclude[j] == '\\' && exclude[j + 1] == ']') + ++j; + } + if (j == len) { + // no matching ], just insert the escaped [ + regex.append("\\["); + break; + } + // Translate [! to [^ + QString bracketExpr = exclude.mid(i, j - i + 1); + if (bracketExpr.startsWith("[!")) + bracketExpr[1] = '^'; + regex.append(bracketExpr); + i = j; + break; + } + case '\\': + flush(); + if (i == len - 1) { + regex.append("\\\\"); + break; + } + // '\*' -> '\*', but '\z' -> '\\z' + switch (exclude[i + 1].unicode()) { + case '*': + case '?': + case '[': + case '\\': + regex.append(QRegularExpression::escape(exclude.mid(i + 1, 1))); + break; + default: + charsToEscape += 2; + break; + } + ++i; + break; + default: + ++charsToEscape; + break; + } + } + flush(); + return regex; +} + +void ExcludedFiles::prepare() +{ + // Build regular expressions for the different cases. + // + // To compose the _bnameActivationRegex and _fullRegex patterns we + // collect several subgroups of patterns here. + // + // * The "full" group will contain all patterns that contain a non-trailing + // slash. They only make sense in the fullRegex. + // * The "bname" group contains all patterns without a non-trailing slash. + // These need separate handling in the _fullRegex (slash-containing + // patterns must be anchored to the front, these don't need it) + // * The "bnameTrigger" group contains the bname part of all patterns in the + // "full" group. These and the "bname" group become _bnameActivationRegex. + // + // To complicate matters, the exclude patterns have two binary attributes + // meaning we'll end up with 4 variants: + // * "]" patterns mean "EXCLUDE_AND_REMOVE", they get collected in the + // pattern strings ending in "Remove". The others go to "Keep". + // * trailing-slash patterns match directories only. They get collected + // in the pattern strings saying "Dir", the others go into "FileDir" + // because they match files and directories. + + QString fullFileDirKeep; + QString fullFileDirRemove; + QString fullDirKeep; + QString fullDirRemove; + + QString bnameFileDirKeep; + QString bnameFileDirRemove; + QString bnameDirKeep; + QString bnameDirRemove; + + QString bnameTriggerFileDir; + QString bnameTriggerDir; + + auto regexAppend = [](QString &fileDirPattern, QString &dirPattern, const QString &appendMe, bool dirOnly) { + QString &pattern = dirOnly ? dirPattern : fileDirPattern; + if (!pattern.isEmpty()) + pattern.append("|"); + pattern.append(appendMe); + }; + + for (auto exclude : _allExcludes) { + if (exclude[0] == '\n') + continue; // empty line + if (exclude[0] == '\r') + continue; // empty line + + bool matchDirOnly = exclude.endsWith('/'); + if (matchDirOnly) + exclude = exclude.left(exclude.size() - 1); + + bool removeExcluded = (exclude[0] == ']'); + if (removeExcluded) + exclude = exclude.mid(1); + + bool fullPath = exclude.contains('/'); + + /* Use QRegularExpression, append to the right pattern */ + auto &bnameFileDir = removeExcluded ? bnameFileDirRemove : bnameFileDirKeep; + auto &bnameDir = removeExcluded ? bnameDirRemove : bnameDirKeep; + auto &fullFileDir = removeExcluded ? fullFileDirRemove : fullFileDirKeep; + auto &fullDir = removeExcluded ? fullDirRemove : fullDirKeep; + + auto regexExclude = convertToRegexpSyntax(QString::fromUtf8(exclude)); + if (!fullPath) { + regexAppend(bnameFileDir, bnameDir, regexExclude, matchDirOnly); + } else { + regexAppend(fullFileDir, fullDir, regexExclude, matchDirOnly); + + // for activation, trigger on the 'bname' part of the full pattern + auto bnameExclude = exclude.mid(exclude.lastIndexOf('/') + 1); + auto regexBname = convertToRegexpSyntax(bnameExclude); + regexAppend(bnameTriggerFileDir, bnameTriggerDir, regexBname, matchDirOnly); + } + } + + // The empty pattern would match everything - change it to match-nothing + auto emptyMatchNothing = [](QString &pattern) { + if (pattern.isEmpty()) + pattern = "a^"; + }; + emptyMatchNothing(fullFileDirKeep); + emptyMatchNothing(fullFileDirRemove); + emptyMatchNothing(fullDirKeep); + emptyMatchNothing(fullDirRemove); + + emptyMatchNothing(bnameFileDirKeep); + emptyMatchNothing(bnameFileDirRemove); + emptyMatchNothing(bnameDirKeep); + emptyMatchNothing(bnameDirRemove); + + emptyMatchNothing(bnameTriggerFileDir); + emptyMatchNothing(bnameTriggerDir); + + // The bname activation regexe is applied to the bname only, so must be + // anchored in the beginning and in the end. It has the explicit triggers + // plus the bname-only patterns. Here we don't care about the remove/keep + // distinction. + _bnameActivationRegexFile.setPattern( + "^(?:" + bnameFileDirKeep + "|" + bnameFileDirRemove + "|" + bnameTriggerFileDir + ")$"); + _bnameActivationRegexDir.setPattern( + "^(?:" + bnameFileDirKeep + "|" + bnameFileDirRemove + + "|" + bnameDirKeep + "|" + bnameFileDirRemove + + "|" + bnameTriggerFileDir + "|" + bnameTriggerDir + ")$"); + + // The full regex has two captures, it's basic form is "(...)|(...)". The first + // capture has the keep/exclude-only patterns, the second the remove/exclude-and-remove + // patterns. + _fullRegexFile.setPattern( + QLatin1String("(") + // Full patterns are anchored to the beginning + + "^(?:" + fullFileDirKeep + ")(?:$|/)" + "|" + // Simple bname patterns can be any path component + + "(?:^|/)(?:" + bnameFileDirKeep + ")(?:$|/)" + "|" + // When checking a file for exclusion we must check all parent paths + // against the dir-only patterns as well. + + "(?:^|/)(?:" + bnameDirKeep + ")/" + + ")|(" + + "^(?:" + fullFileDirRemove + ")(?:$|/)" + "|" + + "(?:^|/)(?:" + bnameFileDirRemove + ")(?:$|/)" + "|" + + "(?:^|/)(?:" + bnameDirRemove + ")/" + + ")"); + _fullRegexDir.setPattern( + QLatin1String("(") + + "^(?:" + fullFileDirKeep + "|" + fullDirKeep + ")(?:$|/)" + "|" + + "(?:^|/)(?:" + bnameFileDirKeep + "|" + bnameDirKeep + ")(?:$|/)" + + ")|(" + + "^(?:" + fullFileDirRemove + "|" + fullDirRemove + ")(?:$|/)" + "|" + + "(?:^|/)(?:" + bnameFileDirRemove + "|" + bnameDirRemove + ")(?:$|/)" + + ")"); + + QRegularExpression::PatternOptions patternOptions = QRegularExpression::NoPatternOption; + if (OCC::Utility::fsCasePreserving()) + patternOptions |= QRegularExpression::CaseInsensitiveOption; + _bnameActivationRegexFile.setPatternOptions(patternOptions); + _bnameActivationRegexFile.optimize(); + _bnameActivationRegexDir.setPatternOptions(patternOptions); + _bnameActivationRegexDir.optimize(); + _fullRegexFile.setPatternOptions(patternOptions); + _fullRegexFile.optimize(); + _fullRegexDir.setPatternOptions(patternOptions); + _fullRegexDir.optimize(); +} diff --git a/src/csync/csync_exclude.h b/src/csync/csync_exclude.h index f55e70583..f2c14a767 100644 --- a/src/csync/csync_exclude.h +++ b/src/csync/csync_exclude.h @@ -23,6 +23,13 @@ #include "ocsynclib.h" +#include "csync.h" + +#include +#include +#include +#include + enum csync_exclude_type_e { CSYNC_NOT_EXCLUDED = 0, CSYNC_FILE_SILENTLY_EXCLUDED, @@ -33,67 +40,156 @@ enum csync_exclude_type_e { CSYNC_FILE_EXCLUDE_LONG_FILENAME, CSYNC_FILE_EXCLUDE_HIDDEN, CSYNC_FILE_EXCLUDE_STAT_FAILED, - CSYNC_FILE_EXCLUDE_CONFLICT + CSYNC_FILE_EXCLUDE_CONFLICT, + CSYNC_FILE_EXCLUDE_CANNOT_ENCODE }; typedef enum csync_exclude_type_e CSYNC_EXCLUDE_TYPE; -#ifdef WITH_TESTING -int OCSYNC_EXPORT _csync_exclude_add(c_strlist_t **inList, const char *string); -#endif +class ExcludedFilesTest; /** - * @brief Load exclude list + * Manages file/directory exclusion. * - * @param ctx The context of the synchronizer. - * @param fname The filename to load. + * Most commonly exclude patterns are loaded from files. See + * addExcludeFilePath() and reloadExcludeFiles(). * - * @return 0 on success, -1 if an error occurred with errno set. + * Excluded files are primarily relevant for sync runs, and for + * file watcher filtering. + * + * Excluded files and ignored files are the same thing. But the + * selective sync blacklist functionality is a different thing + * entirely. */ -int OCSYNC_EXPORT csync_exclude_load(const char *fname, c_strlist_t **list); +class OCSYNC_EXPORT ExcludedFiles : public QObject +{ + Q_OBJECT +public: + ExcludedFiles(); + ~ExcludedFiles(); -/** - * @brief When all list loads and list are done - * - * Used to initialize internal data structures that build upon the loaded excludes. - * - * @param ctx - */ -void OCSYNC_EXPORT csync_exclude_traversal_prepare(CSYNC *ctx); + /** + * Adds a new path to a file containing exclude patterns. + * + * Does not load the file. Use reloadExcludeFiles() afterwards. + */ + void addExcludeFilePath(const QString &path); -/** - * @brief Check if the given path should be excluded in a traversal situation. - * - * It does only part of the work that csync_excluded does because it's assumed - * that all leading directories have been run through csync_excluded_traversal() - * before. This can be significantly faster. - * - * That means for '/foo/bar/file' only ('/foo/bar/file', 'file') is checked - * against the exclude patterns. - * - * @param ctx The synchronizer context. - * @param path The patch to check. - * - * @return 2 if excluded and needs cleanup, 1 if excluded, 0 if not. - */ -CSYNC_EXCLUDE_TYPE OCSYNC_EXPORT csync_excluded_traversal(CSYNC *ctx, const char *path, int filetype); + /** + * Checks whether a file or directory should be excluded. + * + * @param filePath the absolute path to the file + * @param basePath folder path from which to apply exclude rules, ends with a / + */ + bool isExcluded( + const QString &filePath, + const QString &basePath, + bool excludeHidden) const; + + /** + * Adds an exclude pattern. + * + * Primarily used in tests. Patterns added this way are preserved when + * reloadExcludeFiles() is called. + */ + void addManualExclude(const QByteArray &expr); + + /** + * Removes all manually added exclude patterns. + * + * Primarily used in tests. + */ + void clearManualExcludes(); + + /** + * Generate a hook for traversal exclude pattern matching + * that csync can use. + * + * Careful: The function will only be valid for as long as this + * ExcludedFiles instance stays alive. + */ + auto csyncTraversalMatchFun() const + -> std::function; + +public slots: + /** + * Reloads the exclude patterns from the registered paths. + */ + bool reloadExcludeFiles(); + +private: + /** + * @brief Match the exclude pattern against the full path. + * + * @param Path is folder-relative, should not start with a /. + * + * Note that this only matches patterns. It does not check whether the file + * or directory pointed to is hidden (or whether it even exists). + */ + CSYNC_EXCLUDE_TYPE fullPatternMatch(const char *path, int filetype) const; + + /** + * @brief Check if the given path should be excluded in a traversal situation. + * + * It does only part of the work that full() does because it's assumed + * that all leading directories have been run through traversal() + * before. This can be significantly faster. + * + * That means for 'foo/bar/file' only ('foo/bar/file', 'file') is checked + * against the exclude patterns. + * + * @param Path is folder-relative, should not start with a /. + * + * Note that this only matches patterns. It does not check whether the file + * or directory pointed to is hidden (or whether it even exists). + */ + CSYNC_EXCLUDE_TYPE traversalPatternMatch(const char *path, int filetype) const; + + /** + * Generate optimized regular expressions for the exclude patterns. + * + * The optimization works in two steps: First, all supported patterns are put + * into _fullRegexFile/_fullRegexDir. These regexes can be applied to the full + * path to determine whether it is excluded or not. + * + * The second is a performance optimization. The particularly common use + * case for excludes during a sync run is "traversal": Instead of checking + * the full path every time, we check each parent path with the traversal + * function incrementally. + * + * Example: When the sync run eventually arrives at "a/b/c it can assume + * that the traversal matching has already been run on "a", "a/b" + * and just needs to run the traversal matcher on "a/b/c". + * + * The full matcher is equivalent to or-combining the traversal match results + * of all parent paths: + * full("a/b/c/d") == traversal("a") || traversal("a/b") || traversal("a/b/c") + * + * The traversal matcher can be extremely fast because it has a fast early-out + * case: It checks the bname part of the path against _bnameActivationRegex + * and only runs the full regex if the bname activation was triggered. + * + * Note: The traversal matcher will return not-excluded on some paths that the + * full matcher would exclude. Example: "b" is excluded. traversal("b/c") + * returns not-excluded because "c" isn't a bname activation pattern. + */ + void prepare(); + + /// Files to load excludes from + QSet _excludeFiles; + + /// Exclude patterns added with addManualExclude() + QList _manualExcludes; + + /// List of all active exclude patterns + QList _allExcludes; + + /// see prepare() + QRegularExpression _bnameActivationRegexFile; + QRegularExpression _bnameActivationRegexDir; + QRegularExpression _fullRegexFile; + QRegularExpression _fullRegexDir; + + friend class ExcludedFilesTest; +}; -/** - * @brief Checks all path components if the whole path should be excluded - * - * @param excludes - * @param path - * @param filetype - * @return - */ -CSYNC_EXCLUDE_TYPE OCSYNC_EXPORT csync_excluded_no_ctx(c_strlist_t *excludes, const char *path, int filetype); #endif /* _CSYNC_EXCLUDE_H */ - -/** - * @brief Checks if filename is considered reserved by Windows - * @param file_name filename - * @return true if file is reserved, false otherwise - */ -bool csync_is_windows_reserved_word(const char *file_name); - - -/* vim: set ft=c.doxygen ts=8 sw=2 et cindent: */ diff --git a/src/csync/csync_private.h b/src/csync/csync_private.h index bef8a7512..e692e7ba1 100644 --- a/src/csync/csync_private.h +++ b/src/csync/csync_private.h @@ -39,6 +39,7 @@ #include #include #include +#include #include "common/syncjournaldb.h" #include "config_csync.h" @@ -46,11 +47,9 @@ #include "std/c_private.h" #include "csync.h" #include "csync_misc.h" - +#include "csync_exclude.h" #include "csync_macros.h" -#include - /** * How deep to scan directories. */ @@ -148,17 +147,13 @@ struct OCSYNC_EXPORT csync_s { OCC::SyncJournalDb *statedb; - c_strlist_t *excludes = nullptr; /* list of individual patterns collected from all exclude files */ - struct TraversalExcludes { - ~TraversalExcludes() { - c_strlist_destroy(list_patterns_fnmatch); - } - void prepare(c_strlist_t *excludes); - - QRegularExpression regexp_exclude; - c_strlist_t *list_patterns_fnmatch = nullptr; - - } parsed_traversal_excludes; + /** + * Function used to determine whether an item is excluded + * during the update phase. + * + * See ExcludedFiles in csync_exclude. + */ + std::function exclude_traversal_fn; struct { std::unordered_map folder_renamed_to; // map from->to diff --git a/src/csync/csync_reconcile.cpp b/src/csync/csync_reconcile.cpp index b2283ad2c..97863fb8b 100644 --- a/src/csync/csync_reconcile.cpp +++ b/src/csync/csync_reconcile.cpp @@ -113,7 +113,7 @@ static int _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) { if (!other) { /* Check the renamed path as well. */ - other = other_tree->findFile(csync_rename_adjust_path(ctx, cur->path)); + other = other_tree->findFile(csync_rename_adjust_parent_path(ctx, cur->path)); } if (!other) { /* Check if it is ignored */ @@ -147,24 +147,25 @@ static int _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) { cur->instruction = CSYNC_INSTRUCTION_NEW; bool processedRename = false; - auto renameCandidateProcessing = [&](const OCC::SyncJournalFileRecord &base) { + auto renameCandidateProcessing = [&](const QByteArray &basePath) { if (processedRename) return; - if (!base.isValid()) + if (basePath.isEmpty()) return; /* First, check that the file is NOT in our tree (another file with the same name was added) */ - if (our_tree->findFile(base._path)) { - qCDebug(lcReconcile, "Origin found in our tree : %s", base._path.constData()); + if (our_tree->findFile(basePath)) { + other = nullptr; + qCDebug(lcReconcile, "Origin found in our tree : %s", basePath.constData()); } else { /* Find the potential rename source file in the other tree. * If the renamed file could not be found in the opposite tree, that is because it * is not longer existing there, maybe because it was renamed or deleted. * The journal is cleaned up later after propagation. */ - other = other_tree->findFile(base._path); + other = other_tree->findFile(basePath); qCDebug(lcReconcile, "Rename origin in other tree (%s) %s", - base._path.constData(), other ? "found" : "not found"); + basePath.constData(), other ? "found" : "not found"); } if(!other) { @@ -197,7 +198,7 @@ static int _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) { cur->instruction = CSYNC_INSTRUCTION_NONE; // We have consumed 'other': exit this loop to not consume another one. processedRename = true; - } else if (our_tree->findFile(csync_rename_adjust_path(ctx, other->path)) == cur) { + } else if (our_tree->findFile(csync_rename_adjust_parent_path(ctx, other->path)) == cur) { // If we're here, that means that the other side's reconcile will be able // to work against cur: The filename itself didn't change, only a parent // directory was renamed! In that case it's safe to ignore the rename @@ -225,12 +226,34 @@ static int _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) { qCDebug(lcReconcile, "Finding rename origin through inode %" PRIu64 "", cur->inode); ctx->statedb->getFileRecordByInode(cur->inode, &base); - renameCandidateProcessing(base); + renameCandidateProcessing(base._path); } else { ASSERT(ctx->current == REMOTE_REPLICA); - qCDebug(lcReconcile, "Finding rename origin through file ID %s", - cur->file_id.constData()); - ctx->statedb->getFileRecordsByFileId(cur->file_id, renameCandidateProcessing); + + // The update phase has already mapped out all dir->dir renames, check the + // path that is consistent with that first. Otherwise update mappings and + // reconcile mappings might disagree, leading to odd situations down the + // line. + auto basePath = csync_rename_adjust_full_path_source(ctx, cur->path); + if (basePath != cur->path) { + qCDebug(lcReconcile, "Trying rename origin by csync_rename mapping %s", + basePath.constData()); + // We go through getFileRecordsByFileId to ensure the basePath + // computed in this way also has the expected fileid. + ctx->statedb->getFileRecordsByFileId(cur->file_id, + [&](const OCC::SyncJournalFileRecord &base) { + if (base._path == basePath) + renameCandidateProcessing(basePath); + }); + } + + // Also feed all the other files with the same fileid if necessary + if (!processedRename) { + qCDebug(lcReconcile, "Finding rename origin through file ID %s", + cur->file_id.constData()); + ctx->statedb->getFileRecordsByFileId(cur->file_id, + [&](const OCC::SyncJournalFileRecord &base) { renameCandidateProcessing(base._path); }); + } } break; diff --git a/src/csync/csync_rename.cpp b/src/csync/csync_rename.cpp index da76cff52..80b3f1439 100644 --- a/src/csync/csync_rename.cpp +++ b/src/csync/csync_rename.cpp @@ -36,7 +36,7 @@ void csync_rename_record(CSYNC* ctx, const QByteArray &from, const QByteArray &t ctx->renames.folder_renamed_from[to] = from; } -QByteArray csync_rename_adjust_path(CSYNC* ctx, const QByteArray &path) +QByteArray csync_rename_adjust_parent_path(CSYNC *ctx, const QByteArray &path) { if (ctx->renames.folder_renamed_to.empty()) return path; @@ -50,11 +50,25 @@ QByteArray csync_rename_adjust_path(CSYNC* ctx, const QByteArray &path) return path; } -QByteArray csync_rename_adjust_path_source(CSYNC* ctx, const QByteArray &path) +QByteArray csync_rename_adjust_parent_path_source(CSYNC *ctx, const QByteArray &path) { if (ctx->renames.folder_renamed_from.empty()) return path; - for (auto p = _parentDir(path); !p.isEmpty(); p = _parentDir(p)) { + for (ByteArrayRef p = _parentDir(path); !p.isEmpty(); p = _parentDir(p)) { + auto it = ctx->renames.folder_renamed_from.find(p); + if (it != ctx->renames.folder_renamed_from.end()) { + QByteArray rep = it->second + path.mid(p.length()); + return rep; + } + } + return path; +} + +QByteArray csync_rename_adjust_full_path_source(CSYNC *ctx, const QByteArray &path) +{ + if (ctx->renames.folder_renamed_from.empty()) + return path; + for (ByteArrayRef p = path; !p.isEmpty(); p = _parentDir(p)) { auto it = ctx->renames.folder_renamed_from.find(p); if (it != ctx->renames.folder_renamed_from.end()) { QByteArray rep = it->second + path.mid(p.length()); diff --git a/src/csync/csync_rename.h b/src/csync/csync_rename.h index 194f4256c..825f45f4e 100644 --- a/src/csync/csync_rename.h +++ b/src/csync/csync_rename.h @@ -22,10 +22,19 @@ #include "csync.h" -/* Return the final destination path of a given patch in case of renames */ -QByteArray OCSYNC_EXPORT csync_rename_adjust_path(CSYNC *ctx, const QByteArray &path); +/* Return the final destination path of a given patch in case of renames + * + * Does only map the parent directories. If the directory "A" is renamed to + * "B" then this function will not map "A" to "B". Only "A/foo" -> "B/foo". +*/ +QByteArray OCSYNC_EXPORT csync_rename_adjust_parent_path(CSYNC *ctx, const QByteArray &path); + /* Return the source of a given path in case of renames */ -QByteArray OCSYNC_EXPORT csync_rename_adjust_path_source(CSYNC *ctx, const QByteArray &path); +QByteArray OCSYNC_EXPORT csync_rename_adjust_parent_path_source(CSYNC *ctx, const QByteArray &path); + +/* like the parent_path variant, but applying to the full path */ +QByteArray OCSYNC_EXPORT csync_rename_adjust_full_path_source(CSYNC *ctx, const QByteArray &path); + void OCSYNC_EXPORT csync_rename_record(CSYNC *ctx, const QByteArray &from, const QByteArray &to); /* Return the amount of renamed item recorded */ bool OCSYNC_EXPORT csync_rename_count(CSYNC *ctx); diff --git a/src/csync/csync_update.cpp b/src/csync/csync_update.cpp index e0bfa3968..ae7efba77 100644 --- a/src/csync/csync_update.cpp +++ b/src/csync/csync_update.cpp @@ -46,6 +46,8 @@ #include "common/utility.h" #include "common/asserts.h" +#include + // Needed for PRIu64 on MinGW in C++ mode. #define __STDC_FORMAT_MACROS #include @@ -107,7 +109,7 @@ static bool _csync_mtime_equal(time_t a, time_t b) */ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr fs) { OCC::SyncJournalFileRecord base; - CSYNC_EXCLUDE_TYPE excluded; + CSYNC_EXCLUDE_TYPE excluded = CSYNC_NOT_EXCLUDED; if (fs == NULL) { errno = EINVAL; @@ -118,8 +120,9 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr f if (fs->type == CSYNC_FTW_TYPE_SKIP) { excluded =CSYNC_FILE_EXCLUDE_STAT_FAILED; } else { - /* Check if file is excluded */ - excluded = csync_excluded_traversal(ctx, fs->path, fs->type); + /* Check if file is excluded */ + if (ctx->exclude_traversal_fn) + excluded = ctx->exclude_traversal_fn(fs->path, fs->type); } if( excluded == CSYNC_NOT_EXCLUDED ) { @@ -148,6 +151,14 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr f } } + if (ctx->current == REMOTE_REPLICA && QTextCodec::codecForLocale()->mibEnum() != 106) { + /* If the locale codec is not UTF-8, we must check that the filename from the server can + * be encoded in the local file system. */ + if (!QTextCodec::codecForLocale()->canEncode(QString::fromUtf8(fs->path))) { + excluded = CSYNC_FILE_EXCLUDE_CANNOT_ENCODE; + } + } + if (fs->type == CSYNC_FTW_TYPE_FILE ) { if (fs->modtime == 0) { qCDebug(lcUpdate, "file: %s - mtime is zero!", fs->path.constData()); @@ -375,6 +386,8 @@ out: fs->error_status = CSYNC_STATUS_INDIVIDUAL_STAT_FAILED; } else if (excluded == CSYNC_FILE_EXCLUDE_CONFLICT) { fs->error_status = CSYNC_STATUS_INDIVIDUAL_IS_CONFLICT_FILE; + } else if (excluded == CSYNC_FILE_EXCLUDE_CANNOT_ENCODE) { + fs->error_status = CSYNC_STATUS_INDIVIDUAL_CANNOT_ENCODE; } } } @@ -486,7 +499,9 @@ static bool fill_tree_from_db(CSYNC *ctx, const char *uri) /* Check for exclusion from the tree. * Note that this is only a safety net in case the ignore list changes * without a full remote discovery being triggered. */ - CSYNC_EXCLUDE_TYPE excluded = csync_excluded_traversal(ctx, st->path, st->type); + CSYNC_EXCLUDE_TYPE excluded = CSYNC_NOT_EXCLUDED; + if (ctx->exclude_traversal_fn) + excluded = ctx->exclude_traversal_fn(st->path, st->type); if (excluded != CSYNC_NOT_EXCLUDED) { qDebug(lcUpdate, "%s excluded (%d)", st->path.constData(), excluded); diff --git a/src/csync/std/c_string.h b/src/csync/std/c_string.h index ef1784892..8b0421b2c 100644 --- a/src/csync/std/c_string.h +++ b/src/csync/std/c_string.h @@ -89,7 +89,7 @@ int c_streq(const char *a, const char *b); * * @param size Size to allocate. * - * @return Pointer to the newly allocated stringlist. NULL if an error occured. + * @return Pointer to the newly allocated stringlist. NULL if an error occurred. */ c_strlist_t *c_strlist_new(size_t size); @@ -99,7 +99,7 @@ c_strlist_t *c_strlist_new(size_t size); * @param strlist Stringlist to expand * @param size New size of the strlinglist to expand * - * @return Pointer to the expanded stringlist. NULL if an error occured. + * @return Pointer to the expanded stringlist. NULL if an error occurred. */ c_strlist_t *c_strlist_expand(c_strlist_t *strlist, size_t size); @@ -111,7 +111,7 @@ c_strlist_t *c_strlist_expand(c_strlist_t *strlist, size_t size); * @param strlist Stringlist to add the string. * @param string String to add. * - * @return 0 on success, less than 0 and errno set if an error occured. + * @return 0 on success, less than 0 and errno set if an error occurred. * ENOBUFS if the list is full. */ int c_strlist_add(c_strlist_t *strlist, const char *string); @@ -125,7 +125,7 @@ int c_strlist_add(c_strlist_t *strlist, const char *string); * @param strlist Stringlist to add the string. * @param string String to add. * - * @return 0 on success, less than 0 and errno set if an error occured. + * @return 0 on success, less than 0 and errno set if an error occurred. */ int c_strlist_add_grow(c_strlist_t **strlist, const char *string); diff --git a/src/gui/accountsettings.cpp b/src/gui/accountsettings.cpp index d1f6e1346..7f4b262f4 100644 --- a/src/gui/accountsettings.cpp +++ b/src/gui/accountsettings.cpp @@ -263,7 +263,6 @@ void AccountSettings::slotCustomContextMenuRequested(const QPoint &pos) } if (_model->classify(index) == FolderStatusModel::SubFolder) { - QTreeView *tv = ui->_folderList; QMenu *menu = new QMenu(tv); menu->setAttribute(Qt::WA_DeleteOnClose); @@ -275,8 +274,7 @@ void AccountSettings::slotCustomContextMenuRequested(const QPoint &pos) ac->setEnabled(false); } - menu->exec(QCursor::pos()); - + menu->popup(tv->mapToGlobal(pos)); return; } @@ -291,6 +289,7 @@ void AccountSettings::slotCustomContextMenuRequested(const QPoint &pos) auto folderMan = FolderMan::instance(); QMenu *menu = new QMenu(tv); + menu->setAttribute(Qt::WA_DeleteOnClose); QAction *ac = menu->addAction(tr("Open folder")); @@ -316,7 +315,7 @@ void AccountSettings::slotCustomContextMenuRequested(const QPoint &pos) ac = menu->addAction(tr("Remove folder sync connection")); connect(ac, &QAction::triggered, this, &AccountSettings::slotRemoveCurrentFolder); - menu->exec(tv->mapToGlobal(pos)); + menu->popup(tv->mapToGlobal(pos)); } void AccountSettings::slotFolderListClicked(const QModelIndex &indx) @@ -688,14 +687,22 @@ void AccountSettings::slotAccountStateChanged() /* Allow to expand the item if the account is connected. */ ui->_folderList->setItemsExpandable(state == AccountState::Connected); - /* check if there are expanded root items, if so, close them, if the state is different from being Connected. */ if (state != AccountState::Connected) { + /* check if there are expanded root items, if so, close them */ int i; for (i = 0; i < _model->rowCount(); ++i) { if (ui->_folderList->isExpanded(_model->index(i))) ui->_folderList->setExpanded(_model->index(i), false); } + } else if (_model->isDirty()) { + // If we connect and have pending changes, show the list. + doExpand(); } + + // Disabling expansion of folders might require hiding the selective + // sync user interface buttons. + refreshSelectiveSyncStatus(); + /* set the correct label for the Account toolbox button */ if (_accountState) { if (_accountState->isSignedOut()) { @@ -748,7 +755,7 @@ AccountSettings::~AccountSettings() void AccountSettings::refreshSelectiveSyncStatus() { - bool shouldBeVisible = _model->isDirty(); + bool shouldBeVisible = _model->isDirty() && _accountState->isConnected(); QString msg; int cnt = 0; diff --git a/src/gui/activitylistmodel.cpp b/src/gui/activitylistmodel.cpp index d4a6f0eb5..33e57690d 100644 --- a/src/gui/activitylistmodel.cpp +++ b/src/gui/activitylistmodel.cpp @@ -128,9 +128,9 @@ void ActivityListModel::startFetchJob(AccountState *s) this, &ActivityListModel::slotActivitiesReceived); job->setProperty("AccountStatePtr", QVariant::fromValue>(s)); - QList> params; - params.append(qMakePair(QString::fromLatin1("page"), QString::fromLatin1("0"))); - params.append(qMakePair(QString::fromLatin1("pagesize"), QString::fromLatin1("100"))); + QUrlQuery params; + params.addQueryItem(QLatin1String("page"), QLatin1String("0")); + params.addQueryItem(QLatin1String("pagesize"), QLatin1String("100")); job->addQueryParams(params); _currentlyFetching.insert(s); diff --git a/src/gui/activitywidget.cpp b/src/gui/activitywidget.cpp index b089fef9b..8a29d9152 100644 --- a/src/gui/activitywidget.cpp +++ b/src/gui/activitywidget.cpp @@ -429,14 +429,13 @@ void ActivityWidget::slotNotifyServerFinished(const QString &reply, int replyCod } endNotificationRequest(job->widget(), replyCode); - // FIXME: remove the widget after a couple of seconds qCInfo(lcActivity) << "Server Notification reply code" << replyCode << reply; // if the notification was successful start a timer that triggers // removal of the done widgets in a few seconds // Add 200 millisecs to the predefined value to make sure that the timer in // widget's method readyToClose() has elapsed. - if (replyCode == OCS_SUCCESS_STATUS_CODE) { + if (replyCode == OCS_SUCCESS_STATUS_CODE || replyCode == OCS_SUCCESS_STATUS_CODE_V2) { scheduleWidgetToRemove(job->widget()); } } diff --git a/src/gui/application.cpp b/src/gui/application.cpp index 934e23ecb..8f4b3f1ba 100644 --- a/src/gui/application.cpp +++ b/src/gui/application.cpp @@ -35,7 +35,6 @@ #include "accountmanager.h" #include "creds/abstractcredentials.h" #include "updater/ocupdater.h" -#include "excludedfiles.h" #include "owncloudsetupwizard.h" #include "version.h" @@ -52,6 +51,7 @@ #include #include #include +#include class QSocket; @@ -120,10 +120,29 @@ Application::Application(int &argc, char **argv) // TODO: Can't set this without breaking current config paths // setOrganizationName(QLatin1String(APPLICATION_VENDOR)); setOrganizationDomain(QLatin1String(APPLICATION_REV_DOMAIN)); - setApplicationName(_theme->appNameGUI()); + setApplicationName(_theme->appName()); setWindowIcon(_theme->applicationIcon()); setAttribute(Qt::AA_UseHighDpiPixmaps, true); + auto confDir = ConfigFile().configPath(); + if (!QFileInfo(confDir).exists()) { + // Migrate from version <= 2.4 + setApplicationName(_theme->appNameGUI()); + QString oldDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation); + setApplicationName(_theme->appName()); + if (QFileInfo(oldDir).isDir()) { + qCInfo(lcApplication) << "Migrating old config from" << oldDir << "to" << confDir; + if (!QFile::rename(oldDir, confDir)) { + qCWarning(lcApplication) << "Failed to move the old config file to its new location (" << oldDir << "to" << confDir << ")"; + } else { +#ifndef Q_OS_WIN + // Create a symbolic link so a downgrade of the client would still find the config. + QFile::link(confDir, oldDir); +#endif + } + } + } + parseOptions(arguments()); //no need to waste time; if (_helpOnly || _versionOnly) @@ -140,13 +159,10 @@ Application::Application(int &argc, char **argv) setupLogging(); setupTranslations(); - // Setup global excludes - qCInfo(lcApplication) << "Loading global exclude list"; + // The timeout is initialized with an environment variable, if not, override with the value from the config ConfigFile cfg; - ExcludedFiles &excludes = ExcludedFiles::instance(); - excludes.addExcludeFilePath(cfg.excludeFile(ConfigFile::SystemScope)); - excludes.addExcludeFilePath(cfg.excludeFile(ConfigFile::UserScope)); - excludes.reloadExcludes(); + if (!AbstractNetworkJob::httpTimeout) + AbstractNetworkJob::httpTimeout = cfg.timeout(); _folderManager.reset(new FolderMan); diff --git a/src/gui/creds/oauth.cpp b/src/gui/creds/oauth.cpp index 85a13f4c1..4980b8db9 100644 --- a/src/gui/creds/oauth.cpp +++ b/src/gui/creds/oauth.cpp @@ -156,12 +156,13 @@ void OAuth::start() QUrl OAuth::authorisationLink() const { Q_ASSERT(_server.isListening()); - QUrl url = Utility::concatUrlPath(_account->url(), QLatin1String("/index.php/apps/oauth2/authorize"), - { { QLatin1String("response_type"), QLatin1String("code") }, - { QLatin1String("client_id"), Theme::instance()->oauthClientId() }, - { QLatin1String("redirect_uri"), QLatin1String("http://localhost:") + QString::number(_server.serverPort()) } }); + QUrlQuery query; + query.setQueryItems({ { QLatin1String("response_type"), QLatin1String("code") }, + { QLatin1String("client_id"), Theme::instance()->oauthClientId() }, + { QLatin1String("redirect_uri"), QLatin1String("http://localhost:") + QString::number(_server.serverPort()) } }); if (!_expectedUser.isNull()) - url.addQueryItem("user", _expectedUser); + query.addQueryItem("user", _expectedUser); + QUrl url = Utility::concatUrlPath(_account->url(), QLatin1String("/index.php/apps/oauth2/authorize"), query); return url; } diff --git a/src/gui/creds/shibbolethcredentials.cpp b/src/gui/creds/shibbolethcredentials.cpp index 32b300833..ae15699bb 100644 --- a/src/gui/creds/shibbolethcredentials.cpp +++ b/src/gui/creds/shibbolethcredentials.cpp @@ -23,6 +23,7 @@ #include "creds/shibbolethcredentials.h" #include "shibboleth/shibbolethuserjob.h" #include "creds/credentialscommon.h" +#include "creds/httpcredentialsgui.h" #include "accessmanager.h" #include "account.h" @@ -151,7 +152,31 @@ void ShibbolethCredentials::fetchFromKeychainHelper() void ShibbolethCredentials::askFromUser() { - showLoginWindow(); + // First, we do a DetermineAuthTypeJob to make sure that the server is still using shibboleth and did not upgrade to oauth + DetermineAuthTypeJob *job = new DetermineAuthTypeJob(_account->sharedFromThis(), this); + connect(job, &DetermineAuthTypeJob::authType, [this, job](DetermineAuthTypeJob::AuthType type) { + if (type == DetermineAuthTypeJob::Shibboleth) { + // Normal case, still shibboleth + showLoginWindow(); + } else if (type == DetermineAuthTypeJob::OAuth) { + // Hack: upgrade to oauth + auto newCred = new HttpCredentialsGui; + job->setParent(0); + job->deleteLater(); + auto account = this->_account; + auto user = this->_user; + account->setCredentials(newCred); // delete this + account->setCredentialSetting(QLatin1String("user"), user); + newCred->fetchUser(); + newCred->askFromUser(); + } else { + // Basic auth or unkown. Since it may be unkown it might be a temporary failure, don't replace the credentials here + // Still show the login window in that case not to break the flow. + showLoginWindow(); + } + + }); + job->start(); } bool ShibbolethCredentials::stillValid(QNetworkReply *reply) diff --git a/src/gui/folder.cpp b/src/gui/folder.cpp index 13aa24d9a..d854f92ca 100644 --- a/src/gui/folder.cpp +++ b/src/gui/folder.cpp @@ -30,7 +30,6 @@ #include "socketapi.h" #include "theme.h" #include "filesystem.h" -#include "excludedfiles.h" #include "creds/abstractcredentials.h" @@ -79,7 +78,8 @@ Folder::Folder(const FolderDefinition &definition, // pass the setting if hidden files are to be ignored, will be read in csync_update _engine->setIgnoreHiddenFiles(_definition.ignoreHiddenFiles); - if (!setIgnoredFiles()) + ConfigFile::setupDefaultExcludeFilePaths(_engine->excludedFiles()); + if (!reloadExcludes()) qCWarning(lcFolder, "Could not read system exclude file"); connect(_accountState.data(), &AccountState::isConnectedChanged, this, &Folder::canSyncChanged); @@ -595,24 +595,9 @@ void Folder::wipe() FolderMan::instance()->socketApi()->slotRegisterPath(alias()); } -bool Folder::setIgnoredFiles() +bool Folder::reloadExcludes() { - // Note: Doing this on each sync run and on Folder construction is - // unnecessary, because _engine->excludedFiles() persists between - // sync runs. This is not a big problem because ExcludedFiles maintains - // a QSet of files to load. - ConfigFile cfg; - QString systemList = cfg.excludeFile(ConfigFile::SystemScope); - qCInfo(lcFolder) << "Adding system ignore list to csync:" << systemList; - _engine->excludedFiles().addExcludeFilePath(systemList); - - QString userList = cfg.excludeFile(ConfigFile::UserScope); - if (QFile::exists(userList)) { - qCInfo(lcFolder) << "Adding user defined ignore list to csync:" << userList; - _engine->excludedFiles().addExcludeFilePath(userList); - } - - return _engine->excludedFiles().reloadExcludes(); + return _engine->excludedFiles().reloadExcludeFiles(); } void Folder::setProxyDirty(bool value) @@ -647,7 +632,7 @@ void Folder::startSync(const QStringList &pathList) _fileLog->start(path()); - if (!setIgnoredFiles()) { + if (!reloadExcludes()) { slotSyncError(tr("Could not read system exclude file")); QMetaObject::invokeMethod(this, "slotSyncFinished", Qt::QueuedConnection, Q_ARG(bool, false)); return; diff --git a/src/gui/folder.h b/src/gui/folder.h index ac4954a06..8ffa1e6d5 100644 --- a/src/gui/folder.h +++ b/src/gui/folder.h @@ -323,7 +323,7 @@ private slots: void slotNextSyncFullLocalDiscovery(); private: - bool setIgnoredFiles(); + bool reloadExcludes(); void showSyncResultPopup(); @@ -342,7 +342,7 @@ private: }; void createGuiLog(const QString &filename, LogStatus status, int count, - const QString &renameTarget = QString::null); + const QString &renameTarget = QString()); AccountStatePtr _accountState; FolderDefinition _definition; diff --git a/src/gui/folderman.cpp b/src/gui/folderman.cpp index d4dd22035..7e5174700 100644 --- a/src/gui/folderman.cpp +++ b/src/gui/folderman.cpp @@ -1018,7 +1018,7 @@ QString FolderMan::getBackupName(QString fullPathName) const fullPathName.chop(1); if (fullPathName.isEmpty()) - return QString::null; + return QString(); QString newName = fullPathName + tr(" (backup)"); QFileInfo fi(newName); diff --git a/src/gui/folderstatusdelegate.cpp b/src/gui/folderstatusdelegate.cpp index 23606c324..9f1811b83 100644 --- a/src/gui/folderstatusdelegate.cpp +++ b/src/gui/folderstatusdelegate.cpp @@ -59,7 +59,7 @@ QSize FolderStatusDelegate::sizeHint(const QStyleOptionViewItem &option, auto classif = static_cast(index.model())->classify(index); if (classif == FolderStatusModel::AddButton) { const int margins = aliasFm.height(); // same as 2*aliasMargin of paint - QFontMetrics fm(option.font); + QFontMetrics fm(qApp->font("QPushButton")); QStyleOptionButton opt; static_cast(opt) = option; opt.text = addFolderText(); @@ -138,7 +138,10 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem & opt.rect.setWidth(qMin(opt.rect.width(), hint.width())); opt.rect.adjust(0, aliasMargin, 0, -aliasMargin); opt.rect = QStyle::visualRect(option.direction, option.rect, opt.rect); + painter->save(); + painter->setFont(qApp->font("QPushButton")); QApplication::style()->drawControl(QStyle::CE_PushButton, &opt, painter, option.widget); + painter->restore(); return; } diff --git a/src/gui/folderstatusmodel.cpp b/src/gui/folderstatusmodel.cpp index 0c593ebdb..d51b987dc 100644 --- a/src/gui/folderstatusmodel.cpp +++ b/src/gui/folderstatusmodel.cpp @@ -90,7 +90,7 @@ void FolderStatusModel::setAccountState(const AccountState *accountState) } // Sort by header text - qSort(_folders.begin(), _folders.end(), sortByFolderHeader); + std::sort(_folders.begin(), _folders.end(), sortByFolderHeader); // Set the root _pathIdx after the sorting for (int i = 0; i < _folders.size(); ++i) { @@ -951,8 +951,7 @@ void FolderStatusModel::slotSetProgress(const ProgressInfo &progress) //: Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) fileProgressString.append(tr("download %1/s").arg(Utility::octetsToString(estimatedDownBw))); #else - fileProgressString.append(trUtf8("\u2193" - " %1/s") + fileProgressString.append(tr("\u2193 %1/s") .arg(Utility::octetsToString(estimatedDownBw))); #endif } @@ -962,8 +961,7 @@ void FolderStatusModel::slotSetProgress(const ProgressInfo &progress) //: Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) fileProgressString.append(tr("upload %1/s").arg(Utility::octetsToString(estimatedUpBw))); #else - fileProgressString.append(trUtf8("\u2191" - " %1/s") + fileProgressString.append(tr("\u2191 %1/s") .arg(Utility::octetsToString(estimatedUpBw))); #endif } diff --git a/src/gui/folderwatcher.cpp b/src/gui/folderwatcher.cpp index 443956d19..b39c15dcb 100644 --- a/src/gui/folderwatcher.cpp +++ b/src/gui/folderwatcher.cpp @@ -32,7 +32,6 @@ #include "folderwatcher_linux.h" #endif -#include "excludedfiles.h" #include "folder.h" namespace OCC { diff --git a/src/gui/folderwizard.cpp b/src/gui/folderwizard.cpp index 441ece4e0..e42a4dda8 100644 --- a/src/gui/folderwizard.cpp +++ b/src/gui/folderwizard.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include @@ -106,7 +107,7 @@ bool FolderWizardLocalPath::isComplete() const _ui.warnLabel->setWordWrap(true); if (isOk) { _ui.warnLabel->hide(); - _ui.warnLabel->setText(QString::null); + _ui.warnLabel->setText(QString()); } else { _ui.warnLabel->show(); QString warnings = formatWarnings(warnStrings); @@ -117,7 +118,7 @@ bool FolderWizardLocalPath::isComplete() const void FolderWizardLocalPath::slotChooseLocalFolder() { - QString sf = QDesktopServices::storageLocation(QDesktopServices::HomeLocation); + QString sf = QStandardPaths::writableLocation(QStandardPaths::HomeLocation); QDir d(sf); // open the first entry of the home dir. Otherwise the dir picker comes @@ -536,9 +537,11 @@ FolderWizard::FolderWizard(AccountPtr account, QWidget *parent) { setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); setPage(Page_Source, _folderWizardSourcePage); + _folderWizardSourcePage->installEventFilter(this); if (!Theme::instance()->singleSyncFolder()) { _folderWizardTargetPage = new FolderWizardRemotePath(account); setPage(Page_Target, _folderWizardTargetPage); + _folderWizardTargetPage->installEventFilter(this); } setPage(Page_SelectiveSync, _folderWizardSelectiveSyncPage); @@ -551,5 +554,25 @@ FolderWizard::~FolderWizard() { } +bool FolderWizard::eventFilter(QObject *watched, QEvent *event) +{ + if (event->type() == QEvent::LayoutRequest) { + // Workaround QTBUG-3396: forces QWizardPrivate::updateLayout() + QTimer::singleShot(0, this, [this] { setTitleFormat(titleFormat()); }); + } + return QWizard::eventFilter(watched, event); +} + +void FolderWizard::resizeEvent(QResizeEvent *event) +{ + QWizard::resizeEvent(event); + + // workaround for QTBUG-22819: when the error label word wrap, the minimum height is not adjusted + int hfw = currentPage()->heightForWidth(currentPage()->width()); + if (currentPage()->height() < hfw) { + currentPage()->setMinimumSize(currentPage()->minimumSizeHint().width(), hfw); + setTitleFormat(titleFormat()); // And another workaround for QTBUG-3396 + } +} } // end namespace diff --git a/src/gui/folderwizard.h b/src/gui/folderwizard.h index e24cb5ac9..b6f056f56 100644 --- a/src/gui/folderwizard.h +++ b/src/gui/folderwizard.h @@ -149,6 +149,9 @@ public: explicit FolderWizard(AccountPtr account, QWidget *parent = 0); ~FolderWizard(); + bool eventFilter(QObject *watched, QEvent *event) override; + void resizeEvent(QResizeEvent *event) override; + private: FolderWizardLocalPath *_folderWizardSourcePage; FolderWizardRemotePath *_folderWizardTargetPage; diff --git a/src/gui/guiutility.cpp b/src/gui/guiutility.cpp index 0a3ee6f0f..8f71b1cda 100644 --- a/src/gui/guiutility.cpp +++ b/src/gui/guiutility.cpp @@ -19,6 +19,7 @@ #include #include #include +#include using namespace OCC; @@ -45,8 +46,10 @@ bool Utility::openBrowser(const QUrl &url, QWidget *errorWidgetParent) bool Utility::openEmailComposer(const QString &subject, const QString &body, QWidget *errorWidgetParent) { QUrl url(QLatin1String("mailto:")); - url.setQueryItems({ { QLatin1String("subject"), subject }, + QUrlQuery query; + query.setQueryItems({ { QLatin1String("subject"), subject }, { QLatin1String("body"), body } }); + url.setQuery(query); if (!QDesktopServices::openUrl(url)) { if (errorWidgetParent) { diff --git a/src/gui/ignorelisteditor.cpp b/src/gui/ignorelisteditor.cpp index a71a9cde8..c82ac7a3b 100644 --- a/src/gui/ignorelisteditor.cpp +++ b/src/gui/ignorelisteditor.cpp @@ -17,7 +17,6 @@ #include "ignorelisteditor.h" #include "folderman.h" #include "ui_ignorelisteditor.h" -#include "excludedfiles.h" #include #include @@ -61,7 +60,7 @@ IgnoreListEditor::IgnoreListEditor(QWidget *parent) connect(ui->addPushButton, &QAbstractButton::clicked, this, &IgnoreListEditor::slotAddPattern); ui->tableWidget->resizeColumnsToContents(); - ui->tableWidget->horizontalHeader()->setResizeMode(patternCol, QHeaderView::Stretch); + ui->tableWidget->horizontalHeader()->setSectionResizeMode(patternCol, QHeaderView::Stretch); ui->tableWidget->verticalHeader()->setVisible(false); ui->syncHiddenFilesCheckBox->setChecked(!FolderMan::instance()->ignoreHiddenFiles()); @@ -135,8 +134,6 @@ void IgnoreListEditor::slotUpdateLocalIgnoreList() folder->journalDb()->forceRemoteDiscoveryNextSync(); folderMan->scheduleFolder(folder); } - - ExcludedFiles::instance().reloadExcludes(); } void IgnoreListEditor::slotAddPattern() diff --git a/src/gui/issueswidget.cpp b/src/gui/issueswidget.cpp index c132ff925..c1692473e 100644 --- a/src/gui/issueswidget.cpp +++ b/src/gui/issueswidget.cpp @@ -32,6 +32,7 @@ #include "common/syncjournalfilerecord.h" #include "elidedlabel.h" + #include "ui_issueswidget.h" #include @@ -54,6 +55,9 @@ IssuesWidget::IssuesWidget(QWidget *parent) connect(_ui->_treeWidget, &QTreeWidget::itemActivated, this, &IssuesWidget::slotOpenFile); connect(_ui->copyIssuesButton, &QAbstractButton::clicked, this, &IssuesWidget::copyToClipboard); + _ui->_treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); + connect(_ui->_treeWidget, &QTreeWidget::customContextMenuRequested, this, &IssuesWidget::slotItemContextMenu); + connect(_ui->showIgnores, &QAbstractButton::toggled, this, &IssuesWidget::slotRefreshIssues); connect(_ui->showWarnings, &QAbstractButton::toggled, this, &IssuesWidget::slotRefreshIssues); connect(_ui->filterAccount, static_cast(&QComboBox::currentIndexChanged), this, &IssuesWidget::slotRefreshIssues); @@ -85,7 +89,7 @@ IssuesWidget::IssuesWidget(QWidget *parent) _ui->_treeWidget->setHeaderLabels(header); int timestampColumnWidth = ActivityItemDelegate::rowHeight() // icon - + _ui->_treeWidget->fontMetrics().width(ProtocolWidget::timeString(QDateTime::currentDateTime())) + + _ui->_treeWidget->fontMetrics().width(ProtocolItem::timeString(QDateTime::currentDateTime())) + timestampColumnExtra; _ui->_treeWidget->setColumnWidth(0, timestampColumnWidth); _ui->_treeWidget->setColumnWidth(1, 180); @@ -198,7 +202,7 @@ void IssuesWidget::slotItemCompleted(const QString &folder, const SyncFileItemPt { if (!item->hasErrorStatus()) return; - QTreeWidgetItem *line = ProtocolWidget::createCompletedTreewidgetItem(folder, *item); + QTreeWidgetItem *line = ProtocolItem::create(folder, *item); if (!line) return; addItem(line); @@ -233,6 +237,15 @@ void IssuesWidget::slotAccountRemoved(AccountState *account) updateAccountChoiceVisibility(); } +void IssuesWidget::slotItemContextMenu(const QPoint &pos) +{ + auto item = _ui->_treeWidget->itemAt(pos); + if (!item) + return; + auto globalPos = _ui->_treeWidget->viewport()->mapToGlobal(pos); + ProtocolItem::openContextMenu(globalPos, item, this); +} + void IssuesWidget::updateAccountChoiceVisibility() { bool visible = _ui->filterAccount->count() > 2; @@ -373,8 +386,8 @@ void IssuesWidget::addError(const QString &folderAlias, const QString &message, QStringList columns; QDateTime timestamp = QDateTime::currentDateTime(); - const QString timeStr = ProtocolWidget::timeString(timestamp); - const QString longTimeStr = ProtocolWidget::timeString(timestamp, QLocale::LongFormat); + const QString timeStr = ProtocolItem::timeString(timestamp); + const QString longTimeStr = ProtocolItem::timeString(timestamp, QLocale::LongFormat); columns << timeStr; columns << ""; // no "File" entry @@ -383,7 +396,7 @@ void IssuesWidget::addError(const QString &folderAlias, const QString &message, QIcon icon = Theme::instance()->syncStateIcon(SyncResult::Error); - QTreeWidgetItem *twitem = new SortedTreeWidgetItem(columns); + QTreeWidgetItem *twitem = new ProtocolItem(columns); twitem->setData(0, Qt::SizeHintRole, QSize(0, ActivityItemDelegate::rowHeight())); twitem->setData(0, Qt::UserRole, timestamp); twitem->setIcon(0, icon); diff --git a/src/gui/issueswidget.h b/src/gui/issueswidget.h index 4accd89b2..9f295b816 100644 --- a/src/gui/issueswidget.h +++ b/src/gui/issueswidget.h @@ -68,6 +68,7 @@ private slots: void slotUpdateFolderFilters(); void slotAccountAdded(AccountState *account); void slotAccountRemoved(AccountState *account); + void slotItemContextMenu(const QPoint &pos); private: void updateAccountChoiceVisibility(); diff --git a/src/gui/notificationwidget.cpp b/src/gui/notificationwidget.cpp index dbf8c18ff..cd879451e 100644 --- a/src/gui/notificationwidget.cpp +++ b/src/gui/notificationwidget.cpp @@ -128,8 +128,8 @@ void NotificationWidget::slotNotificationRequestFinished(int statusCode) QString timeStr = locale.toString(QTime::currentTime()); - // the ocs API returns stat code 100 if it succeeded. - if (statusCode != OCS_SUCCESS_STATUS_CODE) { + // the ocs API returns stat code 100 or 200 inside the xml if it succeeded. + if (statusCode != OCS_SUCCESS_STATUS_CODE && statusCode != OCS_SUCCESS_STATUS_CODE_V2) { qCWarning(lcNotifications) << "Notification Request to Server failed, leave button visible."; for (i = 0; i < _buttons.count(); i++) { _buttons.at(i)->setEnabled(true); diff --git a/src/gui/ocsjob.cpp b/src/gui/ocsjob.cpp index cc1e0d9fa..6793bf09e 100644 --- a/src/gui/ocsjob.cpp +++ b/src/gui/ocsjob.cpp @@ -28,6 +28,7 @@ OcsJob::OcsJob(AccountPtr account) : AbstractNetworkJob(account, "") { _passStatusCodes.append(OCS_SUCCESS_STATUS_CODE); + _passStatusCodes.append(OCS_SUCCESS_STATUS_CODE_V2); setIgnoreCredentialFailure(true); } @@ -51,15 +52,16 @@ void OcsJob::appendPath(const QString &id) setPath(path() + QLatin1Char('/') + id); } -static QList> -percentEncodeQueryItems( +static QUrlQuery percentEncodeQueryItems( const QList> &items) { - QList> result; + QUrlQuery result; + // Note: QUrlQuery::setQueryItems() does not fully percent encode + // the query items, see #5042 foreach (const auto &item, items) { - result.append(qMakePair( + result.addQueryItem( QUrl::toPercentEncoding(item.first), - QUrl::toPercentEncoding(item.second))); + QUrl::toPercentEncoding(item.second)); } return result; } @@ -70,13 +72,11 @@ void OcsJob::start() req.setRawHeader("Ocs-APIREQUEST", "true"); req.setRawHeader("Content-Type", "application/x-www-form-urlencoded"); - QUrl url = Utility::concatUrlPath(account()->url(), path()); QBuffer *buffer = new QBuffer; + QUrlQuery queryItems; if (_verb == "GET") { - // Note: QUrl::setQueryItems() does not fully percent encode - // the query items, see #5042 - url.setEncodedQueryItems(percentEncodeQueryItems(_params)); + queryItems = percentEncodeQueryItems(_params); } else if (_verb == "POST" || _verb == "PUT") { // Url encode the _postParams and put them in a buffer. QByteArray postData; @@ -90,12 +90,8 @@ void OcsJob::start() } buffer->setData(postData); } - - //We want json data - auto queryItems = url.encodedQueryItems(); - queryItems.append(qMakePair(QByteArray("format"), QByteArray("json"))); - url.setEncodedQueryItems(queryItems); - + queryItems.addQueryItem(QLatin1String("format"), QLatin1String("json")); + QUrl url = Utility::concatUrlPath(account()->url(), path(), queryItems); sendRequest(_verb, url, req, buffer); AbstractNetworkJob::start(); } diff --git a/src/gui/ocsjob.h b/src/gui/ocsjob.h index 4560b3a36..4de4d701e 100644 --- a/src/gui/ocsjob.h +++ b/src/gui/ocsjob.h @@ -24,6 +24,8 @@ #include #define OCS_SUCCESS_STATUS_CODE 100 +// Apparantly the v2.php URLs can return that +#define OCS_SUCCESS_STATUS_CODE_V2 200 class QJsonDocument; diff --git a/src/gui/protocolwidget.cpp b/src/gui/protocolwidget.cpp index e27152563..7324a1026 100644 --- a/src/gui/protocolwidget.cpp +++ b/src/gui/protocolwidget.cpp @@ -25,6 +25,8 @@ #include "folder.h" #include "openfilemanager.h" #include "activityitemdelegate.h" +#include "guiutility.h" +#include "accountstate.h" #include "ui_protocolwidget.h" @@ -32,7 +34,115 @@ namespace OCC { -bool SortedTreeWidgetItem::operator<(const QTreeWidgetItem &other) const +QString ProtocolItem::timeString(QDateTime dt, QLocale::FormatType format) +{ + const QLocale loc = QLocale::system(); + QString dtFormat = loc.dateTimeFormat(format); + static const QRegExp re("(HH|H|hh|h):mm(?!:s)"); + dtFormat.replace(re, "\\1:mm:ss"); + return loc.toString(dt, dtFormat); +} + +ProtocolItem *ProtocolItem::create(const QString &folder, const SyncFileItem &item) +{ + auto f = FolderMan::instance()->folder(folder); + if (!f) { + return 0; + } + + QStringList columns; + QDateTime timestamp = QDateTime::currentDateTime(); + const QString timeStr = timeString(timestamp); + const QString longTimeStr = timeString(timestamp, QLocale::LongFormat); + + columns << timeStr; + columns << Utility::fileNameForGuiUse(item._originalFile); + columns << f->shortGuiLocalPath(); + + // If the error string is set, it's prefered because it is a useful user message. + QString message = item._errorString; + if (message.isEmpty()) { + message = Progress::asResultString(item); + } + columns << message; + + QIcon icon; + if (item._status == SyncFileItem::NormalError + || item._status == SyncFileItem::FatalError + || item._status == SyncFileItem::DetailError + || item._status == SyncFileItem::BlacklistedError) { + icon = Theme::instance()->syncStateIcon(SyncResult::Error); + } else if (Progress::isWarningKind(item._status)) { + icon = Theme::instance()->syncStateIcon(SyncResult::Problem); + } + + if (ProgressInfo::isSizeDependent(item)) { + columns << Utility::octetsToString(item._size); + } + + ProtocolItem *twitem = new ProtocolItem(columns); + // Warning: The data and tooltips on the columns define an implicit + // interface and can only be changed with care. + twitem->setData(0, Qt::SizeHintRole, QSize(0, ActivityItemDelegate::rowHeight())); + twitem->setData(0, Qt::UserRole, timestamp); + twitem->setIcon(0, icon); + twitem->setToolTip(0, longTimeStr); + twitem->setToolTip(1, item._file); + twitem->setData(2, Qt::UserRole, folder); + twitem->setToolTip(3, message); + twitem->setData(3, Qt::UserRole, item._status); + return twitem; +} + +SyncJournalFileRecord ProtocolItem::syncJournalRecord(QTreeWidgetItem *item) +{ + SyncJournalFileRecord rec; + auto f = folder(item); + if (!f) + return rec; + f->journalDb()->getFileRecord(item->toolTip(1), &rec); + return rec; +} + +Folder *ProtocolItem::folder(QTreeWidgetItem *item) +{ + return FolderMan::instance()->folder(item->data(2, Qt::UserRole).toString()); +} + +void ProtocolItem::openContextMenu(QPoint globalPos, QTreeWidgetItem *item, QWidget *parent) +{ + auto f = ProtocolItem::folder(item); + if (!f) + return; + AccountPtr account = f->accountState()->account(); + auto rec = ProtocolItem::syncJournalRecord(item); + // rec might not be valid + + auto menu = new QMenu(parent); + + if (rec.isValid()) { + // "Open in Browser" action + auto openInBrowser = menu->addAction(ProtocolWidget::tr("Open in browser")); + QObject::connect(openInBrowser, &QAction::triggered, parent, [parent, account, rec]() { + fetchPrivateLinkUrl(account, rec._path, rec.numericFileId(), parent, + [parent](const QString &url) { + Utility::openBrowser(url, parent); + }); + }); + } + + // More actions will be conditionally added to the context menu here later + + if (menu->actions().isEmpty()) { + delete menu; + return; + } + + menu->setAttribute(Qt::WA_DeleteOnClose); + menu->popup(globalPos); +} + +bool ProtocolItem::operator<(const QTreeWidgetItem &other) const { int column = treeWidget()->sortColumn(); if (column != 0) { @@ -56,6 +166,9 @@ ProtocolWidget::ProtocolWidget(QWidget *parent) connect(_ui->_treeWidget, &QTreeWidget::itemActivated, this, &ProtocolWidget::slotOpenFile); + _ui->_treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); + connect(_ui->_treeWidget, &QTreeWidget::customContextMenuRequested, this, &ProtocolWidget::slotItemContextMenu); + // Adjust copyToClipboard() when making changes here! QStringList header; header << tr("Time"); @@ -71,7 +184,7 @@ ProtocolWidget::ProtocolWidget(QWidget *parent) _ui->_treeWidget->setHeaderLabels(header); int timestampColumnWidth = - _ui->_treeWidget->fontMetrics().width(timeString(QDateTime::currentDateTime())) + _ui->_treeWidget->fontMetrics().width(ProtocolItem::timeString(QDateTime::currentDateTime())) + timestampColumnExtra; _ui->_treeWidget->setColumnWidth(0, timestampColumnWidth); _ui->_treeWidget->setColumnWidth(1, 180); @@ -119,14 +232,13 @@ void ProtocolWidget::hideEvent(QHideEvent *ev) QWidget::hideEvent(ev); } - -QString ProtocolWidget::timeString(QDateTime dt, QLocale::FormatType format) +void ProtocolWidget::slotItemContextMenu(const QPoint &pos) { - const QLocale loc = QLocale::system(); - QString dtFormat = loc.dateTimeFormat(format); - static const QRegExp re("(HH|H|hh|h):mm(?!:s)"); - dtFormat.replace(re, "\\1:mm:ss"); - return loc.toString(dt, dtFormat); + auto item = _ui->_treeWidget->itemAt(pos); + if (!item) + return; + auto globalPos = _ui->_treeWidget->viewport()->mapToGlobal(pos); + ProtocolItem::openContextMenu(globalPos, item, this); } void ProtocolWidget::slotOpenFile(QTreeWidgetItem *item, int) @@ -144,60 +256,11 @@ void ProtocolWidget::slotOpenFile(QTreeWidgetItem *item, int) } } -QTreeWidgetItem *ProtocolWidget::createCompletedTreewidgetItem(const QString &folder, const SyncFileItem &item) -{ - auto f = FolderMan::instance()->folder(folder); - if (!f) { - return 0; - } - - QStringList columns; - QDateTime timestamp = QDateTime::currentDateTime(); - const QString timeStr = timeString(timestamp); - const QString longTimeStr = timeString(timestamp, QLocale::LongFormat); - - columns << timeStr; - columns << Utility::fileNameForGuiUse(item._originalFile); - columns << f->shortGuiLocalPath(); - - // If the error string is set, it's prefered because it is a useful user message. - QString message = item._errorString; - if (message.isEmpty()) { - message = Progress::asResultString(item); - } - columns << message; - - QIcon icon; - if (item._status == SyncFileItem::NormalError - || item._status == SyncFileItem::FatalError - || item._status == SyncFileItem::DetailError - || item._status == SyncFileItem::BlacklistedError) { - icon = Theme::instance()->syncStateIcon(SyncResult::Error); - } else if (Progress::isWarningKind(item._status)) { - icon = Theme::instance()->syncStateIcon(SyncResult::Problem); - } - - if (ProgressInfo::isSizeDependent(item)) { - columns << Utility::octetsToString(item._size); - } - - QTreeWidgetItem *twitem = new SortedTreeWidgetItem(columns); - twitem->setData(0, Qt::SizeHintRole, QSize(0, ActivityItemDelegate::rowHeight())); - twitem->setData(0, Qt::UserRole, timestamp); - twitem->setIcon(0, icon); - twitem->setToolTip(0, longTimeStr); - twitem->setToolTip(1, item._file); - twitem->setData(2, Qt::UserRole, folder); - twitem->setToolTip(3, message); - twitem->setData(3, Qt::UserRole, item._status); - return twitem; -} - void ProtocolWidget::slotItemCompleted(const QString &folder, const SyncFileItemPtr &item) { if (item->hasErrorStatus()) return; - QTreeWidgetItem *line = createCompletedTreewidgetItem(folder, *item); + QTreeWidgetItem *line = ProtocolItem::create(folder, *item); if (line) { // Limit the number of items int itemCnt = _ui->_treeWidget->topLevelItemCount(); diff --git a/src/gui/protocolwidget.h b/src/gui/protocolwidget.h index 77bb641b4..147ba4d1f 100644 --- a/src/gui/protocolwidget.h +++ b/src/gui/protocolwidget.h @@ -35,16 +35,25 @@ namespace Ui { class Application; /** - * A QTreeWidgetItem with special sorting. + * The items used in the protocol and issue QTreeWidget * - * It allows items for global entries to be moved to the top if the + * Special sorting: It allows items for global entries to be moved to the top if the * sorting section is the "Time" column. */ -class SortedTreeWidgetItem : public QTreeWidgetItem +class ProtocolItem : public QTreeWidgetItem { public: using QTreeWidgetItem::QTreeWidgetItem; + // Shared with IssueWidget + static ProtocolItem *create(const QString &folder, const SyncFileItem &item); + static QString timeString(QDateTime dt, QLocale::FormatType format = QLocale::NarrowFormat); + + static SyncJournalFileRecord syncJournalRecord(QTreeWidgetItem *item); + static Folder *folder(QTreeWidgetItem *item); + + static void openContextMenu(QPoint globalPos, QTreeWidgetItem *item, QWidget *parent); + private: bool operator<(const QTreeWidgetItem &other) const override; }; @@ -63,10 +72,6 @@ public: void storeSyncActivity(QTextStream &ts); - // Shared with IssueWidget - static QTreeWidgetItem *createCompletedTreewidgetItem(const QString &folder, const SyncFileItem &item); - static QString timeString(QDateTime dt, QLocale::FormatType format = QLocale::NarrowFormat); - public slots: void slotItemCompleted(const QString &folder, const SyncFileItemPtr &item); void slotOpenFile(QTreeWidgetItem *item, int); @@ -75,6 +80,9 @@ protected: void showEvent(QShowEvent *); void hideEvent(QHideEvent *); +private slots: + void slotItemContextMenu(const QPoint &pos); + signals: void copyToClipboard(); diff --git a/src/gui/selectivesyncdialog.cpp b/src/gui/selectivesyncdialog.cpp index 87d2bdc22..961894c08 100644 --- a/src/gui/selectivesyncdialog.cpp +++ b/src/gui/selectivesyncdialog.cpp @@ -14,7 +14,6 @@ #include "selectivesyncdialog.h" #include "folder.h" #include "account.h" -#include "excludedfiles.h" #include "networkjobs.h" #include "theme.h" #include "folderman.h" @@ -95,6 +94,9 @@ SelectiveSyncWidget::SelectiveSyncWidget(AccountPtr account, QWidget *parent) _folderTree->header()->setStretchLastSection(true); _folderTree->headerItem()->setText(0, tr("Name")); _folderTree->headerItem()->setText(1, tr("Size")); + + ConfigFile::setupDefaultExcludeFilePaths(_excludedFiles); + _excludedFiles.reloadExcludeFiles(); } QSize SelectiveSyncWidget::sizeHint() const @@ -204,7 +206,7 @@ void SelectiveSyncWidget::slotUpdateDirectories(QStringList list) QMutableListIterator it(list); while (it.hasNext()) { it.next(); - if (ExcludedFiles::instance().isExcluded(it.value(), pathToRemove, FolderMan::instance()->ignoreHiddenFiles())) + if (_excludedFiles.isExcluded(it.value(), pathToRemove, FolderMan::instance()->ignoreHiddenFiles())) it.remove(); } diff --git a/src/gui/selectivesyncdialog.h b/src/gui/selectivesyncdialog.h index 15e4d7d33..a67f419a7 100644 --- a/src/gui/selectivesyncdialog.h +++ b/src/gui/selectivesyncdialog.h @@ -17,6 +17,8 @@ #include #include "accountfwd.h" +#include "csync_exclude.h" + class QTreeWidgetItem; class QTreeWidget; class QNetworkReply; @@ -72,6 +74,10 @@ private: QLabel *_loading; QTreeWidget *_folderTree; + + // During account setup we want to filter out excluded folders from the + // view without having a Folder.SyncEngine.ExcludedFiles instance. + ExcludedFiles _excludedFiles; }; /** diff --git a/src/gui/servernotificationhandler.cpp b/src/gui/servernotificationhandler.cpp index 7c69bf599..72b65b296 100644 --- a/src/gui/servernotificationhandler.cpp +++ b/src/gui/servernotificationhandler.cpp @@ -24,6 +24,8 @@ namespace OCC { Q_LOGGING_CATEGORY(lcServerNotification, "gui.servernotification", QtInfoMsg) +const QString notificationsPath = QLatin1String("ocs/v2.php/apps/notifications/api/v1/notifications"); + ServerNotificationHandler::ServerNotificationHandler(QObject *parent) : QObject(parent) { @@ -47,7 +49,7 @@ void ServerNotificationHandler::slotFetchNotifications(AccountState *ptr) } // if the previous notification job has finished, start next. - _notificationJob = new JsonApiJob(ptr->account(), QLatin1String("ocs/v2.php/apps/notifications/api/v1/notifications"), this); + _notificationJob = new JsonApiJob(ptr->account(), notificationsPath, this); QObject::connect(_notificationJob.data(), &JsonApiJob::jsonReceived, this, &ServerNotificationHandler::slotNotificationsReceived); _notificationJob->setProperty("AccountStatePtr", QVariant::fromValue(ptr)); @@ -94,6 +96,16 @@ void ServerNotificationHandler::slotNotificationsReceived(const QJsonDocument &j a._links.append(al); } + + // Add another action to dismiss notification on server + // https://github.com/owncloud/notifications/blob/master/docs/ocs-endpoint-v1.md#deleting-a-notification-for-a-user + ActivityLink al; + al._label = tr("Dismiss"); + al._link = Utility::concatUrlPath(ai->account()->url(), notificationsPath + "/" + json.value("notification_id").toString()).toString(); + al._verb = "DELETE"; + al._isPrimary = false; + a._links.append(al); + list.append(a); } emit newNotificationList(list); diff --git a/src/gui/settingsdialog.cpp b/src/gui/settingsdialog.cpp index d4b9c3eda..1eaf38fd2 100644 --- a/src/gui/settingsdialog.cpp +++ b/src/gui/settingsdialog.cpp @@ -57,23 +57,6 @@ namespace OCC { #include "settingsdialogcommon.cpp" -static QIcon circleMask(const QImage &avatar) -{ - int dim = avatar.width(); - - QPixmap fixedImage(dim, dim); - fixedImage.fill(Qt::transparent); - - QPainter imgPainter(&fixedImage); - QPainterPath clip; - clip.addEllipse(0, 0, dim, dim); - imgPainter.setClipPath(clip); - imgPainter.drawImage(0, 0, avatar); - imgPainter.end(); - - return QIcon(fixedImage); -} - // // Whenever you change something here check both settingsdialog.cpp and settingsdialogmac.cpp ! // @@ -232,7 +215,7 @@ void SettingsDialog::accountAdded(AccountState *s) accountAction = createColorAwareAction(QLatin1String(":/client/resources/account.png"), actionText); } else { - QIcon icon = circleMask(avatar); + QIcon icon(QPixmap::fromImage(AvatarJob::makeCircularAvatar(avatar))); accountAction = createActionWithIcon(icon, actionText); } @@ -265,7 +248,7 @@ void SettingsDialog::slotAccountAvatarChanged() if (action) { QImage pix = account->avatar(); if (!pix.isNull()) { - action->setIcon(circleMask(pix)); + action->setIcon(QPixmap::fromImage(AvatarJob::makeCircularAvatar(pix))); } } } @@ -325,7 +308,7 @@ void SettingsDialog::customizeStyle() QString altBase(palette().alternateBase().color().name()); QString dark(palette().dark().color().name()); QString background(palette().base().color().name()); - _toolBar->setStyleSheet(QString::fromAscii(TOOLBAR_CSS).arg(background, dark, highlightColor, altBase)); + _toolBar->setStyleSheet(QString::fromLatin1(TOOLBAR_CSS).arg(background, dark, highlightColor, altBase)); Q_FOREACH (QAction *a, _actionGroup->actions()) { QIcon icon = createColorAwareIcon(a->property("iconPath").toString()); diff --git a/src/gui/sharelinkwidget.cpp b/src/gui/sharelinkwidget.cpp index 3c4a21726..7838e04b5 100644 --- a/src/gui/sharelinkwidget.cpp +++ b/src/gui/sharelinkwidget.cpp @@ -81,8 +81,9 @@ ShareLinkWidget::ShareLinkWidget(AccountPtr account, connect(_ui->pushButton_setPassword, &QAbstractButton::clicked, this, &ShareLinkWidget::slotPasswordReturnPressed); connect(_ui->checkBox_expire, &QAbstractButton::clicked, this, &ShareLinkWidget::slotCheckBoxExpireClicked); connect(_ui->calendar, &QDateTimeEdit::dateChanged, this, &ShareLinkWidget::slotExpireDateChanged); - connect(_ui->checkBox_editing, &QAbstractButton::clicked, this, &ShareLinkWidget::slotPermissionsCheckboxClicked); - connect(_ui->checkBox_fileListing, &QAbstractButton::clicked, this, &ShareLinkWidget::slotPermissionsCheckboxClicked); + connect(_ui->radio_readOnly, &QAbstractButton::clicked, this, &ShareLinkWidget::slotPermissionsClicked); + connect(_ui->radio_readWrite, &QAbstractButton::clicked, this, &ShareLinkWidget::slotPermissionsClicked); + connect(_ui->radio_uploadOnly, &QAbstractButton::clicked, this, &ShareLinkWidget::slotPermissionsClicked); _ui->errorLabel->hide(); @@ -149,7 +150,7 @@ ShareLinkWidget::ShareLinkWidget(AccountPtr account, // File can't have public upload set; we also hide it if the capability isn't there _ui->widget_editing->setVisible( !_isFile && _account->capabilities().sharePublicLinkAllowUpload()); - _ui->checkBox_fileListing->setVisible( + _ui->radio_uploadOnly->setVisible( _account->capabilities().sharePublicLinkSupportsUploadOnly()); @@ -158,12 +159,12 @@ ShareLinkWidget::ShareLinkWidget(AccountPtr account, _linkContextMenu = new QMenu(this); connect(_linkContextMenu, &QMenu::triggered, this, &ShareLinkWidget::slotLinkContextMenuActionTriggered); - _deleteLinkAction = _linkContextMenu->addAction(tr("Delete")); _openLinkAction = _linkContextMenu->addAction(tr("Open link in browser")); _copyLinkAction = _linkContextMenu->addAction(tr("Copy link to clipboard")); _copyDirectLinkAction = _linkContextMenu->addAction(tr("Copy link to clipboard (direct download)")); _emailLinkAction = _linkContextMenu->addAction(tr("Send link by email")); _emailDirectLinkAction = _linkContextMenu->addAction(tr("Send link by email (direct download)")); + _deleteLinkAction = _linkContextMenu->addAction(tr("Delete")); /* * Create the share manager and connect it properly @@ -282,7 +283,9 @@ void ShareLinkWidget::slotShareSelectionChanged() auto share = selectedShare(); if (!share) { _ui->shareProperties->setEnabled(false); - _ui->checkBox_editing->setChecked(false); + _ui->radio_readOnly->setChecked(false); + _ui->radio_readWrite->setChecked(false); + _ui->radio_uploadOnly->setChecked(false); _ui->checkBox_expire->setChecked(false); _ui->checkBox_password->setChecked(false); return; @@ -292,8 +295,11 @@ void ShareLinkWidget::slotShareSelectionChanged() _ui->checkBox_password->setEnabled(!_passwordRequired); _ui->checkBox_expire->setEnabled(!_expiryRequired); - _ui->checkBox_editing->setEnabled( - _account->capabilities().sharePublicLinkAllowUpload()); + _ui->widget_editing->setEnabled(true); + if (!_account->capabilities().sharePublicLinkAllowUpload()) { + _ui->radio_readWrite->setEnabled(false); + _ui->radio_uploadOnly->setEnabled(false); + } // Password state _ui->checkBox_password->setText(tr("P&assword protect")); @@ -324,9 +330,15 @@ void ShareLinkWidget::slotShareSelectionChanged() // Public upload state (box is hidden for files) if (!_isFile) { - _ui->checkBox_editing->setChecked(share->getPublicUpload()); - _ui->checkBox_fileListing->setChecked(share->getShowFileListing()); - _ui->checkBox_fileListing->setEnabled(share->getPublicUpload()); + if (share->getPublicUpload()) { + if (share->getShowFileListing()) { + _ui->radio_readWrite->setChecked(true); + } else { + _ui->radio_uploadOnly->setChecked(true); + } + } else { + _ui->radio_readOnly->setChecked(true); + } } } @@ -456,7 +468,7 @@ void ShareLinkWidget::slotCreateShareRequiresPassword(const QString &message) _ui->checkBox_password->setEnabled(false); _ui->checkBox_password->setText(tr("Public shå requires a password")); _ui->checkBox_expire->setEnabled(false); - _ui->checkBox_editing->setEnabled(false); + _ui->widget_editing->setEnabled(false); if (!message.isEmpty()) { _ui->errorLabel->setText(message); _ui->errorLabel->show(); @@ -579,19 +591,18 @@ void ShareLinkWidget::slotDeleteShareClicked() confirmAndDeleteShare(share); } -void ShareLinkWidget::slotPermissionsCheckboxClicked() +void ShareLinkWidget::slotPermissionsClicked() { if (auto current = selectedShare()) { - _ui->checkBox_editing->setEnabled(false); - _ui->checkBox_fileListing->setEnabled(false); + _ui->widget_editing->setEnabled(false); _pi_editing->startAnimation(); _ui->errorLabel->hide(); SharePermissions perm = SharePermissionRead; - if (_ui->checkBox_editing->isChecked() && _ui->checkBox_fileListing->isChecked()) { + if (_ui->radio_readWrite->isChecked()) { perm = SharePermissionRead | SharePermissionCreate | SharePermissionUpdate | SharePermissionDelete; - } else if (_ui->checkBox_editing->isChecked() && !_ui->checkBox_fileListing->isChecked()) { + } else if (_ui->radio_uploadOnly->isChecked()) { perm = SharePermissionCreate; } current->setPermissions(perm); diff --git a/src/gui/sharelinkwidget.h b/src/gui/sharelinkwidget.h index 17394ffa7..30188a34b 100644 --- a/src/gui/sharelinkwidget.h +++ b/src/gui/sharelinkwidget.h @@ -65,7 +65,7 @@ private slots: void slotCheckBoxPasswordClicked(); void slotCheckBoxExpireClicked(); void slotPasswordReturnPressed(); - void slotPermissionsCheckboxClicked(); + void slotPermissionsClicked(); void slotExpireDateChanged(const QDate &date); void slotPasswordChanged(const QString &newText); void slotNameEdited(QTableWidgetItem *item); diff --git a/src/gui/sharelinkwidget.ui b/src/gui/sharelinkwidget.ui index 9d80573be..ef321bfaf 100644 --- a/src/gui/sharelinkwidget.ui +++ b/src/gui/sharelinkwidget.ui @@ -6,8 +6,8 @@ 0 0 - 376 - 493 + 394 + 534 @@ -48,7 +48,7 @@ - + 0 0 @@ -191,36 +191,110 @@ 0 - + 0 - - + + + + + 0 + 0 + + - Allow editing + Users can view and download contents. + + + true - - + + - Qt::Horizontal + Qt::Vertical + + + QSizePolicy::Fixed - 40 - 20 + 20 + 6 - - + + - Show file listing + Upload only (File Drop) + + + + + 0 + 0 + + + + Receive files from others without revealing the contents of the folder. + + + true + + + + + + + Read only + + + + + + + Read && Write + + + + + + + + 0 + 0 + + + + Users can view, download, edit and upload contents. + + + true + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 6 + + + + @@ -287,7 +361,6 @@ nameLineEdit createShareButton linkShares - checkBox_editing checkBox_password lineEdit_password pushButton_setPassword diff --git a/src/gui/sharemanager.cpp b/src/gui/sharemanager.cpp index 9901b47cf..004f5d7c4 100644 --- a/src/gui/sharemanager.cpp +++ b/src/gui/sharemanager.cpp @@ -379,9 +379,9 @@ QSharedPointer ShareManager::parseLinkShare(const QJsonObject &data) // From ownCloud server version 8 on, a different share link scheme is used. url = QUrl(Utility::concatUrlPath(_account->url(), QLatin1String("index.php/s/") + data.value("token").toString())).toString(); } else { - QList> queryArgs; - queryArgs.append(qMakePair(QString("service"), QString("files"))); - queryArgs.append(qMakePair(QString("t"), data.value("token").toString())); + QUrlQuery queryArgs; + queryArgs.addQueryItem(QLatin1String("service"), QLatin1String("files")); + queryArgs.addQueryItem(QLatin1String("t"), data.value("token").toString()); url = QUrl(Utility::concatUrlPath(_account->url(), QLatin1String("public.php"), queryArgs).toString()); } diff --git a/src/gui/shareusergroupwidget.cpp b/src/gui/shareusergroupwidget.cpp index 848ecfbfb..1bbaf2c69 100644 --- a/src/gui/shareusergroupwidget.cpp +++ b/src/gui/shareusergroupwidget.cpp @@ -41,6 +41,9 @@ #include #include #include +#include +#include +#include namespace OCC { @@ -178,31 +181,34 @@ void ShareUserGroupWidget::slotSharesFetched(const QList> auto newViewPort = new QWidget(scrollArea); auto layout = new QVBoxLayout(newViewPort); + layout->setMargin(0); + layout->setSpacing(0); QSize minimumSize = newViewPort->sizeHint(); int x = 0; - if (shares.isEmpty()) { + foreach (const auto &share, shares) { + // We don't handle link shares + if (share->getShareType() == Share::TypeLink) { + continue; + } + + ShareUserLine *s = new ShareUserLine(share, _maxSharingPermissions, _isFile, _ui->scrollArea); + connect(s, &ShareUserLine::resizeRequested, this, &ShareUserGroupWidget::slotAdjustScrollWidgetSize); + connect(s, &ShareUserLine::visualDeletionDone, this, &ShareUserGroupWidget::getShares); + s->setBackgroundRole(layout->count() % 2 == 0 ? QPalette::Base : QPalette::AlternateBase); + layout->addWidget(s); + + x++; + if (x <= 3) { + minimumSize = newViewPort->sizeHint(); + } else { + minimumSize.rwidth() = qMax(newViewPort->sizeHint().width(), minimumSize.width()); + } + } + if (layout->isEmpty()) { layout->addWidget(new QLabel(tr("The item is not shared with any users or groups"))); } else { - foreach (const auto &share, shares) { - // We don't handle link shares - if (share->getShareType() == Share::TypeLink) { - continue; - } - - ShareUserLine *s = new ShareUserLine(share, _maxSharingPermissions, _isFile, _ui->scrollArea); - connect(s, &ShareUserLine::resizeRequested, this, &ShareUserGroupWidget::slotAdjustScrollWidgetSize); - connect(s, &ShareUserLine::visualDeletionDone, this, &ShareUserGroupWidget::getShares); - layout->addWidget(s); - - x++; - if (x <= 3) { - minimumSize = newViewPort->sizeHint(); - } else { - minimumSize.rwidth() = qMax(newViewPort->sizeHint().width(), minimumSize.width()); - } - } layout->addStretch(1); } @@ -416,6 +422,65 @@ ShareUserLine::ShareUserLine(QSharedPointer share, if (!share->account()->capabilities().shareResharing()) { _ui->permissionShare->hide(); } + + loadAvatar(); +} + +void ShareUserLine::loadAvatar() +{ + const int avatarSize = 36; + + // Set size of the placeholder + _ui->avatar->setMinimumHeight(avatarSize); + _ui->avatar->setMinimumWidth(avatarSize); + _ui->avatar->setMaximumHeight(avatarSize); + _ui->avatar->setMaximumWidth(avatarSize); + _ui->avatar->setAlignment(Qt::AlignCenter); + + /* Create the fallback avatar. + * + * This will be shown until the avatar image data arrives. + */ + const QByteArray hash = QCryptographicHash::hash(_ui->sharedWith->text().toUtf8(), QCryptographicHash::Md5); + double hue = static_cast(hash[0]) / 255.; + + // See core/js/placeholder.js for details on colors and styling + const QColor bg = QColor::fromHslF(hue, 0.7, 0.68); + const QString style = QString(R"(* { + color: #fff; + background-color: %1; + border-radius: %2px; + text-align: center; + line-height: %2px; + font-size: %2px; + })").arg(bg.name(), QString::number(avatarSize / 2)); + _ui->avatar->setStyleSheet(style); + + // The avatar label is the first character of the user name. + const QString text = _share->getShareWith()->displayName(); + _ui->avatar->setText(text.at(0).toUpper()); + + /* Start the network job to fetch the avatar data. + * + * Currently only regular users can have avatars. + */ + if (_share->getShareWith()->type() == Sharee::User) { + AvatarJob *job = new AvatarJob(_share->account(), _share->getShareWith()->shareWith(), avatarSize, this); + connect(job, &AvatarJob::avatarPixmap, this, &ShareUserLine::slotAvatarLoaded); + job->start(); + } +} + +void ShareUserLine::slotAvatarLoaded(QImage avatar) +{ + if (avatar.isNull()) + return; + + avatar = AvatarJob::makeCircularAvatar(avatar); + _ui->avatar->setPixmap(QPixmap::fromImage(avatar)); + + // Remove the stylesheet for the fallback avatar + _ui->avatar->setStyleSheet(""); } void ShareUserLine::on_deleteShareButton_clicked() diff --git a/src/gui/shareusergroupwidget.h b/src/gui/shareusergroupwidget.h index 1feca5f26..e891359b9 100644 --- a/src/gui/shareusergroupwidget.h +++ b/src/gui/shareusergroupwidget.h @@ -131,8 +131,11 @@ private slots: void slotShareDeleted(); void slotPermissionsSet(); + void slotAvatarLoaded(QImage avatar); + private: void displayPermissions(); + void loadAvatar(); Ui::ShareUserLine *_ui; QSharedPointer _share; diff --git a/src/gui/shareuserline.ui b/src/gui/shareuserline.ui index b95dbbcaf..62288a89d 100644 --- a/src/gui/shareuserline.ui +++ b/src/gui/shareuserline.ui @@ -10,27 +10,25 @@ 0 0 468 - 64 + 46 Form + + true + - - 0 - - - 0 - - - 0 - - - 0 - + + + + TextLabel + + + @@ -55,36 +53,24 @@ - - - QFrame::StyledPanel + + + can share - - QFrame::Raised + + + + + + can edit + + + + + + + ... - - - - - can edit - - - - - - - can share - - - - - - - ... - - - - diff --git a/src/gui/socketapi.cpp b/src/gui/socketapi.cpp index f3af5b94f..0cdc9f0de 100644 --- a/src/gui/socketapi.cpp +++ b/src/gui/socketapi.cpp @@ -65,7 +65,7 @@ static inline QString removeTrailingSlash(QString path) return path; } -static QString buildMessage(const QString &verb, const QString &path, const QString &status = QString::null) +static QString buildMessage(const QString &verb, const QString &path, const QString &status = QString()) { QString msg(verb); @@ -270,7 +270,7 @@ void SocketApi::slotReadSocket() QString line = QString::fromUtf8(socket->readLine()).normalized(QString::NormalizationForm_C); line.chop(1); // remove the '\n' qCInfo(lcSocketApi) << "Received SocketAPI message <--" << line << "from" << socket; - QByteArray command = line.split(":").value(0).toAscii(); + QByteArray command = line.split(":").value(0).toLatin1(); QByteArray functionWithArguments = "command_" + command + "(QString,SocketListener*)"; int indexOfMethod = staticMetaObject.indexOfMethod(functionWithArguments); @@ -307,7 +307,7 @@ void SocketApi::slotUnregisterPath(const QString &alias) Folder *f = FolderMan::instance()->folder(alias); if (f) - broadcastMessage(buildMessage(QLatin1String("UNREGISTER_PATH"), removeTrailingSlash(f->path()), QString::null), true); + broadcastMessage(buildMessage(QLatin1String("UNREGISTER_PATH"), removeTrailingSlash(f->path()), QString()), true); _registeredAliases.remove(alias); } @@ -492,7 +492,7 @@ void SocketApi::command_SHARE_MENU_TITLE(const QString &, SocketListener *listen } // Fetches the private link url asynchronously and then calls the target slot -void fetchPrivateLinkUrl(const QString &localFile, SocketApi *target, void (SocketApi::*targetFun)(const QString &url) const) +static void fetchPrivateLinkUrlHelper(const QString &localFile, SocketApi *target, void (SocketApi::*targetFun)(const QString &url) const) { Folder *shareFolder = FolderMan::instance()->folderForPath(localFile); if (!shareFolder) { @@ -505,45 +505,23 @@ void fetchPrivateLinkUrl(const QString &localFile, SocketApi *target, void (Sock AccountPtr account = shareFolder->accountState()->account(); - // Generate private link ourselves: used as a fallback SyncJournalFileRecord rec; if (!shareFolder->journalDb()->getFileRecord(file, &rec) || !rec.isValid()) return; - const QString oldUrl = - account->deprecatedPrivateLinkUrl(rec.numericFileId()).toString(QUrl::FullyEncoded); - // Retrieve the new link or numeric file id by PROPFIND - PropfindJob *job = new PropfindJob(account, file, target); - job->setProperties( - QList() - << "http://owncloud.org/ns:fileid" // numeric file id for fallback private link generation - << "http://owncloud.org/ns:privatelink"); - job->setTimeout(10 * 1000); - QObject::connect(job, &PropfindJob::result, target, [=](const QVariantMap &result) { - auto privateLinkUrl = result["privatelink"].toString(); - auto numericFileId = result["fileid"].toByteArray(); - if (!privateLinkUrl.isEmpty()) { - (target->*targetFun)(privateLinkUrl); - } else if (!numericFileId.isEmpty()) { - (target->*targetFun)(account->deprecatedPrivateLinkUrl(numericFileId).toString(QUrl::FullyEncoded)); - } else { - (target->*targetFun)(oldUrl); - } + fetchPrivateLinkUrl(account, file, rec.numericFileId(), target, [=](const QString &url) { + (target->*targetFun)(url); }); - QObject::connect(job, &PropfindJob::finishedWithError, target, [=](QNetworkReply *) { - (target->*targetFun)(oldUrl); - }); - job->start(); } void SocketApi::command_COPY_PRIVATE_LINK(const QString &localFile, SocketListener *) { - fetchPrivateLinkUrl(localFile, this, &SocketApi::copyPrivateLinkToClipboard); + fetchPrivateLinkUrlHelper(localFile, this, &SocketApi::copyPrivateLinkToClipboard); } void SocketApi::command_EMAIL_PRIVATE_LINK(const QString &localFile, SocketListener *) { - fetchPrivateLinkUrl(localFile, this, &SocketApi::emailPrivateLink); + fetchPrivateLinkUrlHelper(localFile, this, &SocketApi::emailPrivateLink); } void SocketApi::copyPrivateLinkToClipboard(const QString &link) const diff --git a/src/gui/sslbutton.cpp b/src/gui/sslbutton.cpp index b1a16317c..e387f885e 100644 --- a/src/gui/sslbutton.cpp +++ b/src/gui/sslbutton.cpp @@ -39,21 +39,6 @@ SslButton::SslButton(QWidget *parent) this, &SslButton::slotUpdateMenu); } -QString SslButton::protoToString(QSsl::SslProtocol proto) -{ - switch (proto) { - break; - case QSsl::SslV2: - return QLatin1String("SSL v2"); - case QSsl::SslV3: - return QLatin1String("SSL v3"); - case QSsl::TlsV1: - return QLatin1String("TLS"); - default: - return QString(); - } -} - static QString addCertDetailsField(const QString &key, const QString &value) { if (value.isEmpty()) @@ -92,7 +77,7 @@ QMenu *SslButton::buildCertMenu(QMenu *parent, const QSslCertificate &cert, QString serial = QString::fromUtf8(cert.serialNumber()); QString effectiveDate = cert.effectiveDate().date().toString(); QString expiryDate = cert.expiryDate().date().toString(); - QString sna = QStringList(cert.alternateSubjectNames().values()).join(" "); + QString sna = QStringList(cert.subjectAlternativeNames().values()).join(" "); QString details; QTextStream stream(&details); @@ -144,7 +129,7 @@ QMenu *SslButton::buildCertMenu(QMenu *parent, const QSslCertificate &cert, QString certId = cn.isEmpty() ? ou : cn; - if (QSslSocket::systemCaCertificates().contains(cert)) { + if (QSslConfiguration::systemCaCertificates().contains(cert)) { txt += certId; } else { if (isSelfSigned(cert)) { @@ -224,16 +209,18 @@ void SslButton::slotUpdateMenu() _menu->addAction(tr("Certificate information:"))->setEnabled(false); + const auto systemCerts = QSslConfiguration::systemCaCertificates(); + QList tmpChain; foreach (QSslCertificate cert, chain) { tmpChain << cert; - if (QSslSocket::systemCaCertificates().contains(cert)) + if (systemCerts.contains(cert)) break; } chain = tmpChain; // find trust anchor (informational only, verification is done by QSslSocket!) - foreach (QSslCertificate rootCA, QSslSocket::systemCaCertificates()) { + for (const QSslCertificate &rootCA : systemCerts) { if (rootCA.issuerInfo(QSslCertificate::CommonName) == chain.last().issuerInfo(QSslCertificate::CommonName) && rootCA.issuerInfo(QSslCertificate::Organization) == chain.last().issuerInfo(QSslCertificate::Organization)) { chain.append(rootCA); diff --git a/src/gui/sslbutton.h b/src/gui/sslbutton.h index ffdafe52b..c48f7c3a7 100644 --- a/src/gui/sslbutton.h +++ b/src/gui/sslbutton.h @@ -36,7 +36,6 @@ class SslButton : public QToolButton Q_OBJECT public: explicit SslButton(QWidget *parent = 0); - QString protoToString(QSsl::SslProtocol proto); void updateAccountState(AccountState *accountState); public slots: diff --git a/src/gui/syncrunfilelog.cpp b/src/gui/syncrunfilelog.cpp index 9d4a06d7f..73f801b5d 100644 --- a/src/gui/syncrunfilelog.cpp +++ b/src/gui/syncrunfilelog.cpp @@ -136,7 +136,7 @@ void SyncRunFileLog::logItem(const SyncFileItem &item) if (item._direction == SyncFileItem::None) { return; } - QString ts = QString::fromAscii(item._responseTimeStamp); + QString ts = QString::fromLatin1(item._responseTimeStamp); if (ts.length() > 6) { QRegExp rx("(\\d\\d:\\d\\d:\\d\\d)"); if (ts.contains(rx)) { diff --git a/src/gui/updater/updater.cpp b/src/gui/updater/updater.cpp index 940f2026b..6249ebc3e 100644 --- a/src/gui/updater/updater.cpp +++ b/src/gui/updater/updater.cpp @@ -41,7 +41,7 @@ Updater *Updater::instance() QUrl Updater::addQueryParams(const QUrl &url) { - QUrl paramUrl = url; + QUrlQuery query; Theme *theme = Theme::instance(); QString platform = QLatin1String("stranger"); if (Utility::isLinux()) { @@ -56,23 +56,25 @@ QUrl Updater::addQueryParams(const QUrl &url) QString sysInfo = getSystemInfo(); if (!sysInfo.isEmpty()) { - paramUrl.addQueryItem(QLatin1String("client"), sysInfo); + query.addQueryItem(QLatin1String("client"), sysInfo); } - paramUrl.addQueryItem(QLatin1String("version"), clientVersion()); - paramUrl.addQueryItem(QLatin1String("platform"), platform); - paramUrl.addQueryItem(QLatin1String("oem"), theme->appName()); + query.addQueryItem(QLatin1String("version"), clientVersion()); + query.addQueryItem(QLatin1String("platform"), platform); + query.addQueryItem(QLatin1String("oem"), theme->appName()); QString suffix = QString::fromLatin1(MIRALL_STRINGIFY(MIRALL_VERSION_SUFFIX)); - paramUrl.addQueryItem(QLatin1String("versionsuffix"), suffix); + query.addQueryItem(QLatin1String("versionsuffix"), suffix); if (suffix.startsWith("nightly") || suffix.startsWith("alpha") || suffix.startsWith("rc") || suffix.startsWith("beta")) { - paramUrl.addQueryItem(QLatin1String("channel"), "beta"); + query.addQueryItem(QLatin1String("channel"), "beta"); // FIXME: Provide a checkbox in UI to enable regular versions to switch // to beta channel } + QUrl paramUrl = url; + paramUrl.setQuery(query); return paramUrl; } @@ -90,7 +92,7 @@ QString Updater::getSystemInfo() return QString::fromLocal8Bit(output.toBase64()); #else - return QString::null; + return QString(); #endif } diff --git a/src/gui/wizard/owncloudadvancedsetuppage.cpp b/src/gui/wizard/owncloudadvancedsetuppage.cpp index a181faac0..9257918dd 100644 --- a/src/gui/wizard/owncloudadvancedsetuppage.cpp +++ b/src/gui/wizard/owncloudadvancedsetuppage.cpp @@ -230,7 +230,7 @@ bool OwncloudAdvancedSetupPage::isConfirmBigFolderChecked() const bool OwncloudAdvancedSetupPage::validatePage() { if (!_created) { - setErrorString(QString::null); + setErrorString(QString()); _checking = true; startSpinner(); emit completeChanged(); diff --git a/src/gui/wizard/owncloudoauthcredspage.ui b/src/gui/wizard/owncloudoauthcredspage.ui index 7b20b6cc4..285ef3a2b 100644 --- a/src/gui/wizard/owncloudoauthcredspage.ui +++ b/src/gui/wizard/owncloudoauthcredspage.ui @@ -43,7 +43,7 @@ - An error occured while connecting. Please try again. + An error occurred while connecting. Please try again. Qt::PlainText diff --git a/src/gui/wizard/owncloudsetuppage.cpp b/src/gui/wizard/owncloudsetuppage.cpp index c68130d94..90c9a6c67 100644 --- a/src/gui/wizard/owncloudsetuppage.cpp +++ b/src/gui/wizard/owncloudsetuppage.cpp @@ -221,7 +221,7 @@ QString OwncloudSetupPage::url() const bool OwncloudSetupPage::validatePage() { if (!_authTypeKnown) { - setErrorString(QString::null, false); + setErrorString(QString(), false); _checking = true; startSpinner(); emit completeChanged(); diff --git a/src/gui/wizard/owncloudwizard.cpp b/src/gui/wizard/owncloudwizard.cpp index f1397c9b5..991b5fc18 100644 --- a/src/gui/wizard/owncloudwizard.cpp +++ b/src/gui/wizard/owncloudwizard.cpp @@ -195,7 +195,7 @@ void OwncloudWizard::slotCurrentPageChanged(int id) if (id == WizardCommon::Page_Result) { disconnect(this, &QDialog::finished, this, &OwncloudWizard::basicSetupFinished); emit basicSetupFinished(QDialog::Accepted); - appendToConfigurationLog(QString::null); + appendToConfigurationLog(QString()); // Immediately close on show, we currently don't want this page anymore done(Accepted); } diff --git a/src/gui/wizard/owncloudwizardresultpage.cpp b/src/gui/wizard/owncloudwizardresultpage.cpp index 71764e35c..6d884e396 100644 --- a/src/gui/wizard/owncloudwizardresultpage.cpp +++ b/src/gui/wizard/owncloudwizardresultpage.cpp @@ -70,7 +70,7 @@ bool OwncloudWizardResultPage::isComplete() const void OwncloudWizardResultPage::initializePage() { - _ui.localFolderLabel->setText(QString::null); + _ui.localFolderLabel->setText(QString()); } void OwncloudWizardResultPage::setRemoteFolder(const QString &remoteFolder) @@ -81,7 +81,7 @@ void OwncloudWizardResultPage::setRemoteFolder(const QString &remoteFolder) void OwncloudWizardResultPage::setupCustomization() { // set defaults for the customize labels. - _ui.topLabel->setText(QString::null); + _ui.topLabel->setText(QString()); _ui.topLabel->hide(); QVariant variant = Theme::instance()->customMedia(Theme::oCSetupResultTop); diff --git a/src/libsync/CMakeLists.txt b/src/libsync/CMakeLists.txt index dcc445492..390723044 100644 --- a/src/libsync/CMakeLists.txt +++ b/src/libsync/CMakeLists.txt @@ -56,7 +56,6 @@ set(libsync_SRCS syncfilestatustracker.cpp syncresult.cpp theme.cpp - excludedfiles.cpp creds/dummycredentials.cpp creds/abstractcredentials.cpp creds/credentialscommon.cpp diff --git a/src/libsync/abstractnetworkjob.cpp b/src/libsync/abstractnetworkjob.cpp index 78d5b9ab6..f3fb71670 100644 --- a/src/libsync/abstractnetworkjob.cpp +++ b/src/libsync/abstractnetworkjob.cpp @@ -40,6 +40,9 @@ namespace OCC { Q_LOGGING_CATEGORY(lcNetworkJob, "sync.networkjob", QtInfoMsg) +// If not set, it is overwritten by the Application constructor with the value from the config +int AbstractNetworkJob::httpTimeout = qEnvironmentVariableIntValue("OWNCLOUD_TIMEOUT"); + AbstractNetworkJob::AbstractNetworkJob(AccountPtr account, const QString &path, QObject *parent) : QObject(parent) , _timedout(false) @@ -51,7 +54,7 @@ AbstractNetworkJob::AbstractNetworkJob(AccountPtr account, const QString &path, , _redirectCount(0) { _timer.setSingleShot(true); - _timer.setInterval(OwncloudPropagator::httpTimeout() * 1000); // default to 5 minutes. + _timer.setInterval((httpTimeout ? httpTimeout : 300) * 1000); // default to 5 minutes. connect(&_timer, &QTimer::timeout, this, &AbstractNetworkJob::slotTimeout); connect(this, &AbstractNetworkJob::networkActivity, this, &AbstractNetworkJob::resetTimeout); @@ -326,7 +329,7 @@ QString extractErrorMessage(const QByteArray &errorResponse) QXmlStreamReader reader(errorResponse); reader.readNextStartElement(); if (reader.name() != "error") { - return QString::null; + return QString(); } QString exception; diff --git a/src/libsync/abstractnetworkjob.h b/src/libsync/abstractnetworkjob.h index ec9a31add..b49f72282 100644 --- a/src/libsync/abstractnetworkjob.h +++ b/src/libsync/abstractnetworkjob.h @@ -88,6 +88,10 @@ public: */ QString errorStringParsingBody(QByteArray *body = 0); + /** static variable the HTTP timeout (in seconds). If set to 0, the default will be used + */ + static int httpTimeout; + public slots: void setTimeout(qint64 msec); void resetTimeout(); diff --git a/src/libsync/account.cpp b/src/libsync/account.cpp index 8d54675e7..7907ea530 100644 --- a/src/libsync/account.cpp +++ b/src/libsync/account.cpp @@ -15,7 +15,6 @@ #include "account.h" #include "cookiejar.h" #include "networkjobs.h" -#include "configfile.h" #include "accessmanager.h" #include "creds/abstractcredentials.h" #include "capabilities.h" @@ -33,6 +32,7 @@ #include #include #include +#include namespace OCC { @@ -93,6 +93,7 @@ void Account::setDavUser(const QString &newDavUser) _davUser = newDavUser; } +#ifndef TOKEN_AUTH_ONLY QImage Account::avatar() const { return _avatarImg; @@ -102,6 +103,7 @@ void Account::setAvatar(const QImage &img) _avatarImg = img; emit accountChangedAvatar(); } +#endif QString Account::displayName() const { @@ -204,8 +206,7 @@ void Account::lendCookieJarTo(QNetworkAccessManager *guest) QString Account::cookieJarPath() { - ConfigFile cfg; - return cfg.configPath() + "/cookies" + id() + ".db"; + return QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/cookies" + id() + ".db"; } void Account::resetNetworkAccessManager() diff --git a/src/libsync/account.h b/src/libsync/account.h index 326656d25..025dca907 100644 --- a/src/libsync/account.h +++ b/src/libsync/account.h @@ -26,7 +26,10 @@ #include #include #include + +#ifndef TOKEN_AUTH_ONLY #include +#endif #include "common/utility.h" #include @@ -86,8 +89,10 @@ public: QString davDisplayName() const; void setDavDisplayName(const QString &newDisplayName); +#ifndef TOKEN_AUTH_ONLY QImage avatar() const; void setAvatar(const QImage &img); +#endif /// The name of the account as shown in the toolbar QString displayName() const; @@ -266,7 +271,9 @@ private: QString _id; QString _davUser; QString _displayName; +#ifndef TOKEN_AUTH_ONLY QImage _avatarImg; +#endif QMap _settingsMap; QUrl _url; diff --git a/src/libsync/capabilities.cpp b/src/libsync/capabilities.cpp index fcf71b7e9..333410373 100644 --- a/src/libsync/capabilities.cpp +++ b/src/libsync/capabilities.cpp @@ -14,8 +14,6 @@ #include "capabilities.h" -#include "configfile.h" - #include namespace OCC { diff --git a/src/libsync/configfile.cpp b/src/libsync/configfile.cpp index 6cb320a52..8aff35b3b 100644 --- a/src/libsync/configfile.cpp +++ b/src/libsync/configfile.cpp @@ -21,10 +21,11 @@ #include "creds/abstractcredentials.h" +#include "csync_exclude.h" + #ifndef TOKEN_AUTH_ONLY #include #include -#include #endif #include @@ -34,6 +35,7 @@ #include #include #include +#include #define DEFAULT_REMOTE_POLL_INTERVAL 30000 // default remote poll time in milliseconds #define DEFAULT_FULL_LOCAL_DISCOVERY_INTERVAL (60 * 60 * 1000) // 1 hour @@ -82,7 +84,7 @@ static const char maxLogLinesC[] = "Logging/maxLogLines"; const char certPath[] = "http_certificatePath"; const char certPasswd[] = "http_certificatePasswd"; -QString ConfigFile::_confDir = QString::null; +QString ConfigFile::_confDir = QString(); bool ConfigFile::_askedUser = false; ConfigFile::ConfigFile() @@ -250,13 +252,11 @@ QVariant ConfigFile::getPolicySetting(const QString &setting, const QVariant &de QString ConfigFile::configPath() const { -#ifndef TOKEN_AUTH_ONLY if (_confDir.isEmpty()) { - // Qt 5's QStandardPaths::writableLocation gives us wrong results (without /data/), - // so we'll have to use the deprecated version for now - _confDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation); + // On Unix, use the AppConfigLocation for the settings, that's configurable with the XDG_CONFIG_HOME env variable. + // On Windows, use AppDataLocation, that's where the roaming data is and where we should store the config file + _confDir = QStandardPaths::writableLocation(Utility::isWindows() ? QStandardPaths::AppDataLocation : QStandardPaths::AppConfigLocation); } -#endif QString dir = _confDir; if (!dir.endsWith(QLatin1Char('/'))) @@ -264,12 +264,6 @@ QString ConfigFile::configPath() const return dir; } -QString ConfigFile::configPathWithAppName() const -{ - //HACK - return QFileInfo(configFile()).dir().absolutePath().append("/"); -} - static const QLatin1String exclFile("sync-exclude.lst"); QString ConfigFile::excludeFile(Scope scope) const @@ -607,12 +601,12 @@ QString ConfigFile::proxyPassword() const int ConfigFile::useUploadLimit() const { - return getValue(useUploadLimitC, QString::null, 0).toInt(); + return getValue(useUploadLimitC, QString(), 0).toInt(); } int ConfigFile::useDownloadLimit() const { - return getValue(useDownloadLimitC, QString::null, 0).toInt(); + return getValue(useDownloadLimitC, QString(), 0).toInt(); } void ConfigFile::setUseUploadLimit(int val) @@ -627,12 +621,12 @@ void ConfigFile::setUseDownloadLimit(int val) int ConfigFile::uploadLimit() const { - return getValue(uploadLimitC, QString::null, 10).toInt(); + return getValue(uploadLimitC, QString(), 10).toInt(); } int ConfigFile::downloadLimit() const { - return getValue(downloadLimitC, QString::null, 80).toInt(); + return getValue(downloadLimitC, QString(), 80).toInt(); } void ConfigFile::setUploadLimit(int kbytes) @@ -748,4 +742,17 @@ std::unique_ptr ConfigFile::settingsWithGroup(const QString &group, Q return settings; } +void ConfigFile::setupDefaultExcludeFilePaths(ExcludedFiles &excludedFiles) +{ + ConfigFile cfg; + QString systemList = cfg.excludeFile(ConfigFile::SystemScope); + qCInfo(lcConfigFile) << "Adding system ignore list to csync:" << systemList; + excludedFiles.addExcludeFilePath(systemList); + + QString userList = cfg.excludeFile(ConfigFile::UserScope); + if (QFile::exists(userList)) { + qCInfo(lcConfigFile) << "Adding user defined ignore list to csync:" << userList; + excludedFiles.addExcludeFilePath(userList); + } +} } diff --git a/src/libsync/configfile.h b/src/libsync/configfile.h index 27c015e8f..c4c66ac1a 100644 --- a/src/libsync/configfile.h +++ b/src/libsync/configfile.h @@ -24,6 +24,7 @@ class QWidget; class QHeaderView; +class ExcludedFiles; namespace OCC { @@ -42,7 +43,6 @@ public: SystemScope }; QString configPath() const; - QString configPathWithAppName() const; QString configFile() const; QString excludeFile(Scope scope) const; static QString excludeFileFromSystem(); // doesn't access config dir @@ -55,7 +55,7 @@ public: QByteArray caCerts(); void setCaCerts(const QByteArray &); - bool passwordStorageAllowed(const QString &connection = QString::null); + bool passwordStorageAllowed(const QString &connection = QString()); // max count of lines in the log window int maxLogLines() const; @@ -153,6 +153,9 @@ public: with the given parent. If no parent is specified, the caller must destroy the settings */ static std::unique_ptr settingsWithGroup(const QString &group, QObject *parent = 0); + /// Add the system and user exclude file path to the ExcludedFiles instance. + static void setupDefaultExcludeFilePaths(ExcludedFiles &excludedFiles); + protected: QVariant getPolicySetting(const QString &policy, const QVariant &defaultValue = QVariant()) const; void storeData(const QString &group, const QString &key, const QVariant &value); @@ -161,7 +164,7 @@ protected: bool dataExists(const QString &group, const QString &key) const; private: - QVariant getValue(const QString ¶m, const QString &group = QString::null, + QVariant getValue(const QString ¶m, const QString &group = QString(), const QVariant &defaultValue = QVariant()) const; void setValue(const QString &key, const QVariant &value); diff --git a/src/libsync/connectionvalidator.cpp b/src/libsync/connectionvalidator.cpp index de39c1973..cf5dd865d 100644 --- a/src/libsync/connectionvalidator.cpp +++ b/src/libsync/connectionvalidator.cpp @@ -17,7 +17,6 @@ #include #include #include -#include #include #include "connectionvalidator.h" @@ -333,24 +332,28 @@ void ConnectionValidator::slotUserFetched(const QJsonDocument &json) QString user = json.object().value("ocs").toObject().value("data").toObject().value("id").toString(); if (!user.isEmpty()) { _account->setDavUser(user); - - AvatarJob *job = new AvatarJob(_account, this); - job->setTimeout(20 * 1000); - QObject::connect(job, &AvatarJob::avatarPixmap, this, &ConnectionValidator::slotAvatarImage); - - job->start(); } QString displayName = json.object().value("ocs").toObject().value("data").toObject().value("display-name").toString(); if (!displayName.isEmpty()) { _account->setDavDisplayName(displayName); } +#ifndef TOKEN_AUTH_ONLY + AvatarJob *job = new AvatarJob(_account, _account->davUser(), 128, this); + job->setTimeout(20 * 1000); + QObject::connect(job, &AvatarJob::avatarPixmap, this, &ConnectionValidator::slotAvatarImage); + job->start(); +#else + reportResult(Connected); +#endif } +#ifndef TOKEN_AUTH_ONLY void ConnectionValidator::slotAvatarImage(const QImage &img) { _account->setAvatar(img); reportResult(Connected); } +#endif void ConnectionValidator::reportResult(Status status) { diff --git a/src/libsync/connectionvalidator.h b/src/libsync/connectionvalidator.h index 27f3bd7f4..017cd8c63 100644 --- a/src/libsync/connectionvalidator.h +++ b/src/libsync/connectionvalidator.h @@ -123,7 +123,9 @@ protected slots: void slotCapabilitiesRecieved(const QJsonDocument &); void slotUserFetched(const QJsonDocument &); +#ifndef TOKEN_AUTH_ONLY void slotAvatarImage(const QImage &img); +#endif private: void reportResult(Status status); diff --git a/src/libsync/creds/abstractcredentials.cpp b/src/libsync/creds/abstractcredentials.cpp index e800ca577..8b6ee3104 100644 --- a/src/libsync/creds/abstractcredentials.cpp +++ b/src/libsync/creds/abstractcredentials.cpp @@ -40,11 +40,11 @@ QString AbstractCredentials::keychainKey(const QString &url, const QString &user QString u(url); if (u.isEmpty()) { qCWarning(lcCredentials) << "Empty url in keyChain, error!"; - return QString::null; + return QString(); } if (user.isEmpty()) { qCWarning(lcCredentials) << "Error: User is empty!"; - return QString::null; + return QString(); } if (!u.endsWith(QChar('/'))) { diff --git a/src/libsync/creds/tokencredentials.cpp b/src/libsync/creds/tokencredentials.cpp index c7e43bf8c..9f857ade5 100644 --- a/src/libsync/creds/tokencredentials.cpp +++ b/src/libsync/creds/tokencredentials.cpp @@ -102,7 +102,7 @@ QString TokenCredentials::password() const return _password; } -QNetworkAccessManager *TokenCredentials::getQNAM() const +QNetworkAccessManager *TokenCredentials::createQNAM() const { AccessManager *qnam = new TokenCredentialsAccessManager(this); diff --git a/src/libsync/creds/tokencredentials.h b/src/libsync/creds/tokencredentials.h index e170ea9db..996b0618b 100644 --- a/src/libsync/creds/tokencredentials.h +++ b/src/libsync/creds/tokencredentials.h @@ -40,7 +40,7 @@ public: TokenCredentials(const QString &user, const QString &password, const QString &token); QString authType() const Q_DECL_OVERRIDE; - QNetworkAccessManager *getQNAM() const Q_DECL_OVERRIDE; + QNetworkAccessManager *createQNAM() const Q_DECL_OVERRIDE; bool ready() const Q_DECL_OVERRIDE; void askFromUser() Q_DECL_OVERRIDE; void fetchFromKeychain() Q_DECL_OVERRIDE; diff --git a/src/libsync/discoveryphase.cpp b/src/libsync/discoveryphase.cpp index 8f99bc66f..4657e0488 100644 --- a/src/libsync/discoveryphase.cpp +++ b/src/libsync/discoveryphase.cpp @@ -75,7 +75,7 @@ bool DiscoveryJob::isInSelectiveSyncBlackList(const QByteArray &path) const // Also try to adjust the path if there was renames if (csync_rename_count(_csync_ctx)) { - QByteArray adjusted = csync_rename_adjust_path_source(_csync_ctx, path); + QByteArray adjusted = csync_rename_adjust_parent_path_source(_csync_ctx, path); if (adjusted != path) { return findPathInList(_selectiveSyncBlackList, QString::fromUtf8(adjusted)); } @@ -698,8 +698,6 @@ void DiscoveryJob::start() _csync_ctx->callbacks.remote_closedir_hook = remote_vio_closedir_hook; _csync_ctx->callbacks.vio_userdata = this; - csync_exclude_traversal_prepare(_csync_ctx); // Converts the flat exclude list to optimized regexps - csync_set_log_callback(_log_callback); csync_set_log_level(_log_level); _lastUpdateProgressCallbackCall.invalidate(); diff --git a/src/libsync/discoveryphase.h b/src/libsync/discoveryphase.h index eea33ad52..222f4a999 100644 --- a/src/libsync/discoveryphase.h +++ b/src/libsync/discoveryphase.h @@ -24,6 +24,7 @@ #include #include #include +#include "syncoptions.h" namespace OCC { @@ -35,52 +36,6 @@ class Account; * if the files are new, or changed. */ -struct SyncOptions -{ - SyncOptions() - : _newBigFolderSizeLimit(-1) - , _confirmExternalStorage(false) - , _initialChunkSize(10 * 1000 * 1000) // 10 MB - , _minChunkSize(1 * 1000 * 1000) // 1 MB - , _maxChunkSize(100 * 1000 * 1000) // 100 MB - , _targetChunkUploadDuration(60 * 1000) // 1 minute - , _parallelNetworkJobs(true) - { - } - - /** Maximum size (in Bytes) a folder can have without asking for confirmation. - * -1 means infinite */ - qint64 _newBigFolderSizeLimit; - - /** If a confirmation should be asked for external storages */ - bool _confirmExternalStorage; - - /** The initial un-adjusted chunk size in bytes for chunked uploads, both - * for old and new chunking algorithm, which classifies the item to be chunked - * - * In chunkingNG, when dynamic chunk size adjustments are done, this is the - * starting value and is then gradually adjusted within the - * minChunkSize / maxChunkSize bounds. - */ - quint64 _initialChunkSize; - - /** The minimum chunk size in bytes for chunked uploads */ - quint64 _minChunkSize; - - /** The maximum chunk size in bytes for chunked uploads */ - quint64 _maxChunkSize; - - /** The target duration of chunk uploads for dynamic chunk sizing. - * - * Set to 0 it will disable dynamic chunk sizing. - */ - quint64 _targetChunkUploadDuration; - - /** Whether parallel network jobs are allowed. */ - bool _parallelNetworkJobs; -}; - - struct DiscoveryDirectoryResult { QString path; diff --git a/src/libsync/excludedfiles.cpp b/src/libsync/excludedfiles.cpp deleted file mode 100644 index 728cbb7fd..000000000 --- a/src/libsync/excludedfiles.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) by Christian Kamm - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - */ - -#include "config.h" -#include "excludedfiles.h" -#include "common/utility.h" - -#include - -#include "std/c_string.h" -#include "csync.h" -#include "csync_exclude.h" - -using namespace OCC; - -ExcludedFiles::ExcludedFiles(c_strlist_t **excludesPtr) - : _excludesPtr(excludesPtr) -{ -} - -ExcludedFiles::~ExcludedFiles() -{ - c_strlist_destroy(*_excludesPtr); -} - -ExcludedFiles &ExcludedFiles::instance() -{ - static c_strlist_t *globalExcludes; - static ExcludedFiles inst(&globalExcludes); - return inst; -} - -void ExcludedFiles::addExcludeFilePath(const QString &path) -{ - _excludeFiles.insert(path); -} - -#ifdef WITH_TESTING -void ExcludedFiles::addExcludeExpr(const QString &expr) -{ - _csync_exclude_add(_excludesPtr, expr.toLatin1().constData()); -} -#endif - -bool ExcludedFiles::reloadExcludes() -{ - c_strlist_destroy(*_excludesPtr); - *_excludesPtr = NULL; - - bool success = true; - foreach (const QString &file, _excludeFiles) { - if (csync_exclude_load(file.toUtf8(), _excludesPtr) < 0) - success = false; - } - // The csync_exclude_traversal_prepare is called implicitely at sync start. - return success; -} - -bool ExcludedFiles::isExcluded( - const QString &filePath, - const QString &basePath, - bool excludeHidden) const -{ - if (!filePath.startsWith(basePath, Utility::fsCasePreserving() ? Qt::CaseInsensitive : Qt::CaseSensitive)) { - // Mark paths we're not responsible for as excluded... - return true; - } - - if (excludeHidden) { - QString path = filePath; - // Check all path subcomponents, but to *not* check the base path: - // We do want to be able to sync with a hidden folder as the target. - while (path.size() > basePath.size()) { - QFileInfo fi(path); - if (fi.isHidden() || fi.fileName().startsWith(QLatin1Char('.'))) { - return true; - } - - // Get the parent path - path = fi.absolutePath(); - } - } - - QFileInfo fi(filePath); - csync_ftw_type_e type = CSYNC_FTW_TYPE_FILE; - if (fi.isDir()) { - type = CSYNC_FTW_TYPE_DIR; - } - - QString relativePath = filePath.mid(basePath.size()); - if (relativePath.endsWith(QLatin1Char('/'))) { - relativePath.chop(1); - } - - return csync_excluded_no_ctx(*_excludesPtr, relativePath.toUtf8(), type) != CSYNC_NOT_EXCLUDED; -} diff --git a/src/libsync/excludedfiles.h b/src/libsync/excludedfiles.h deleted file mode 100644 index d090f8aa6..000000000 --- a/src/libsync/excludedfiles.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) by Christian Kamm - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - */ - -#pragma once - -#include "owncloudlib.h" - -#include -#include -#include - -#include "std/c_string.h" -#include "csync.h" -#include "csync_exclude.h" // for CSYNC_EXCLUDE_TYPE - -namespace OCC { - -/** - * Manages the global system and user exclude lists. - */ -class OWNCLOUDSYNC_EXPORT ExcludedFiles : public QObject -{ - Q_OBJECT -public: - static ExcludedFiles &instance(); - - ExcludedFiles(c_strlist_t **excludesPtr); - ~ExcludedFiles(); - - /** - * Adds a new path to a file containing exclude patterns. - * - * Does not load the file. Use reloadExcludes() afterwards. - */ - void addExcludeFilePath(const QString &path); - - /** - * Checks whether a file or directory should be excluded. - * - * @param filePath the absolute path to the file - * @param basePath folder path from which to apply exclude rules - */ - bool isExcluded( - const QString &filePath, - const QString &basePath, - bool excludeHidden) const; - -#ifdef WITH_TESTING - void addExcludeExpr(const QString &expr); -#endif - -public slots: - /** - * Reloads the exclude patterns from the registered paths. - */ - bool reloadExcludes(); - -private: - // This is a pointer to the csync exclude list, its is owned by this class - // but the pointer can be in a csync_context so that it can itself also query the list. - c_strlist_t **_excludesPtr; - QSet _excludeFiles; -}; - -} // namespace OCC diff --git a/src/libsync/networkjobs.cpp b/src/libsync/networkjobs.cpp index f2a2ab540..1167cb8be 100644 --- a/src/libsync/networkjobs.cpp +++ b/src/libsync/networkjobs.cpp @@ -27,9 +27,9 @@ #include #include #include -#include #include #include +#include #include "networkjobs.h" #include "account.h" @@ -626,10 +626,11 @@ bool PropfindJob::finished() /*********************************************************************************************/ -AvatarJob::AvatarJob(AccountPtr account, QObject *parent) +#ifndef TOKEN_AUTH_ONLY +AvatarJob::AvatarJob(AccountPtr account, const QString &userId, int size, QObject *parent) : AbstractNetworkJob(account, QString(), parent) { - _avatarUrl = Utility::concatUrlPath(account->url(), QString("remote.php/dav/avatars/%1/128.png").arg(account->davUser())); + _avatarUrl = Utility::concatUrlPath(account->url(), QString("remote.php/dav/avatars/%1/%2.png").arg(userId, QString::number(size))); } void AvatarJob::start() @@ -639,6 +640,26 @@ void AvatarJob::start() AbstractNetworkJob::start(); } +QImage AvatarJob::makeCircularAvatar(const QImage &baseAvatar) +{ + int dim = baseAvatar.width(); + + QImage avatar(dim, dim, baseAvatar.format()); + avatar.fill(Qt::transparent); + + QPainter painter(&avatar); + painter.setRenderHint(QPainter::Antialiasing); + + QPainterPath path; + path.addEllipse(0, 0, dim, dim); + painter.setClipPath(path); + + painter.drawImage(0, 0, baseAvatar); + painter.end(); + + return avatar; +} + bool AvatarJob::finished() { int http_result_code = reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); @@ -656,6 +677,7 @@ bool AvatarJob::finished() emit(avatarPixmap(avImage)); return true; } +#endif /*********************************************************************************************/ @@ -758,7 +780,7 @@ JsonApiJob::JsonApiJob(const AccountPtr &account, const QString &path, QObject * { } -void JsonApiJob::addQueryParams(QList> params) +void JsonApiJob::addQueryParams(const QUrlQuery ¶ms) { _additionalParams = params; } @@ -767,10 +789,9 @@ void JsonApiJob::start() { QNetworkRequest req; req.setRawHeader("OCS-APIREQUEST", "true"); - QUrl url = Utility::concatUrlPath(account()->url(), path()); - QList> params = _additionalParams; - params << qMakePair(QString::fromLatin1("format"), QString::fromLatin1("json")); - url.setQueryItems(params); + auto query = _additionalParams; + query.addQueryItem(QLatin1String("format"), QLatin1String("json")); + QUrl url = Utility::concatUrlPath(account()->url(), path(), query); sendRequest("GET", url, req); AbstractNetworkJob::start(); } @@ -903,4 +924,36 @@ bool SimpleNetworkJob::finished() return true; } +void fetchPrivateLinkUrl(AccountPtr account, const QString &remotePath, + const QByteArray &numericFileId, QObject *target, + std::function targetFun) +{ + QString oldUrl; + if (!numericFileId.isEmpty()) + oldUrl = account->deprecatedPrivateLinkUrl(numericFileId).toString(QUrl::FullyEncoded); + + // Retrieve the new link by PROPFIND + PropfindJob *job = new PropfindJob(account, remotePath, target); + job->setProperties( + QList() + << "http://owncloud.org/ns:fileid" // numeric file id for fallback private link generation + << "http://owncloud.org/ns:privatelink"); + job->setTimeout(10 * 1000); + QObject::connect(job, &PropfindJob::result, target, [=](const QVariantMap &result) { + auto privateLinkUrl = result["privatelink"].toString(); + auto numericFileId = result["fileid"].toByteArray(); + if (!privateLinkUrl.isEmpty()) { + targetFun(privateLinkUrl); + } else if (!numericFileId.isEmpty()) { + targetFun(account->deprecatedPrivateLinkUrl(numericFileId).toString(QUrl::FullyEncoded)); + } else { + targetFun(oldUrl); + } + }); + QObject::connect(job, &PropfindJob::finishedWithError, target, [=](QNetworkReply *) { + targetFun(oldUrl); + }); + job->start(); +} + } // namespace OCC diff --git a/src/libsync/networkjobs.h b/src/libsync/networkjobs.h index 38cb9dc64..994f2046c 100644 --- a/src/libsync/networkjobs.h +++ b/src/libsync/networkjobs.h @@ -17,6 +17,8 @@ #define NETWORKJOBS_H #include "abstractnetworkjob.h" +#include +#include class QUrl; class QJsonObject; @@ -133,11 +135,9 @@ private: QList _properties; }; - +#ifndef TOKEN_AUTH_ONLY /** - * @brief The AvatarJob class - * - * Retrieves the account users avatar from the server using a GET request. + * @brief Retrieves the account users avatar from the server using a GET request. * * If the server does not have the avatar, the result Pixmap is empty. * @@ -147,15 +147,23 @@ class OWNCLOUDSYNC_EXPORT AvatarJob : public AbstractNetworkJob { Q_OBJECT public: - explicit AvatarJob(AccountPtr account, QObject *parent = 0); + /** + * @param userId The user for which to obtain the avatar + * @param size The size of the avatar (square so size*size) + */ + explicit AvatarJob(AccountPtr account, const QString &userId, int size, QObject *parent = 0); + void start() Q_DECL_OVERRIDE; + /** The retrieved avatar images don't have the circle shape by default */ + static QImage makeCircularAvatar(const QImage &baseAvatar); + signals: /** * @brief avatarPixmap - returns either a valid pixmap or not. */ - void avatarPixmap(QImage); + void avatarPixmap(const QImage &); private slots: virtual bool finished() Q_DECL_OVERRIDE; @@ -163,6 +171,7 @@ private slots: private: QUrl _avatarUrl; }; +#endif /** * @brief Send a Proppatch request @@ -331,7 +340,7 @@ public: * * This function needs to be called before start() obviously. */ - void addQueryParams(QList> params); + void addQueryParams(const QUrlQuery ¶ms); public slots: void start() Q_DECL_OVERRIDE; @@ -348,7 +357,7 @@ signals: void jsonReceived(const QJsonDocument &json, int statusCode); private: - QList> _additionalParams; + QUrlQuery _additionalParams; }; /** @@ -402,6 +411,23 @@ private slots: bool finished() Q_DECL_OVERRIDE; }; +/** + * @brief Runs a PROPFIND to figure out the private link url + * + * The numericFileId is used only to build the deprecatedPrivateLinkUrl + * locally as a fallback. If it's empty and the PROPFIND fails, targetFun + * will be called with an empty string. + * + * The job and signal connections are parented to the target QObject. + * + * Note: targetFun is guaranteed to be called only through the event + * loop and never directly. + */ +void OWNCLOUDSYNC_EXPORT fetchPrivateLinkUrl( + AccountPtr account, const QString &remotePath, + const QByteArray &numericFileId, QObject *target, + std::function targetFun); + } // namespace OCC #endif // NETWORKJOBS_H diff --git a/src/libsync/owncloudpropagator.cpp b/src/libsync/owncloudpropagator.cpp index d90ae8af7..e1d081141 100644 --- a/src/libsync/owncloudpropagator.cpp +++ b/src/libsync/owncloudpropagator.cpp @@ -22,7 +22,6 @@ #include "propagateremotemove.h" #include "propagateremotemkdir.h" #include "propagatorjobs.h" -#include "configfile.h" #include "common/utility.h" #include "account.h" #include "common/asserts.h" @@ -554,19 +553,6 @@ bool OwncloudPropagator::isInSharedDirectory(const QString &file) return re; } -int OwncloudPropagator::httpTimeout() -{ - static int timeout = 0; - if (!timeout) { - timeout = qgetenv("OWNCLOUD_TIMEOUT").toUInt(); - if (timeout == 0) { - ConfigFile cfg; - timeout = cfg.timeout(); - } - } - return timeout; -} - bool OwncloudPropagator::localFileNameClash(const QString &relFile) { bool re = false; diff --git a/src/libsync/owncloudpropagator.h b/src/libsync/owncloudpropagator.h index 9655e1ac4..062b3825e 100644 --- a/src/libsync/owncloudpropagator.h +++ b/src/libsync/owncloudpropagator.h @@ -30,7 +30,7 @@ #include "common/syncjournaldb.h" #include "bandwidthmanager.h" #include "accountfwd.h" -#include "discoveryphase.h" +#include "syncoptions.h" namespace OCC { @@ -464,9 +464,6 @@ public: } } - // timeout in seconds - static int httpTimeout(); - AccountPtr account() const; enum DiskSpaceResult { diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp index 52ee63f1c..6dc571c72 100644 --- a/src/libsync/syncengine.cpp +++ b/src/libsync/syncengine.cpp @@ -89,7 +89,9 @@ SyncEngine::SyncEngine(AccountPtr account, const QString &localPath, _csync_ctx.reset(new CSYNC(localPath.toUtf8().data(), journal)); - _excludedFiles.reset(new ExcludedFiles(&_csync_ctx->excludes)); + _excludedFiles.reset(new ExcludedFiles); + _csync_ctx->exclude_traversal_fn = _excludedFiles->csyncTraversalMatchFun(); + _syncFileStatusTracker.reset(new SyncFileStatusTracker(this)); _clearTouchedFilesTimer.setSingleShot(true); @@ -476,6 +478,9 @@ int SyncEngine::treewalkFile(csync_file_stat_t *file, csync_file_stat_t *other, case CSYNC_STATUS_INDIVIDUAL_TOO_DEEP: item->_errorString = tr("Folder hierarchy is too deep"); break; + case CSYNC_STATUS_INDIVIDUAL_CANNOT_ENCODE: + item->_errorString = tr("The filename cannot be encoded on your file system."); + break; case CSYNC_STATUS_INDIVIDUAL_IS_CONFLICT_FILE: item->_status = SyncFileItem::Conflict; if (Utility::shouldUploadConflictFiles()) { diff --git a/src/libsync/syncengine.h b/src/libsync/syncengine.h index 4d20b9ce5..8be936e38 100644 --- a/src/libsync/syncengine.h +++ b/src/libsync/syncengine.h @@ -32,7 +32,6 @@ // when do we go away with this private/public separation? #include -#include "excludedfiles.h" #include "syncfileitem.h" #include "progressdispatcher.h" #include "common/utility.h" diff --git a/src/libsync/syncoptions.h b/src/libsync/syncoptions.h new file mode 100644 index 000000000..f6565584c --- /dev/null +++ b/src/libsync/syncoptions.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) by Olivier Goffart + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#pragma once + +#include "owncloudlib.h" +#include + + +namespace OCC { + +/** + * Value class containing the options given to the sync engine + */ +struct SyncOptions +{ + /** Maximum size (in Bytes) a folder can have without asking for confirmation. + * -1 means infinite */ + qint64 _newBigFolderSizeLimit = -1; + + /** If a confirmation should be asked for external storages */ + bool _confirmExternalStorage = false; + + /** The initial un-adjusted chunk size in bytes for chunked uploads, both + * for old and new chunking algorithm, which classifies the item to be chunked + * + * In chunkingNG, when dynamic chunk size adjustments are done, this is the + * starting value and is then gradually adjusted within the + * minChunkSize / maxChunkSize bounds. + */ + quint64 _initialChunkSize = 10 * 1000 * 1000; // 10MB + + /** The minimum chunk size in bytes for chunked uploads */ + quint64 _minChunkSize = 1 * 1000 * 1000; // 1MB + + /** The maximum chunk size in bytes for chunked uploads */ + quint64 _maxChunkSize = 100 * 1000 * 1000; // 100MB + + /** The target duration of chunk uploads for dynamic chunk sizing. + * + * Set to 0 it will disable dynamic chunk sizing. + */ + quint64 _targetChunkUploadDuration = 60 * 1000; // 1 minute + + /** Whether parallel network jobs are allowed. */ + bool _parallelNetworkJobs = true; +}; + + +} diff --git a/src/libsync/syncresult.cpp b/src/libsync/syncresult.cpp index c2aeb24ed..92af7fa82 100644 --- a/src/libsync/syncresult.cpp +++ b/src/libsync/syncresult.cpp @@ -106,7 +106,7 @@ void SyncResult::appendErrorString(const QString &err) QString SyncResult::errorString() const { if (_errors.isEmpty()) - return QString::null; + return QString(); return _errors.first(); } diff --git a/src/libsync/theme.cpp b/src/libsync/theme.cpp index cbbf3be2a..7c59b468d 100644 --- a/src/libsync/theme.cpp +++ b/src/libsync/theme.cpp @@ -219,7 +219,7 @@ QString Theme::defaultServerFolder() const QString Theme::overrideServerUrl() const { - return QString::null; + return QString(); } QString Theme::forceConfigAuthType() const @@ -303,7 +303,7 @@ QString Theme::gitSHA1() const .arg(gitSha1.left(6)) .arg(__DATE__) .arg(__TIME__) - .arg(QString::fromAscii(qVersion())) + .arg(qVersion()) .arg(QSslSocket::sslLibraryVersionString()); #endif return devString; diff --git a/src/libsync/theme.h b/src/libsync/theme.h index ffc7569b3..c2cd4922f 100644 --- a/src/libsync/theme.h +++ b/src/libsync/theme.h @@ -120,7 +120,7 @@ public: /** * URL to help file */ - virtual QString helpUrl() const { return QString::null; } + virtual QString helpUrl() const { return QString(); } /** * Setting a value here will pre-define the server url. @@ -149,7 +149,7 @@ public: /** * Override to encforce a particular locale, i.e. "de" or "pt_BR" */ - virtual QString enforcedLocale() const { return QString::null; } + virtual QString enforcedLocale() const { return QString(); } /** colored, white or black */ QString systrayIconFlavor(bool mono, bool sysTrayMenuVisible = false) const; diff --git a/test/csync/csync_tests/check_csync_exclude.cpp b/test/csync/csync_tests/check_csync_exclude.cpp index d7e9f402f..b01f4cdc8 100644 --- a/test/csync/csync_tests/check_csync_exclude.cpp +++ b/test/csync/csync_tests/check_csync_exclude.cpp @@ -29,10 +29,18 @@ #define EXCLUDE_LIST_FILE SOURCEDIR"/../../sync-exclude.lst" +ExcludedFiles *excludedFiles = nullptr; + +class ExcludedFilesTest +{ +public: + static int setup(void **state) { CSYNC *csync; csync = new CSYNC("/tmp/check_csync1", new OCC::SyncJournalDb("")); + excludedFiles = new ExcludedFiles; + csync->exclude_traversal_fn = excludedFiles->csyncTraversalMatchFun(); *state = csync; return 0; @@ -40,26 +48,22 @@ static int setup(void **state) { static int setup_init(void **state) { CSYNC *csync; - int rc; csync = new CSYNC("/tmp/check_csync1", new OCC::SyncJournalDb("")); + excludedFiles = new ExcludedFiles; + csync->exclude_traversal_fn = excludedFiles->csyncTraversalMatchFun(); - rc = csync_exclude_load(EXCLUDE_LIST_FILE, &(csync->excludes)); - assert_int_equal(rc, 0); + excludedFiles->addExcludeFilePath(EXCLUDE_LIST_FILE); + assert_true(excludedFiles->reloadExcludeFiles()); /* and add some unicode stuff */ - rc = _csync_exclude_add(&(csync->excludes), "*.💩"); - assert_int_equal(rc, 0); - rc = _csync_exclude_add(&(csync->excludes), "пятницы.*"); - assert_int_equal(rc, 0); - rc = _csync_exclude_add(&(csync->excludes), "*/*.out"); - assert_int_equal(rc, 0); - rc = _csync_exclude_add(&(csync->excludes), "latex*/*.run.xml"); - assert_int_equal(rc, 0); - rc = _csync_exclude_add(&(csync->excludes), "latex/*/*.tex.tmp"); - assert_int_equal(rc, 0); + excludedFiles->addManualExclude("*.💩"); // is this source file utf8 encoded? + excludedFiles->addManualExclude("пятницы.*"); + excludedFiles->addManualExclude("*/*.out"); + excludedFiles->addManualExclude("latex*/*.run.xml"); + excludedFiles->addManualExclude("latex/*/*.tex.tmp"); - csync_exclude_traversal_prepare(csync); + assert_true(excludedFiles->reloadExcludeFiles()); *state = csync; return 0; @@ -72,6 +76,7 @@ static int teardown(void **state) { auto statedb = csync->statedb; delete csync; delete statedb; + delete excludedFiles; rc = system("rm -rf /tmp/check_csync1"); assert_int_equal(rc, 0); @@ -79,450 +84,349 @@ static int teardown(void **state) { assert_int_equal(rc, 0); *state = NULL; - + return 0; } -static void check_csync_exclude_add(void **state) +static int check_file_full(const char *path) { - CSYNC *csync = (CSYNC*)*state; - _csync_exclude_add(&(csync->excludes), "/tmp/check_csync1/*"); - assert_string_equal(csync->excludes->vector[0], "/tmp/check_csync1/*"); + return excludedFiles->fullPatternMatch(path, CSYNC_FTW_TYPE_FILE); } -static void check_csync_exclude_load(void **state) +static int check_dir_full(const char *path) { - CSYNC *csync = (CSYNC*)*state; - int rc; - - rc = csync_exclude_load(EXCLUDE_LIST_FILE, &(csync->excludes) ); - assert_int_equal(rc, 0); - - assert_string_equal(csync->excludes->vector[0], "*~"); - assert_int_not_equal(csync->excludes->count, 0); - - assert_true(csync->parsed_traversal_excludes.regexp_exclude.pattern().isEmpty()); - csync_exclude_traversal_prepare(csync); /* parse into regular expression */ - assert_false(csync->parsed_traversal_excludes.regexp_exclude.pattern().isEmpty()); + return excludedFiles->fullPatternMatch(path, CSYNC_FTW_TYPE_DIR); } -static void check_csync_excluded(void **state) +static int check_file_traversal(const char *path) { - CSYNC *csync = (CSYNC*)*state; - int rc; + return excludedFiles->traversalPatternMatch(path, CSYNC_FTW_TYPE_FILE); +} - rc = csync_excluded_no_ctx(csync->excludes, "", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - rc = csync_excluded_no_ctx(csync->excludes, "/", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); +static int check_dir_traversal(const char *path) +{ + return excludedFiles->traversalPatternMatch(path, CSYNC_FTW_TYPE_DIR); +} - rc = csync_excluded_no_ctx(csync->excludes, "A", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); +static void check_csync_exclude_add(void **) +{ + excludedFiles->addManualExclude("/tmp/check_csync1/*"); + assert_int_equal(check_file_full("/tmp/check_csync1/foo"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_full("/tmp/check_csync2/foo"), CSYNC_NOT_EXCLUDED); + assert_true(excludedFiles->_allExcludes.contains("/tmp/check_csync1/*")); - rc = csync_excluded_no_ctx(csync->excludes, "krawel_krawel", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - rc = csync_excluded_no_ctx(csync->excludes, ".kde/share/config/kwin.eventsrc", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - rc = csync_excluded_no_ctx(csync->excludes, ".directory/cache-maximegalon/cache1.txt", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); - rc = csync_excluded_no_ctx(csync->excludes, "mozilla/.directory", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + assert_true(excludedFiles->_fullRegexFile.pattern().contains("csync1")); + assert_false(excludedFiles->_bnameActivationRegexFile.pattern().contains("csync1")); + + excludedFiles->addManualExclude("foo"); + assert_true(excludedFiles->_bnameActivationRegexFile.pattern().contains("foo")); +} + +static void check_csync_excluded(void **) +{ + assert_int_equal(check_file_full(""), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_full("/"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_full("A"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_full("krawel_krawel"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_full(".kde/share/config/kwin.eventsrc"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_full(".directory/cache-maximegalon/cache1.txt"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_dir_full("mozilla/.directory"), CSYNC_FILE_EXCLUDE_LIST); /* * Test for patterns in subdirs. '.beagle' is defined as a pattern and has * to be found in top dir as well as in directories underneath. */ - rc = csync_excluded_no_ctx(csync->excludes, ".apdisk", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); - rc = csync_excluded_no_ctx(csync->excludes, "foo/.apdisk", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); - rc = csync_excluded_no_ctx(csync->excludes, "foo/bar/.apdisk", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_dir_full(".apdisk"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_dir_full("foo/.apdisk"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_dir_full("foo/bar/.apdisk"), CSYNC_FILE_EXCLUDE_LIST); - rc = csync_excluded_no_ctx(csync->excludes, ".java", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_full(".java"), CSYNC_NOT_EXCLUDED); /* Files in the ignored dir .java will also be ignored. */ - rc = csync_excluded_no_ctx(csync->excludes, ".apdisk/totally_amazing.jar", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_full(".apdisk/totally_amazing.jar"), CSYNC_FILE_EXCLUDE_LIST); /* and also in subdirs */ - rc = csync_excluded_no_ctx(csync->excludes, "projects/.apdisk/totally_amazing.jar", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_full("projects/.apdisk/totally_amazing.jar"), CSYNC_FILE_EXCLUDE_LIST); /* csync-journal is ignored in general silently. */ - rc = csync_excluded_no_ctx(csync->excludes, ".csync_journal.db", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); - rc = csync_excluded_no_ctx(csync->excludes, ".csync_journal.db.ctmp", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); - rc = csync_excluded_no_ctx(csync->excludes, "subdir/.csync_journal.db", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); - - /* also the new form of the database name */ - rc = csync_excluded_no_ctx(csync->excludes, "._sync_5bdd60bdfcfa.db", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); - rc = csync_excluded_no_ctx(csync->excludes, "._sync_5bdd60bdfcfa.db.ctmp", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); - rc = csync_excluded_no_ctx(csync->excludes, "._sync_5bdd60bdfcfa.db-shm", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); - rc = csync_excluded_no_ctx(csync->excludes, "subdir/._sync_5bdd60bdfcfa.db", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); + assert_int_equal(check_file_full(".csync_journal.db"), CSYNC_FILE_SILENTLY_EXCLUDED); + assert_int_equal(check_file_full(".csync_journal.db.ctmp"), CSYNC_FILE_SILENTLY_EXCLUDED); + assert_int_equal(check_file_full("subdir/.csync_journal.db"), CSYNC_FILE_SILENTLY_EXCLUDED); - rc = csync_excluded_no_ctx(csync->excludes, ".sync_5bdd60bdfcfa.db", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); - rc = csync_excluded_no_ctx(csync->excludes, ".sync_5bdd60bdfcfa.db.ctmp", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); - rc = csync_excluded_no_ctx(csync->excludes, ".sync_5bdd60bdfcfa.db-shm", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); - rc = csync_excluded_no_ctx(csync->excludes, "subdir/.sync_5bdd60bdfcfa.db", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); + /* also the new form of the database name */ + assert_int_equal(check_file_full("._sync_5bdd60bdfcfa.db"), CSYNC_FILE_SILENTLY_EXCLUDED); + assert_int_equal(check_file_full("._sync_5bdd60bdfcfa.db.ctmp"), CSYNC_FILE_SILENTLY_EXCLUDED); + assert_int_equal(check_file_full("._sync_5bdd60bdfcfa.db-shm"), CSYNC_FILE_SILENTLY_EXCLUDED); + assert_int_equal(check_file_full("subdir/._sync_5bdd60bdfcfa.db"), CSYNC_FILE_SILENTLY_EXCLUDED); + + assert_int_equal(check_file_full(".sync_5bdd60bdfcfa.db"), CSYNC_FILE_SILENTLY_EXCLUDED); + assert_int_equal(check_file_full(".sync_5bdd60bdfcfa.db.ctmp"), CSYNC_FILE_SILENTLY_EXCLUDED); + assert_int_equal(check_file_full(".sync_5bdd60bdfcfa.db-shm"), CSYNC_FILE_SILENTLY_EXCLUDED); + assert_int_equal(check_file_full("subdir/.sync_5bdd60bdfcfa.db"), CSYNC_FILE_SILENTLY_EXCLUDED); /* pattern ]*.directory - ignore and remove */ - rc = csync_excluded_no_ctx(csync->excludes, "my.~directory", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_AND_REMOVE); - - rc = csync_excluded_no_ctx(csync->excludes, "/a_folder/my.~directory", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_AND_REMOVE); + assert_int_equal(check_file_full("my.~directory"), CSYNC_FILE_EXCLUDE_AND_REMOVE); + assert_int_equal(check_file_full("/a_folder/my.~directory"), CSYNC_FILE_EXCLUDE_AND_REMOVE); /* Not excluded because the pattern .netscape/cache requires directory. */ - rc = csync_excluded_no_ctx(csync->excludes, ".netscape/cache", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_full(".netscape/cache"), CSYNC_NOT_EXCLUDED); /* Not excluded */ - rc = csync_excluded_no_ctx(csync->excludes, "unicode/中文.hé", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_full("unicode/中文.hé"), CSYNC_NOT_EXCLUDED); /* excluded */ - rc = csync_excluded_no_ctx(csync->excludes, "unicode/пятницы.txt", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); - rc = csync_excluded_no_ctx(csync->excludes, "unicode/中文.💩", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_full("unicode/пятницы.txt"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_full("unicode/中文.💩"), CSYNC_FILE_EXCLUDE_LIST); /* path wildcards */ - rc = csync_excluded_no_ctx(csync->excludes, "foobar/my_manuscript.out", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_full("foobar/my_manuscript.out"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_full("latex_tmp/my_manuscript.run.xml"), CSYNC_FILE_EXCLUDE_LIST); - rc = csync_excluded_no_ctx(csync->excludes, "latex_tmp/my_manuscript.run.xml", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_full("word_tmp/my_manuscript.run.xml"), CSYNC_NOT_EXCLUDED); - rc = csync_excluded_no_ctx(csync->excludes, "word_tmp/my_manuscript.run.xml", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_full("latex/my_manuscript.tex.tmp"), CSYNC_NOT_EXCLUDED); - rc = csync_excluded_no_ctx(csync->excludes, "latex/my_manuscript.tex.tmp", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - - rc = csync_excluded_no_ctx(csync->excludes, "latex/songbook/my_manuscript.tex.tmp", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_full("latex/songbook/my_manuscript.tex.tmp"), CSYNC_FILE_EXCLUDE_LIST); #ifdef _WIN32 - rc = csync_excluded_no_ctx(csync->excludes, "file_trailing_space ", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_TRAILING_SPACE); + assert_int_equal(exclude_check_file("file_trailing_space "), CSYNC_FILE_EXCLUDE_TRAILING_SPACE); - rc = csync_excluded_no_ctx(csync->excludes, "file_trailing_dot.", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_INVALID_CHAR); - - rc = csync_excluded_no_ctx(csync->excludes, "AUX", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_INVALID_CHAR); - - rc = csync_excluded_no_ctx(csync->excludes, "file_invalid_char<", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_INVALID_CHAR); + assert_int_equal(exclude_check_file("file_trailing_dot."), CSYNC_FILE_EXCLUDE_INVALID_CHAR); + assert_int_equal(exclude_check_file("AUX"), CSYNC_FILE_EXCLUDE_INVALID_CHAR); + assert_int_equal(exclude_check_file("file_invalid_char<"), CSYNC_FILE_EXCLUDE_INVALID_CHAR); #endif /* ? character */ - _csync_exclude_add( &(csync->excludes), "bond00?" ); - csync_exclude_traversal_prepare(csync); - rc = csync_excluded_no_ctx(csync->excludes, "bond00", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - rc = csync_excluded_no_ctx(csync->excludes, "bond007", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); - rc = csync_excluded_no_ctx(csync->excludes, "bond0071", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); + excludedFiles->addManualExclude("bond00?"); + excludedFiles->reloadExcludeFiles(); + assert_int_equal(check_file_full("bond00"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_full("bond007"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_full("bond0071"), CSYNC_NOT_EXCLUDED); -#ifndef _WIN32 /* brackets */ - _csync_exclude_add( &(csync->excludes), "a [bc] d" ); - csync_exclude_traversal_prepare(csync); - rc = csync_excluded_no_ctx(csync->excludes, "a d d", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - rc = csync_excluded_no_ctx(csync->excludes, "a d", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - rc = csync_excluded_no_ctx(csync->excludes, "a b d", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); - rc = csync_excluded_no_ctx(csync->excludes, "a c d", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); -#endif + excludedFiles->addManualExclude("a [bc] d"); + excludedFiles->reloadExcludeFiles(); + assert_int_equal(check_file_full("a d d"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_full("a d"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_full("a b d"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_full("a c d"), CSYNC_FILE_EXCLUDE_LIST); /* escapes */ - _csync_exclude_add( &(csync->excludes), "\\a \\* \\?" ); - csync_exclude_traversal_prepare(csync); - rc = csync_excluded_no_ctx(csync->excludes, "\\a \\* \\?", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - rc = csync_excluded_no_ctx(csync->excludes, "a b c", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - rc = csync_excluded_no_ctx(csync->excludes, "a * ?", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + excludedFiles->addManualExclude("a \\*"); + excludedFiles->addManualExclude("b \\?"); + excludedFiles->addManualExclude("c \\[d]"); + excludedFiles->reloadExcludeFiles(); + assert_int_equal(check_file_full("a \\*"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_full("a bc"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_full("a *"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_full("b \\?"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_full("b f"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_full("b ?"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_full("c \\[d]"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_full("c d"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_full("c [d]"), CSYNC_FILE_EXCLUDE_LIST); } -static void check_csync_excluded_traversal(void **state) +static void check_csync_excluded_traversal(void **) { - CSYNC *csync = (CSYNC*)*state; - int rc; + assert_int_equal(check_file_traversal(""), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal("/"), CSYNC_NOT_EXCLUDED); - rc = csync_excluded_traversal(csync, "", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - rc = csync_excluded_traversal(csync, "/", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal("A"), CSYNC_NOT_EXCLUDED); - rc = csync_excluded_traversal(csync, "A", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - - rc = csync_excluded_traversal(csync, "krawel_krawel", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - rc = csync_excluded_traversal(csync, ".kde/share/config/kwin.eventsrc", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - rc = csync_excluded_traversal(csync, "mozilla/.directory", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_traversal("krawel_krawel"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal(".kde/share/config/kwin.eventsrc"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_dir_traversal("mozilla/.directory"), CSYNC_FILE_EXCLUDE_LIST); /* * Test for patterns in subdirs. '.beagle' is defined as a pattern and has * to be found in top dir as well as in directories underneath. */ - rc = csync_excluded_traversal(csync, ".apdisk", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); - rc = csync_excluded_traversal(csync, "foo/.apdisk", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); - rc = csync_excluded_traversal(csync, "foo/bar/.apdisk", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_dir_traversal(".apdisk"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_dir_traversal("foo/.apdisk"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_dir_traversal("foo/bar/.apdisk"), CSYNC_FILE_EXCLUDE_LIST); - rc = csync_excluded_traversal(csync, ".java", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal(".java"), CSYNC_NOT_EXCLUDED); /* csync-journal is ignored in general silently. */ - rc = csync_excluded_traversal(csync, ".csync_journal.db", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); - rc = csync_excluded_traversal(csync, ".csync_journal.db.ctmp", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); - rc = csync_excluded_traversal(csync, "subdir/.csync_journal.db", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); - rc = csync_excluded_traversal(csync, "/two/subdir/.csync_journal.db", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); + assert_int_equal(check_file_traversal(".csync_journal.db"), CSYNC_FILE_SILENTLY_EXCLUDED); + assert_int_equal(check_file_traversal(".csync_journal.db.ctmp"), CSYNC_FILE_SILENTLY_EXCLUDED); + assert_int_equal(check_file_traversal("subdir/.csync_journal.db"), CSYNC_FILE_SILENTLY_EXCLUDED); + assert_int_equal(check_file_traversal("/two/subdir/.csync_journal.db"), CSYNC_FILE_SILENTLY_EXCLUDED); /* also the new form of the database name */ - rc = csync_excluded_traversal(csync, "._sync_5bdd60bdfcfa.db", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); - rc = csync_excluded_traversal(csync, "._sync_5bdd60bdfcfa.db.ctmp", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); - rc = csync_excluded_traversal(csync, "._sync_5bdd60bdfcfa.db-shm", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); - rc = csync_excluded_traversal(csync, "subdir/._sync_5bdd60bdfcfa.db", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); + assert_int_equal(check_file_traversal("._sync_5bdd60bdfcfa.db"), CSYNC_FILE_SILENTLY_EXCLUDED); + assert_int_equal(check_file_traversal("._sync_5bdd60bdfcfa.db.ctmp"), CSYNC_FILE_SILENTLY_EXCLUDED); + assert_int_equal(check_file_traversal("._sync_5bdd60bdfcfa.db-shm"), CSYNC_FILE_SILENTLY_EXCLUDED); + assert_int_equal(check_file_traversal("subdir/._sync_5bdd60bdfcfa.db"), CSYNC_FILE_SILENTLY_EXCLUDED); - rc = csync_excluded_traversal(csync, ".sync_5bdd60bdfcfa.db", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); - rc = csync_excluded_traversal(csync, ".sync_5bdd60bdfcfa.db.ctmp", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); - rc = csync_excluded_traversal(csync, ".sync_5bdd60bdfcfa.db-shm", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); - rc = csync_excluded_traversal(csync, "subdir/.sync_5bdd60bdfcfa.db", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED); + assert_int_equal(check_file_traversal(".sync_5bdd60bdfcfa.db"), CSYNC_FILE_SILENTLY_EXCLUDED); + assert_int_equal(check_file_traversal(".sync_5bdd60bdfcfa.db.ctmp"), CSYNC_FILE_SILENTLY_EXCLUDED); + assert_int_equal(check_file_traversal(".sync_5bdd60bdfcfa.db-shm"), CSYNC_FILE_SILENTLY_EXCLUDED); + assert_int_equal(check_file_traversal("subdir/.sync_5bdd60bdfcfa.db"), CSYNC_FILE_SILENTLY_EXCLUDED); + /* Other builtin excludes */ + assert_int_equal(check_file_traversal("foo/Desktop.ini"), CSYNC_FILE_SILENTLY_EXCLUDED); /* pattern ]*.directory - ignore and remove */ - rc = csync_excluded_traversal(csync, "my.~directory", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_AND_REMOVE); - - rc = csync_excluded_traversal(csync, "/a_folder/my.~directory", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_AND_REMOVE); + assert_int_equal(check_file_traversal("my.~directory"), CSYNC_FILE_EXCLUDE_AND_REMOVE); + assert_int_equal(check_file_traversal("/a_folder/my.~directory"), CSYNC_FILE_EXCLUDE_AND_REMOVE); /* Not excluded because the pattern .netscape/cache requires directory. */ - rc = csync_excluded_traversal(csync, ".netscape/cache", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal(".netscape/cache"), CSYNC_NOT_EXCLUDED); /* Not excluded */ - rc = csync_excluded_traversal(csync, "unicode/中文.hé", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal("unicode/中文.hé"), CSYNC_NOT_EXCLUDED); /* excluded */ - rc = csync_excluded_traversal(csync, "unicode/пятницы.txt", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); - rc = csync_excluded_traversal(csync, "unicode/中文.💩", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_traversal("unicode/пятницы.txt"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_traversal("unicode/中文.💩"), CSYNC_FILE_EXCLUDE_LIST); /* path wildcards */ - rc = csync_excluded_traversal(csync, "foobar/my_manuscript.out", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); - - rc = csync_excluded_traversal(csync, "latex_tmp/my_manuscript.run.xml", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); - - rc = csync_excluded_traversal(csync, "word_tmp/my_manuscript.run.xml", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - - rc = csync_excluded_traversal(csync, "latex/my_manuscript.tex.tmp", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - - rc = csync_excluded_traversal(csync, "latex/songbook/my_manuscript.tex.tmp", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_traversal("foobar/my_manuscript.out"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_traversal("latex_tmp/my_manuscript.run.xml"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_traversal("word_tmp/my_manuscript.run.xml"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal("latex/my_manuscript.tex.tmp"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal("latex/songbook/my_manuscript.tex.tmp"), CSYNC_FILE_EXCLUDE_LIST); #ifdef _WIN32 - rc = csync_excluded_traversal(csync, "file_trailing_space ", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_TRAILING_SPACE); - - rc = csync_excluded_traversal(csync, "file_trailing_dot.", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_INVALID_CHAR); - - rc = csync_excluded_traversal(csync, "AUX", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_INVALID_CHAR); - - rc = csync_excluded_traversal(csync, "file_invalid_char<", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_INVALID_CHAR); + assert_int_equal(check_file_traversal("file_trailing_space "), CSYNC_FILE_EXCLUDE_TRAILING_SPACE); + assert_int_equal(check_file_traversal("file_trailing_dot."), CSYNC_FILE_EXCLUDE_INVALID_CHAR); + assert_int_equal(check_file_traversal("AUX"), CSYNC_FILE_EXCLUDE_INVALID_CHAR); + assert_int_equal(check_file_traversal("file_invalid_char<"), CSYNC_FILE_EXCLUDE_INVALID_CHAR); #endif /* From here the actual traversal tests */ - _csync_exclude_add( &(csync->excludes), "/exclude" ); - csync_exclude_traversal_prepare(csync); + excludedFiles->addManualExclude("/exclude"); + excludedFiles->reloadExcludeFiles(); /* Check toplevel dir, the pattern only works for toplevel dir. */ - rc = csync_excluded_traversal(csync, "/exclude", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); - - rc = csync_excluded_traversal(csync, "/foo/exclude", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); + assert_int_equal(check_dir_traversal("/exclude"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_dir_traversal("/foo/exclude"), CSYNC_NOT_EXCLUDED); /* check for a file called exclude. Must still work */ - rc = csync_excluded_traversal(csync, "/exclude", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); - - rc = csync_excluded_traversal(csync, "/foo/exclude", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal("/exclude"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_traversal("/foo/exclude"), CSYNC_NOT_EXCLUDED); /* Add an exclude for directories only: excl/ */ - _csync_exclude_add( &(csync->excludes), "excl/" ); - csync_exclude_traversal_prepare(csync); - rc = csync_excluded_traversal(csync, "/excl", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + excludedFiles->addManualExclude("excl/"); + excludedFiles->reloadExcludeFiles(); + assert_int_equal(check_dir_traversal("/excl"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_dir_traversal("meep/excl"), CSYNC_FILE_EXCLUDE_LIST); - rc = csync_excluded_traversal(csync, "meep/excl", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + // because leading dirs aren't checked! + assert_int_equal(check_file_traversal("meep/excl/file"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal("/excl"), CSYNC_NOT_EXCLUDED); - rc = csync_excluded_traversal(csync, "meep/excl/file", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); // because leading dirs aren't checked! + excludedFiles->addManualExclude("/excludepath/withsubdir"); + excludedFiles->reloadExcludeFiles(); - rc = csync_excluded_traversal(csync, "/excl", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); + assert_int_equal(check_dir_traversal("/excludepath/withsubdir"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_traversal("/excludepath/withsubdir"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_dir_traversal("/excludepath/withsubdir2"), CSYNC_NOT_EXCLUDED); - _csync_exclude_add(&csync->excludes, "/excludepath/withsubdir"); - csync_exclude_traversal_prepare(csync); - - rc = csync_excluded_traversal(csync, "/excludepath/withsubdir", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); - - rc = csync_excluded_traversal(csync, "/excludepath/withsubdir", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); - - rc = csync_excluded_traversal(csync, "/excludepath/withsubdir2", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - - rc = csync_excluded_traversal(csync, "/excludepath/withsubdir/foo", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); // because leading dirs aren't checked! + // because leading dirs aren't checked! + assert_int_equal(check_dir_traversal("/excludepath/withsubdir/foo"), CSYNC_NOT_EXCLUDED); /* Check ending of pattern */ - rc = csync_excluded_traversal(csync, "/exclude", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); - rc = csync_excluded_traversal(csync, "/excludeX", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - rc = csync_excluded_traversal(csync, "exclude", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal("/exclude"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_traversal("/excludeX"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal("exclude"), CSYNC_NOT_EXCLUDED); - _csync_exclude_add( &(csync->excludes), "exclude" ); - csync_exclude_traversal_prepare(csync); - rc = csync_excluded_traversal(csync, "exclude", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + excludedFiles->addManualExclude("exclude"); + excludedFiles->reloadExcludeFiles(); + assert_int_equal(check_file_traversal("exclude"), CSYNC_FILE_EXCLUDE_LIST); /* ? character */ - _csync_exclude_add( &(csync->excludes), "bond00?" ); - csync_exclude_traversal_prepare(csync); - rc = csync_excluded_traversal(csync, "bond00", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - rc = csync_excluded_traversal(csync, "bond007", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); - rc = csync_excluded_traversal(csync, "bond0071", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); + excludedFiles->addManualExclude("bond00?"); + excludedFiles->reloadExcludeFiles(); + assert_int_equal(check_file_traversal("bond00"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal("bond007"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_traversal("bond0071"), CSYNC_NOT_EXCLUDED); -#ifndef _WIN32 /* brackets */ - _csync_exclude_add( &(csync->excludes), "a [bc] d" ); - csync_exclude_traversal_prepare(csync); - rc = csync_excluded_traversal(csync, "a d d", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - rc = csync_excluded_traversal(csync, "a d", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - rc = csync_excluded_traversal(csync, "a b d", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); - rc = csync_excluded_traversal(csync, "a c d", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); -#endif + excludedFiles->addManualExclude("a [bc] d"); + excludedFiles->reloadExcludeFiles(); + assert_int_equal(check_file_traversal("a d d"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal("a d"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal("a b d"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_traversal("a c d"), CSYNC_FILE_EXCLUDE_LIST); /* escapes */ - _csync_exclude_add( &(csync->excludes), "\\a \\* \\?" ); - csync_exclude_traversal_prepare(csync); - rc = csync_excluded_traversal(csync, "\\a \\* \\?", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - rc = csync_excluded_traversal(csync, "a b c", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - rc = csync_excluded_traversal(csync, "a * ?", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + excludedFiles->addManualExclude("a \\*"); + excludedFiles->addManualExclude("b \\?"); + excludedFiles->addManualExclude("c \\[d]"); + excludedFiles->reloadExcludeFiles(); + assert_int_equal(check_file_traversal("a \\*"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal("a bc"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal("a *"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_traversal("b \\?"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal("b f"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal("b ?"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_traversal("c \\[d]"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal("c d"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal("c [d]"), CSYNC_FILE_EXCLUDE_LIST); } -static void check_csync_pathes(void **state) +static void check_csync_dir_only(void **) { - CSYNC *csync = (CSYNC*)*state; - int rc; + excludedFiles->addManualExclude("filedir"); + excludedFiles->addManualExclude("dir/"); - _csync_exclude_add( &(csync->excludes), "/exclude" ); + assert_int_equal(check_file_traversal("other"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal("filedir"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_traversal("dir"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal("s/other"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_traversal("s/filedir"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_traversal("s/dir"), CSYNC_NOT_EXCLUDED); + + assert_int_equal(check_dir_traversal("other"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_dir_traversal("filedir"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_dir_traversal("dir"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_dir_traversal("s/other"), CSYNC_NOT_EXCLUDED); + assert_int_equal(check_dir_traversal("s/filedir"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_dir_traversal("s/dir"), CSYNC_FILE_EXCLUDE_LIST); + + assert_int_equal(check_dir_full("filedir/foo"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_full("filedir/foo"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_dir_full("dir/foo"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_full("dir/foo"), CSYNC_FILE_EXCLUDE_LIST); +} + +static void check_csync_pathes(void **) +{ + excludedFiles->addManualExclude("/exclude"); + excludedFiles->reloadExcludeFiles(); /* Check toplevel dir, the pattern only works for toplevel dir. */ - rc = csync_excluded_no_ctx(csync->excludes, "/exclude", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_dir_full("/exclude"), CSYNC_FILE_EXCLUDE_LIST); - rc = csync_excluded_no_ctx(csync->excludes, "/foo/exclude", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); + assert_int_equal(check_dir_full("/foo/exclude"), CSYNC_NOT_EXCLUDED); /* check for a file called exclude. Must still work */ - rc = csync_excluded_no_ctx(csync->excludes, "/exclude", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_full("/exclude"), CSYNC_FILE_EXCLUDE_LIST); - rc = csync_excluded_no_ctx(csync->excludes, "/foo/exclude", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); + assert_int_equal(check_file_full("/foo/exclude"), CSYNC_NOT_EXCLUDED); /* Add an exclude for directories only: excl/ */ - _csync_exclude_add( &(csync->excludes), "excl/" ); - rc = csync_excluded_no_ctx(csync->excludes, "/excl", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + excludedFiles->addManualExclude("excl/"); + excludedFiles->reloadExcludeFiles(); + assert_int_equal(check_dir_full("/excl"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_dir_full("meep/excl"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_full("meep/excl/file"), CSYNC_FILE_EXCLUDE_LIST); - rc = csync_excluded_no_ctx(csync->excludes, "meep/excl", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_full("/excl"), CSYNC_NOT_EXCLUDED); - rc = csync_excluded_no_ctx(csync->excludes, "meep/excl/file", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + excludedFiles->addManualExclude("/excludepath/withsubdir"); + excludedFiles->reloadExcludeFiles(); - rc = csync_excluded_no_ctx(csync->excludes, "/excl", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); + assert_int_equal(check_dir_full("/excludepath/withsubdir"), CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_file_full("/excludepath/withsubdir"), CSYNC_FILE_EXCLUDE_LIST); - _csync_exclude_add(&csync->excludes, "/excludepath/withsubdir"); + assert_int_equal(check_dir_full("/excludepath/withsubdir2"), CSYNC_NOT_EXCLUDED); - rc = csync_excluded_no_ctx(csync->excludes, "/excludepath/withsubdir", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); - - rc = csync_excluded_no_ctx(csync->excludes, "/excludepath/withsubdir", CSYNC_FTW_TYPE_FILE); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); - - rc = csync_excluded_no_ctx(csync->excludes, "/excludepath/withsubdir2", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_NOT_EXCLUDED); - - rc = csync_excluded_no_ctx(csync->excludes, "/excludepath/withsubdir/foo", CSYNC_FTW_TYPE_DIR); - assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); + assert_int_equal(check_dir_full("/excludepath/withsubdir/foo"), CSYNC_FILE_EXCLUDE_LIST); } static void check_csync_is_windows_reserved_word(void **) { @@ -560,10 +464,8 @@ static void check_csync_is_windows_reserved_word(void **) { } /* QT_ENABLE_REGEXP_JIT=0 to get slower results :-) */ -static void check_csync_excluded_performance(void **state) +static void check_csync_excluded_performance(void **) { - CSYNC *csync = (CSYNC*)*state; - const int N = 10000; int totalRc = 0; int i = 0; @@ -574,8 +476,8 @@ static void check_csync_excluded_performance(void **state) gettimeofday(&before, 0); for (i = 0; i < N; ++i) { - totalRc += csync_excluded_no_ctx(csync->excludes, "/this/is/quite/a/long/path/with/many/components", CSYNC_FTW_TYPE_DIR); - totalRc += csync_excluded_no_ctx(csync->excludes, "/1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/29", CSYNC_FTW_TYPE_FILE); + totalRc += check_dir_full("/this/is/quite/a/long/path/with/many/components"); + totalRc += check_file_full("/1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/29"); } assert_int_equal(totalRc, CSYNC_NOT_EXCLUDED); // mainly to avoid optimization @@ -592,8 +494,8 @@ static void check_csync_excluded_performance(void **state) gettimeofday(&before, 0); for (i = 0; i < N; ++i) { - totalRc += csync_excluded_traversal(csync, "/this/is/quite/a/long/path/with/many/components", CSYNC_FTW_TYPE_DIR); - totalRc += csync_excluded_traversal(csync, "/1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/29", CSYNC_FTW_TYPE_FILE); + totalRc += check_dir_traversal("/this/is/quite/a/long/path/with/many/components"); + totalRc += check_file_traversal("/1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/29"); } assert_int_equal(totalRc, CSYNC_NOT_EXCLUDED); // mainly to avoid optimization @@ -613,7 +515,7 @@ static void check_csync_exclude_expand_escapes(void **state) const char *str = csync_exclude_expand_escapes( "keep \\' \\\" \\? \\\\ \\a \\b \\f \\n \\r \\t \\v \\z \\#"); assert_true(0 == strcmp( - str, "keep ' \" ? \\ \a \b \f \n \r \t \v \\z #")); + str, "keep ' \" ? \\\\ \a \b \f \n \r \t \v \\z #")); SAFE_FREE(str); str = csync_exclude_expand_escapes(""); @@ -625,17 +527,21 @@ static void check_csync_exclude_expand_escapes(void **state) SAFE_FREE(str); } +}; // class ExcludedFilesTest + int torture_run_tests(void) { + typedef ExcludedFilesTest T; + const struct CMUnitTest tests[] = { - cmocka_unit_test_setup_teardown(check_csync_exclude_add, setup, teardown), - cmocka_unit_test_setup_teardown(check_csync_exclude_load, setup, teardown), - cmocka_unit_test_setup_teardown(check_csync_excluded, setup_init, teardown), - cmocka_unit_test_setup_teardown(check_csync_excluded_traversal, setup_init, teardown), - cmocka_unit_test_setup_teardown(check_csync_pathes, setup_init, teardown), - cmocka_unit_test_setup_teardown(check_csync_is_windows_reserved_word, setup_init, teardown), - cmocka_unit_test_setup_teardown(check_csync_excluded_performance, setup_init, teardown), - cmocka_unit_test(check_csync_exclude_expand_escapes), + cmocka_unit_test_setup_teardown(T::check_csync_exclude_add, T::setup, T::teardown), + cmocka_unit_test_setup_teardown(T::check_csync_excluded, T::setup_init, T::teardown), + cmocka_unit_test_setup_teardown(T::check_csync_excluded_traversal, T::setup_init, T::teardown), + cmocka_unit_test_setup_teardown(T::check_csync_dir_only, T::setup, T::teardown), + cmocka_unit_test_setup_teardown(T::check_csync_pathes, T::setup_init, T::teardown), + cmocka_unit_test_setup_teardown(T::check_csync_is_windows_reserved_word, T::setup_init, T::teardown), + cmocka_unit_test_setup_teardown(T::check_csync_excluded_performance, T::setup_init, T::teardown), + cmocka_unit_test(T::check_csync_exclude_expand_escapes), }; return cmocka_run_group_tests(tests, NULL, NULL); diff --git a/test/syncenginetestutils.h b/test/syncenginetestutils.h index e6d4a395e..c9f4e088a 100644 --- a/test/syncenginetestutils.h +++ b/test/syncenginetestutils.h @@ -357,7 +357,7 @@ public: } else xml.writeEmptyElement(davUri, QStringLiteral("resourcetype")); - auto gmtDate = fileInfo.lastModified.toTimeZone(QTimeZone(0)); + auto gmtDate = fileInfo.lastModified.toUTC(); auto stringDate = QLocale::c().toString(gmtDate, "ddd, dd MMM yyyy HH:mm:ss 'GMT'"); xml.writeTextElement(davUri, QStringLiteral("getlastmodified"), stringDate); xml.writeTextElement(davUri, QStringLiteral("getcontentlength"), QString::number(fileInfo.size)); diff --git a/test/testchunkingng.cpp b/test/testchunkingng.cpp index 16c6856ac..78003b295 100644 --- a/test/testchunkingng.cpp +++ b/test/testchunkingng.cpp @@ -66,16 +66,27 @@ private slots: void testResume () { - FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()}; fakeFolder.syncEngine().account()->setCapabilities({ { "dav", QVariantMap{ {"chunking", "1.0"} } } }); const int size = 300 * 1000 * 1000; // 300 MB partialUpload(fakeFolder, "A/a0", size); QCOMPARE(fakeFolder.uploadState().children.count(), 1); auto chunkingId = fakeFolder.uploadState().children.first().name; + const auto &chunkMap = fakeFolder.uploadState().children.first().children; + quint64 uploadedSize = std::accumulate(chunkMap.begin(), chunkMap.end(), 0LL, [](quint64 s, const FileInfo &f) { return s + f.size; }); + QVERIFY(uploadedSize > 50 * 1000 * 1000); // at least 50 MB // Add a fake file to make sure it gets deleted fakeFolder.uploadState().children.first().insert("10000", size); + + fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &request) -> QNetworkReply * { + if (op == QNetworkAccessManager::PutOperation) { + // Test that we properly resuming and are not sending past data again. + Q_ASSERT(request.rawHeader("OC-Chunk-Offset").toULongLong() >= uploadedSize); + } + return nullptr; + }); + QVERIFY(fakeFolder.syncOnce()); QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); diff --git a/test/testconcaturl.cpp b/test/testconcaturl.cpp index 63895c4a7..16f76ed34 100644 --- a/test/testconcaturl.cpp +++ b/test/testconcaturl.cpp @@ -50,7 +50,9 @@ private slots: QFETCH(QueryItems, query); QFETCH(QString, expected); QUrl baseUrl("http://example.com" + base); - QUrl resultUrl = Utility::concatUrlPath(baseUrl, concat, query); + QUrlQuery urlQuery; + urlQuery.setQueryItems(query); + QUrl resultUrl = Utility::concatUrlPath(baseUrl, concat, urlQuery); QString result = QString::fromUtf8(resultUrl.toEncoded()); QString expectedFull = "http://example.com" + expected; QCOMPARE(result, expectedFull); diff --git a/test/testexcludedfiles.cpp b/test/testexcludedfiles.cpp index cfaf73499..b743ffd81 100644 --- a/test/testexcludedfiles.cpp +++ b/test/testexcludedfiles.cpp @@ -7,7 +7,7 @@ #include -#include "excludedfiles.h" +#include "csync_exclude.h" using namespace OCC; @@ -20,7 +20,7 @@ class TestExcludedFiles: public QObject private slots: void testFun() { - auto & excluded = ExcludedFiles::instance(); + ExcludedFiles excluded; bool excludeHidden = true; bool keepHidden = false; @@ -30,7 +30,7 @@ private slots: QVERIFY(excluded.isExcluded("/a/.b", "/a", excludeHidden)); excluded.addExcludeFilePath(EXCLUDE_LIST_FILE); - excluded.reloadExcludes(); + excluded.reloadExcludeFiles(); QVERIFY(!excluded.isExcluded("/a/b", "/a", keepHidden)); QVERIFY(excluded.isExcluded("/a/b~", "/a", keepHidden)); diff --git a/test/testsyncfilestatustracker.cpp b/test/testsyncfilestatustracker.cpp index bbc80f386..ab63e3bb5 100644 --- a/test/testsyncfilestatustracker.cpp +++ b/test/testsyncfilestatustracker.cpp @@ -212,8 +212,8 @@ private slots: void warningStatusForExcludedFile() { FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()}; - fakeFolder.syncEngine().excludedFiles().addExcludeExpr("A/a1"); - fakeFolder.syncEngine().excludedFiles().addExcludeExpr("B"); + fakeFolder.syncEngine().excludedFiles().addManualExclude("A/a1"); + fakeFolder.syncEngine().excludedFiles().addManualExclude("B"); fakeFolder.localModifier().appendByte("A/a1"); fakeFolder.localModifier().appendByte("B/b1"); StatusPushSpy statusSpy(fakeFolder.syncEngine()); @@ -239,7 +239,7 @@ private slots: statusSpy.clear(); // Clears the exclude expr above - fakeFolder.syncEngine().excludedFiles().reloadExcludes(); + fakeFolder.syncEngine().excludedFiles().clearManualExcludes(); fakeFolder.scheduleSync(); fakeFolder.execUntilBeforePropagation(); QCOMPARE(statusSpy.statusOf(""), SyncFileStatus(SyncFileStatus::StatusSync)); @@ -262,7 +262,7 @@ private slots: void warningStatusForExcludedFile_CasePreserving() { FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()}; - fakeFolder.syncEngine().excludedFiles().addExcludeExpr("B"); + fakeFolder.syncEngine().excludedFiles().addManualExclude("B"); fakeFolder.serverErrorPaths().append("A/a1"); fakeFolder.localModifier().appendByte("A/a1"); diff --git a/test/testsyncjournaldb.cpp b/test/testsyncjournaldb.cpp index 0575c0ed5..cb86a1655 100644 --- a/test/testsyncjournaldb.cpp +++ b/test/testsyncjournaldb.cpp @@ -50,7 +50,9 @@ private slots: QVERIFY(!record.isValid()); record._path = "foo"; - record._inode = 1234; + // Use a value that exceeds uint32 and isn't representable by the + // signed int being cast to uint64 either (like uint64::max would be) + record._inode = std::numeric_limits::max() + 12ull; record._modtime = dropMsecs(QDateTime::currentDateTime()); record._type = 5; record._etag = "789789"; @@ -71,8 +73,9 @@ private slots: QVERIFY(storedRecord == record); // Update metadata - record._inode = 12345; record._modtime = dropMsecs(QDateTime::currentDateTime().addDays(1)); + // try a value that only fits uint64, not int64 + record._inode = std::numeric_limits::max() - std::numeric_limits::max() - 1; record._type = 7; record._etag = "789FFF"; record._fileId = "efg"; diff --git a/test/testsyncmove.cpp b/test/testsyncmove.cpp index 11b354ad4..5049b019a 100644 --- a/test/testsyncmove.cpp +++ b/test/testsyncmove.cpp @@ -231,12 +231,25 @@ private slots: QCOMPARE(fakeFolder.currentLocalState(), remoteInfo); } + void testDuplicateFileId_data() + { + QTest::addColumn("prefix"); + + // There have been bugs related to how the original + // folder and the folder with the duplicate tree are + // ordered. Test both cases here. + QTest::newRow("first ordering") << "O"; // "O" > "A" + QTest::newRow("second ordering") << "0"; // "0" < "A" + } + // If the same folder is shared in two different ways with the same // user, the target user will see duplicate file ids. We need to make // sure the move detection and sync still do the right thing in that // case. void testDuplicateFileId() { + QFETCH(QString, prefix); + FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() }; auto &remote = fakeFolder.remoteModifier(); @@ -245,8 +258,8 @@ private slots: remote.mkdir("A/Q"); // Duplicate every entry in A under O/A - remote.mkdir("O"); - remote.children["O"].addChild(remote.children["A"]); + remote.mkdir(prefix); + remote.children[prefix].addChild(remote.children["A"]); // This already checks that the rename detection doesn't get // horribly confused if we add new files that have the same @@ -263,28 +276,28 @@ private slots: // Try a remote file move remote.rename("A/a1", "A/W/a1m"); - remote.rename("O/A/a1", "O/A/W/a1m"); + remote.rename(prefix + "/A/a1", prefix + "/A/W/a1m"); QVERIFY(fakeFolder.syncOnce()); QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); QCOMPARE(nGET, 0); // And a remote directory move remote.rename("A/W", "A/Q/W"); - remote.rename("O/A/W", "O/A/Q/W"); + remote.rename(prefix + "/A/W", prefix + "/A/Q/W"); QVERIFY(fakeFolder.syncOnce()); QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); QCOMPARE(nGET, 0); // Partial file removal (in practice, A/a2 may be moved to O/a2, but we don't care) - remote.rename("O/A/a2", "O/a2"); + remote.rename(prefix + "/A/a2", prefix + "/a2"); remote.remove("A/a2"); QVERIFY(fakeFolder.syncOnce()); QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); QCOMPARE(nGET, 0); // Local change plus remote move at the same time - fakeFolder.localModifier().appendByte("O/a2"); - remote.rename("O/a2", "O/a3"); + fakeFolder.localModifier().appendByte(prefix + "/a2"); + remote.rename(prefix + "/a2", prefix + "/a3"); QVERIFY(fakeFolder.syncOnce()); QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); QCOMPARE(nGET, 1); diff --git a/translations/client_ca.ts b/translations/client_ca.ts index 7b539ff87..b7c4490e9 100644 --- a/translations/client_ca.ts +++ b/translations/client_ca.ts @@ -135,8 +135,8 @@ - - + + Cancel Cancel·la @@ -166,184 +166,184 @@ Compte - + Choose what to sync Trieu què sincronitzar - + Force sync now Força la sincronització ara - + Restart sync Reinicia la sincronització - + Remove folder sync connection Elimina la connexió de la carpeta sincronitzada - + Folder creation failed Ha fallat la creació de la carpeta - + <p>Could not create local folder <i>%1</i>. <p>No s'ha pogut crear la carpeta local <i>%1</i>. - + Confirm Folder Sync Connection Removal Confirma l'eliminació de la connexió de la carpeta sincronitzada - + Remove Folder Sync Connection Elimina la connexió de la carpeta sincronitzada - + Sync Running S'està sincronitzant - + The syncing operation is running.<br/>Do you want to terminate it? S'està sincronitzant.<br/>Voleu parar-la? - + %1 in use %1 en ús - + %1 as <i>%2</i> %1 com a <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. La versió del servidor %1 és antiga i fora de suport! Continua sota la teva responsabilitat. - + Connected to %1. Connectat a %1 - + Server %1 is temporarily unavailable. El servidor %1 no està disponible temporalment - + Server %1 is currently in maintenance mode. - + Signed out from %1. S'ha desconnectat de %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... - + No connection to %1 at %2. No hi ha connexió amb %1 a %2. - + Log in Inici de sessió - + There are folders that were not synchronized because they are too big: Hi ha carpetes que no s'han sincronitzat perquè són massa grans: - + There are folders that were not synchronized because they are external storages: Hi ha carpetes que no s'han sincronitzat perquè són fonts d'emmagatzematge externes: - + There are folders that were not synchronized because they are too big or external storages: Hi ha carpetes que no s'han sincronitzat perquè són massa grans o són fonts d'emmagatzematge externes: - + Confirm Account Removal Confirmeu l'eliminació del compte - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Segur que voleu eliminar la connexió al compte <i>%1</i>?</p><p><b>Nota:</b> això <b>no</b> esborrarà cap fitxer.</p> - + Remove connection Elimina la connexió - - + + Open folder Obre la carpeta - + Log out Surt - + Resume sync Continua la sincronització - + Pause sync Pausa la sincronització - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Segur que voleu aturar la sincronització de la carpeta <i>%1</i>?</p><p><b>Nota:</b> això <b>no</b> esborrarà cap fitxer.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) de %2 en ús. Algunes carpetes, incloent les carpetes muntades a través de xarxa o les compartides, poden tenir límits diferents. - + %1 of %2 in use %1 de %2 en ús - + Currently there is no storage usage information available. Actualment no hi ha informació disponible de l'ús d'emmagatzemament. - + No %1 connection configured. La connexió %1 no està configurada. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured No hi ha cap compte d'OwnCloud configurat - + The configured server for this client is too old El servidor configurat per aquest client és massa antic - + Please update to the latest server and restart the client. Actualitzeu el servidor a l'última versió i reestabliu el client. - + Authentication error: Either username or password are wrong. Error d'autentificació: Aquest nom d'usuari o contrasenya son incorrectes. - + timeout temps excedit - + The provided credentials are not correct Les credencials proporcionades no són correctes @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Aturat per l'usuari @@ -938,12 +938,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an Afegeix connexions de carpetes sincronitzades - + Synchronizing with local folder S'està sincronitzant amb les carpetes locals - + File Fitxer @@ -1091,12 +1091,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizard - + Add Folder Sync Connection Afegeix connexions de carpetes sincronitzades - + Add Sync Connection Afegir una connexió de sincronització @@ -1104,17 +1104,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Feu clic per seleccionar un directori local per sincronitzar. - + Enter the path to the local folder. Introduïu la ruta del directori local. - + Select the source folder Seleccioneu la carpeta font @@ -1122,47 +1122,47 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardRemotePath - + Create Remote Folder Crea una carpeta remota - + Enter the name of the new folder to be created below '%1': Introduïu el nom de la carpeta nova que es crearà a sota '%1': - + Folder was successfully created on %1. La carpeta s'ha creat correctament a %1. - + Authentication failed accessing %1 Autentificació fallida en accedir %1 - + Failed to create the folder on %1. Please check manually. No s'ha pogut crear el directori en %1. Si us plau, comproveu-lo manualment. - + Failed to list a folder. Error: %1 Ha fallat en llistar una carpeta. Error: %1 - + Choose this to sync the entire account Escolliu-ho per sincronitzar el compte sencer - + This folder is already being synced. Ja s'està sincronitzant aquest directori. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Ja esteu sincronitzant <i>%1</i>, que és una carpeta dins de <i>%2</i>. @@ -1170,12 +1170,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Atenció:</b> %1 - + <b>Warning:</b> <b>Atenció:</b> @@ -2706,33 +2706,33 @@ No és aconsellada usar-la. - + Delete Esborra - + Open link in browser - + Copy link to clipboard - + Copy link to clipboard (direct download) - + Send link by email Envia l'enllaç per correu electrònic - + Send link by email (direct download) @@ -2866,12 +2866,12 @@ No és aconsellada usar-la. OCC::ShibbolethCredentials - + Login Error Error d'accés - + You must sign in as user %1 Cal identificar-se com a usuari %1 @@ -3216,38 +3216,38 @@ No és aconsellada usar-la. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder - + Not allowed because you don't have permission to add files in that folder - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3337,89 +3337,94 @@ No és aconsellada usar-la. El nom de fitxer és massa llarg. - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. - + Stat failed. - + Filename encoding is not valid La codificació del nom de fitxer no és vàlida - + Invalid characters, please rename "%1" Caràcters no vàlids. Reanomeneu "%1" - + Unable to read the blacklist from the local database - + Unable to read from the sync journal. - + Cannot open the sync journal No es pot obrir el diari de sincronització - + File name contains at least one invalid character El nom del fitxer conté al menys un caràcter invàlid - - + + Ignored because of the "choose what to sync" blacklist S'ignora degut al filtre a «Trieu què sincronitzar» - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed to upload this file because it is read-only on the server, restoring No es permet pujar aquest fitxer perquè només és de lectura en el servidor, es restaura - - + + Not allowed to remove, restoring No es permet l'eliminació, es restaura - + Local files and share folder removed. Fitxers locals i carpeta compartida esborrats. - + Move not allowed, item restored No es permet moure'l, l'element es restaura - + Move not allowed because %1 is read-only No es permet moure perquè %1 només és de lectura - + the destination el destí - + the source l'origen @@ -3461,17 +3466,17 @@ No és aconsellada usar-la. OCC::ValidateChecksumHeader - + The checksum header is malformed. - + The checksum header contained an unknown checksum type '%1' - + The downloaded file does not match the checksum, it will be resumed. El fitxer descarregat no concorda amb la suma de verificació. Es reintentarà. diff --git a/translations/client_cs.ts b/translations/client_cs.ts index 8f929db1b..6c73f1bae 100644 --- a/translations/client_cs.ts +++ b/translations/client_cs.ts @@ -135,8 +135,8 @@ - - + + Cancel Zrušit @@ -166,184 +166,184 @@ Účet - + Choose what to sync Vybrat co sesynchronizovat - + Force sync now Vynutit synchronizaci nyní - + Restart sync Restartovat synchronizaci - + Remove folder sync connection Odstranit připojení synchronizace adresáře - + Folder creation failed Vytvoření adresáře selhalo - + <p>Could not create local folder <i>%1</i>. <p>Nelze vytvořit místní adresář <i>%1</i>. - + Confirm Folder Sync Connection Removal Potvrdit odstranění připojení synchronizace adresáře - + Remove Folder Sync Connection Odstranit připojení synchronizace adresáře - + Sync Running Synchronizace probíhá - + The syncing operation is running.<br/>Do you want to terminate it? Operace synchronizace právě probíhá.<br/>Přejete si ji ukončit? - + %1 in use %1 používaný - + %1 as <i>%2</i> %1 jako <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. Server verze %1 je zastaralý a nepodporovaný! Pokračujte na vlastní riziko. - + Connected to %1. Připojeno k %1. - + Server %1 is temporarily unavailable. Server %1 je dočasně nedostupný. - + Server %1 is currently in maintenance mode. server %1 je v režimu údržby. - + Signed out from %1. Odhlášeno z %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... Připojeno k %1... - + No connection to %1 at %2. Bez připojení k %1 na %2. - + Log in Přihlásit - + There are folders that were not synchronized because they are too big: Tyto složky nebyly synchronizovány, protože jsou příšliš velké: - + There are folders that were not synchronized because they are external storages: Tyto složky nebyly synchronizovány, protože se nachází na externím úložišti: - + There are folders that were not synchronized because they are too big or external storages: Tyto složky nebyly synchronizovány, protože jsou příliš velké, nebo se nachází na externím úložišti: - + Confirm Account Removal Potvrdit odstranění účtu - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Opravdu chcete odstranit připojení k účtu <i>%1</i>?</p><p><b>Poznámka:</b> Toto <b>neodstraní</b> žádné soubory.</p> - + Remove connection Odstranit připojení - - + + Open folder Otevřít adresář - + Log out Odhlásit se - + Resume sync Pokračovat v synchronizaci - + Pause sync Pozastavit synchronizaci - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Opravdu chcete zastavit synchronizaci adresáře <i>%1</i>?</p><p><b>Poznámka:</b> Toto <b>neodstraní</b> žádné soubory.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. Používaných %1 (%3%) z %2. Některé adresáře včetně připojených síťových nebo sdílených adresářů mohou mít odlišné limity. - + %1 of %2 in use Používaných %1 z %2 - + Currently there is no storage usage information available. Momentálně nejsou k dispozici žádné informace o využití úložiště. - + No %1 connection configured. Žádné spojení s %1 nenastaveno. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured Žádný účet ownCloud nenastaven - + The configured server for this client is too old Server nastavený pro tohoto klienta je příliš starý - + Please update to the latest server and restart the client. Aktualizujte prosím na poslední verzi serveru a restartujte klienta. - + Authentication error: Either username or password are wrong. Chyba ověření: Uživatelské jméno nebo heslo není správné. - + timeout vypršel časový interval - + The provided credentials are not correct Poskytnuté přihlašovací údaje nejsou správné @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Zrušeno uživatelem @@ -941,12 +941,12 @@ Pokračováním v synchronizaci způsobí přepsání všech vašich souborů st Přidat synchronizaci adresáře - + Synchronizing with local folder Synchronizace s místním adresářem - + File Soubor @@ -1094,12 +1094,12 @@ Pokračováním v synchronizaci způsobí přepsání všech vašich souborů st OCC::FolderWizard - + Add Folder Sync Connection Přidat synchronizaci adresáře - + Add Sync Connection Přidat synchronizační připojení @@ -1107,17 +1107,17 @@ Pokračováním v synchronizaci způsobí přepsání všech vašich souborů st OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Kliknutím zvolíte místní adresář k synchronizaci. - + Enter the path to the local folder. Zadejte cestu k místnímu adresáři. - + Select the source folder Zvolte zdrojový adresář @@ -1125,47 +1125,47 @@ Pokračováním v synchronizaci způsobí přepsání všech vašich souborů st OCC::FolderWizardRemotePath - + Create Remote Folder Vytvořit vzdálený adresář - + Enter the name of the new folder to be created below '%1': Zadejte název nově vytvářeného adresáře níže '%1': - + Folder was successfully created on %1. Adresář byl úspěšně vytvořen na %1. - + Authentication failed accessing %1 Ověření selhalo při připojení %1 - + Failed to create the folder on %1. Please check manually. Na %1 selhalo vytvoření adresáře. Zkontrolujte to prosím ručně. - + Failed to list a folder. Error: %1 Chyba při vypsání adresáře. Chyba: %1 - + Choose this to sync the entire account Zvolte toto k provedení synchronizace celého účtu - + This folder is already being synced. Tento adresář je již synchronizován. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Již synchronizujete adresář <i>%1</i>, který je adresáři <i>%2</i> nadřazený. @@ -1173,12 +1173,12 @@ Pokračováním v synchronizaci způsobí přepsání všech vašich souborů st OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Varování:</b> %1 - + <b>Warning:</b> <b>Varování:</b> @@ -2709,33 +2709,33 @@ Nedoporučuje se jí používat. - + Delete Smazat - + Open link in browser Otevřít odkaz v prohlížeči - + Copy link to clipboard - + Copy link to clipboard (direct download) - + Send link by email Poslat odkaz emailem - + Send link by email (direct download) @@ -2869,12 +2869,12 @@ Nedoporučuje se jí používat. OCC::ShibbolethCredentials - + Login Error Chyba přihlášení - + You must sign in as user %1 Musíte se přihlásit jako uživatel %1 @@ -3219,38 +3219,38 @@ Nedoporučuje se jí používat. Hierarchie složek je příliš hluboká - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Je dostupných pouze %1, pro spuštění je potřeba alespoň %2 - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder Není povoleno, protože nemáte oprávnění vytvořit nadřazený adresář - + Not allowed because you don't have permission to add files in that folder Není povoleno, protože nemáte oprávnění přidávat soubory do tohoto adresáře - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3340,89 +3340,94 @@ Nedoporučuje se jí používat. Jméno souboru je příliš dlouhé. - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. Nevyřešený konflikt. - + Stat failed. Stat selhal. - + Filename encoding is not valid Kódování znaků jména soubor je neplatné - + Invalid characters, please rename "%1" Neplatné znaky, prosím přejmenujte "%1" - + Unable to read the blacklist from the local database Nelze načíst blacklist z místní databáze - + Unable to read from the sync journal. Nelze číst ze žurnálu synchronizace. - + Cannot open the sync journal Nelze otevřít synchronizační žurnál - + File name contains at least one invalid character Jméno souboru obsahuje alespoň jeden neplatný znak - - + + Ignored because of the "choose what to sync" blacklist Ignorováno podle nastavení "vybrat co synchronizovat" - + Not allowed because you don't have permission to add subfolders to that folder Není povoleno, protože nemáte oprávnění přidávat podadresáře do tohoto adresáře - + Not allowed to upload this file because it is read-only on the server, restoring Není povoleno nahrát tento soubor, protože je na serveru uložen pouze pro čtení, obnovuji - - + + Not allowed to remove, restoring Odstranění není povoleno, obnovuji - + Local files and share folder removed. Místní soubory a sdílený adresář byly odstraněny. - + Move not allowed, item restored Přesun není povolen, položka obnovena - + Move not allowed because %1 is read-only Přesun není povolen, protože %1 je pouze pro čtení - + the destination cílové umístění - + the source zdroj @@ -3464,17 +3469,17 @@ Nedoporučuje se jí používat. OCC::ValidateChecksumHeader - + The checksum header is malformed. Hlavička kontrolního součtu je poškozena. - + The checksum header contained an unknown checksum type '%1' Hlavička kontrolního součtu obsahovala neznámý typ součtu '%1' - + The downloaded file does not match the checksum, it will be resumed. Stažený soubor neodpovídá kontrolnímu součtu, bude znovu stažen. diff --git a/translations/client_de.ts b/translations/client_de.ts index abaeae559..40ef6dd31 100644 --- a/translations/client_de.ts +++ b/translations/client_de.ts @@ -135,8 +135,8 @@ - - + + Cancel Abbrechen @@ -166,184 +166,184 @@ Benutzerkonto - + Choose what to sync Zu synchronisierende Elemente auswählen - + Force sync now Synchronisation jetzt erzwingen - + Restart sync Synchronisation neustarten - + Remove folder sync connection Ordner-Synchronisation entfernen - + Folder creation failed Anlegen des Ordners fehlgeschlagen - + <p>Could not create local folder <i>%1</i>. <p>Konnte lokalen Ordner <i>%1</i> nicht anlegen. - + Confirm Folder Sync Connection Removal Bestätigen Sie die Löschung der Ordner-Synchronisation - + Remove Folder Sync Connection Ordner-Synchronisation entfernen - + Sync Running Synchronisation läuft - + The syncing operation is running.<br/>Do you want to terminate it? Die Synchronisation läuft gerade.<br/>Wollen Sie sie beenden? - + %1 in use %1 wird verwendet - + %1 as <i>%2</i> %1 als <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. Die Serververision %1 ist alt und nicht unterstützt! Fortfahren auf eigenes Risiko. - + Connected to %1. Verbunden mit %1. - + Server %1 is temporarily unavailable. Server %1 ist derzeit nicht verfügbar. - + Server %1 is currently in maintenance mode. Server %1 befindet sich im Wartungsmodus. - + Signed out from %1. Abgemeldet von %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Berechtigung vom Browser einholen. <a href='%1'> Hier klicken </a> zum nochmaligen Öffnen des Browsers. - + Connecting to %1... Verbinde mit %1... - + No connection to %1 at %2. Keine Verbindung zu %1 auf %2 - + Log in Einloggen - + There are folders that were not synchronized because they are too big: Einige Verzeichnisse konnten nicht synchronisiert werden, da sie zu groß sind: - + There are folders that were not synchronized because they are external storages: Es gibt Verzeichnisse, die nicht synchronisiert werden konnten, da diese externe Speicher sind: - + There are folders that were not synchronized because they are too big or external storages: Es gibt Verzeichnisse, die nicht synchronisiert werden konnten, da diese zu groß oder externe Speicher sind: - + Confirm Account Removal Konto wirklich entfernen? - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Wollen Sie wirklich die Verbindung zum Konto <i>%1</i> lösen?</p><p><b>Anmerkung:</b> Dieser Vorgang wird <b>keine</b> Dateien löschen.</p> - + Remove connection Verbindung entfernen - - + + Open folder Ordner öffnen - + Log out Abmelden - + Resume sync Synchronisation fortsetzen - + Pause sync Synchronisation pausieren - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Möchten Sie den Ordner <i>%1</i> wirklich nicht mehr synchronisieren?</p><p><b>Anmerkung:</b> Dies wird <b>keine</b> Dateien löschen.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) von %2 Serverkapazität verwendet. Einige Ordner, einschließlich über das Netzwerk verbundene oder freigegebene Ordner oder geteilte Ordner können unterschiedliche Beschränkungen aufweisen. - + %1 of %2 in use %1 von %2 Serverkapazität verwendet - + Currently there is no storage usage information available. Derzeit sind keine Speichernutzungsinformationen verfügbar. - + No %1 connection configured. Keine %1-Verbindung konfiguriert. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured Kein ownCloud-Konto konfiguriert - + The configured server for this client is too old Der konfigurierte Server ist für diesen Client zu alt - + Please update to the latest server and restart the client. Aktualisieren Sie auf die letzte Server-Version und starten Sie den Client neu. - + Authentication error: Either username or password are wrong. Authentifizierungsfehler: Entweder der Benutzername oder das Passwort sind falsch. - + timeout Zeitüberschreitung - + The provided credentials are not correct Die zur Verfügung gestellten Anmeldeinformationen sind nicht korrekt @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Abbruch durch den Benutzer @@ -943,12 +943,12 @@ Wenn diese Synchronisation fortgesetzt wird, werden Dateien eventuell von älter Ordner-Synchronisation hinzufügen - + Synchronizing with local folder Synchronisiere mit lokalem Verzeichnis - + File Datei @@ -1096,12 +1096,12 @@ Wenn diese Synchronisation fortgesetzt wird, werden Dateien eventuell von älter OCC::FolderWizard - + Add Folder Sync Connection Ordner-Synchronisation hinzufügen - + Add Sync Connection Ordner-Synchronisation hinzufügen @@ -1109,17 +1109,17 @@ Wenn diese Synchronisation fortgesetzt wird, werden Dateien eventuell von älter OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Zur Auswahl eines lokalen Verzeichnisses für die Synchronisation klicken. - + Enter the path to the local folder. Pfad zum lokalen Verzeichnis eingeben - + Select the source folder Den Quellordner wählen @@ -1127,47 +1127,47 @@ Wenn diese Synchronisation fortgesetzt wird, werden Dateien eventuell von älter OCC::FolderWizardRemotePath - + Create Remote Folder Entfernten Ordner erstellen - + Enter the name of the new folder to be created below '%1': Geben Sie den Namen des neuen, unter '%1' zu erstellenden Ordners ein: - + Folder was successfully created on %1. Order erfolgreich auf %1 erstellt. - + Authentication failed accessing %1 Beim Zugriff auf %1 ist die Authentifizierung fehlgeschlagen - + Failed to create the folder on %1. Please check manually. Die Erstellung des Ordners auf %1 ist fehlgeschlagen. Bitte prüfen Sie dies manuell. - + Failed to list a folder. Error: %1 Konnte Ordner nicht listen. Fehler: %1 - + Choose this to sync the entire account Wählen Sie dies, um das gesamte Konto zu synchronisieren - + This folder is already being synced. Dieser Ordner wird bereits synchronisiert. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Sie synchronisieren bereits <i>%1</i>, das ein übergeordneten Ordner von <i>%2</i> ist. @@ -1175,12 +1175,12 @@ Wenn diese Synchronisation fortgesetzt wird, werden Dateien eventuell von älter OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Warnung:</b> %1 - + <b>Warning:</b> <b>Warnung:</b> @@ -1695,12 +1695,12 @@ Objekte, bei denen Löschen erlaubt ist, werden gelöscht, wenn sie die Löschun There was an error accessing the 'token' endpoint: <br><em>%1</em> - + Beim Zugriff auf den 'token' Endpunkt trat ein Fehler auf: <br><em>%1</em> Could not parse the JSON returned from the server: <br><em>%1</em> - + Die JSON Antwort des Servers konnte nicht reparst werden: <br><em>%1</em> @@ -1715,7 +1715,7 @@ Objekte, bei denen Löschen erlaubt ist, werden gelöscht, wenn sie die Löschun <h1>Wrong user</h1><p>You logged-in with user <em>%1</em>, but must login with user <em>%2</em>.<br>Please log out of %3 in another tab, then <a href='%4'>click here</a> and log in as user %2</p> - + <h1>Falscher Benutzer</h1><p>Sieh aben sich mit dem Benutzer <em>%1</em> angemeldet, sollten sich jedoch mit dem Benutzer <em>%2</em> anmelden. <br>Bitte melden Sie sich in einem anderen Tab von %3 ab und <a href='%4'>klicken Sie hier</a> um sich als %2</p> anzumelden @@ -1960,7 +1960,7 @@ Es ist nicht ratsam, diese zu benutzen. The server reported the following error: - + Der Server meldete folgenden Fehler: @@ -2710,45 +2710,45 @@ Es ist nicht ratsam, diese zu benutzen. Öffentlichen Link zum Teilen erstellen - + Delete Löschen - + Open link in browser Link im Browser öffnen - + Copy link to clipboard Link in Zwischenablage kopieren - + Copy link to clipboard (direct download) Link in die Zwischenablage kopieren (direkter download) - + Send link by email Link als E-Mail verschicken - + Send link by email (direct download) Link per Email senden (direkter download) Confirm Link Share Deletion - + Löschung des öffentlichen Links bestätigen <p>Do you really want to delete the public link share <i>%1</i>?</p><p>Note: This action cannot be undone.</p> - + <p>Möchte Sie wirklich den öffentlichen Link <i>%1 </i>löschen?<p>Hinweis: Dies kann nicht rückgängig gemacht werden.</p> @@ -2763,7 +2763,7 @@ Es ist nicht ratsam, diese zu benutzen. Delete link share - + Öffentlichen Link löschen @@ -2791,7 +2791,7 @@ Es ist nicht ratsam, diese zu benutzen. <html><head/><body><p>You can direct people to this shared file or folder <a href="private link menu"><span style=" text-decoration: underline; color:#0000ff;">by giving them a private link</span></a>.</p></body></html> - + <html><head/><body><p>Sie können Leute direkt zu dieser Freigabe leiten<a href="private link menu"><span style=" text-decoration: underline; color:#0000ff;">, wenn Sie Ihnen einen privaten Link</span></a>gibst.</p></body></html> @@ -2870,12 +2870,12 @@ Es ist nicht ratsam, diese zu benutzen. OCC::ShibbolethCredentials - + Login Error Log-In Fehler - + You must sign in as user %1 Sie müssen sich als %1 einloggen @@ -3220,38 +3220,38 @@ Es ist nicht ratsam, diese zu benutzen. Ordnerhierarchie ist zu tief - + Conflict: Server version downloaded, local copy renamed and not uploaded. Konflikt: Serverversion heruntergeladen, lokale Kopie umbenannt und nicht hochgeladen. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Nur %1 sind verfügbar. Zum Beginnen werden mindestens %2 benötigt. - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Öffnen oder erstellen der Sync-Datenbank nicht möglich. Bitte sicherstellen, dass Schreibrechte für den zu synchronisierenden Ordner existieren. - + Not allowed because you don't have permission to add parent folder Nicht erlaubt, da Sie keine Rechte zur Erstellung von Unterordnern haben - + Not allowed because you don't have permission to add files in that folder Nicht erlaubt, da Sie keine Rechte zum Hinzufügen von Dateien in diesen Ordner haben - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + Der freie Speicherplatz wird knapp: Downloads, die den freien Speicher unter %1 senken, wurden ausgelassen. - + There is insufficient space available on the server for some uploads. Auf dem Server ist für einige Dateien zum Hochladen nicht genug Platz. @@ -3341,89 +3341,94 @@ Es ist nicht ratsam, diese zu benutzen. Der Dateiname ist zu lang. - + + The filename cannot be encoded on your file system. + Der Dateiname kann auf Ihrem Dateisystem nicht entschlüsselt werden. + + + Unresolved conflict. Ungelöster Konflikt. - + Stat failed. Stat fehlgeschlagen. - + Filename encoding is not valid Dateikodierung ist ungültig - + Invalid characters, please rename "%1" Ungültige Zeichenm bitte benennen Sie "%1" um - + Unable to read the blacklist from the local database Fehler beim Einlesen der Blacklist aus der lokalen Datenbank - + Unable to read from the sync journal. Fehler beim Einlesen des Synchronisierungsprotokolls. - + Cannot open the sync journal Synchronisationsbericht kann nicht geöffnet werden - + File name contains at least one invalid character Der Dateiname enthält mindestens ein ungültiges Zeichen - - + + Ignored because of the "choose what to sync" blacklist Aufgrund der »Zu synchronisierende Elemente auswählen«-Sperrliste ignoriert - + Not allowed because you don't have permission to add subfolders to that folder Nicht erlaubt, da Sie keine Rechte zur Erstellung von Unterordnern haben - + Not allowed to upload this file because it is read-only on the server, restoring Das Hochladen dieser Datei ist nicht erlaubt, da die Datei auf dem Server schreibgeschützt ist, Wiederherstellung - - + + Not allowed to remove, restoring Löschen nicht erlaubt, Wiederherstellung - + Local files and share folder removed. Lokale Dateien und Freigabeordner wurden entfernt. - + Move not allowed, item restored Verschieben nicht erlaubt, Element wiederhergestellt - + Move not allowed because %1 is read-only Verschieben nicht erlaubt, da %1 schreibgeschützt ist - + the destination Das Ziel - + the source Die Quelle @@ -3465,17 +3470,17 @@ Es ist nicht ratsam, diese zu benutzen. OCC::ValidateChecksumHeader - + The checksum header is malformed. Der Prüfsummen-Header hat ein fehlerhaftes Format. - + The checksum header contained an unknown checksum type '%1' Die Prüfsummen-Kopfzeile enthielt den unbekannten Prüfsummentypen '%1'. - + The downloaded file does not match the checksum, it will be resumed. Die heruntergeladene Datei entspricht nicht der Prüfsumme, das Herunterladen wird wiederaufgenommen. diff --git a/translations/client_el.ts b/translations/client_el.ts index 784110a36..c4ed10508 100644 --- a/translations/client_el.ts +++ b/translations/client_el.ts @@ -135,8 +135,8 @@ - - + + Cancel Άκυρο @@ -166,184 +166,184 @@ Λογαριασμός - + Choose what to sync Επιλέξτε τι θα συγχρονιστεί - + Force sync now Εξαναγκασμός συγχρονισμού τώρα - + Restart sync Επανεκκίνηση συγχρονισμού - + Remove folder sync connection Αφαίρεση σύνδεσης συγχρονισμού φακέλου - + Folder creation failed Αποτυχία αφαίρεσης φακέλου - + <p>Could not create local folder <i>%1</i>. <p>Αδυναμία δημιουργίας τοπικού φακέλου <i>%1</i>. - + Confirm Folder Sync Connection Removal Επιβεβαίωση αφαίρεσης σύνδεσης συγχρονισμού φακέλου - + Remove Folder Sync Connection Αφαίρεση σύνδεσης συγχρονισμού φακέλου - + Sync Running Εκτελείται Συγχρονισμός - + The syncing operation is running.<br/>Do you want to terminate it? Η λειτουργία συγχρονισμού εκτελείται.<br/> Θέλετε να την τερματίσετε; - + %1 in use %1 σε χρήση - + %1 as <i>%2</i> %1 ως <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. Η έκδοση του διακομιστή %1 είναι παλιά και δεν υποστηρίζεται! Προχωρείστε με δική σας ευθύνη. - + Connected to %1. Συνδεδεμένο με %1. - + Server %1 is temporarily unavailable. Ο διακομιστής %1 δεν είναι διαθέσιμος προσωρινά. - + Server %1 is currently in maintenance mode. - + Signed out from %1. Αποσυνδέθηκε από %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... Σύνδεση σε %1... - + No connection to %1 at %2. Δεν υπάρχει σύνδεση με το %1 στο %2. - + Log in Είσοδος - + There are folders that were not synchronized because they are too big: Υπάρχουν φάκελοι που δεν συγχρονίστηκαν επειδή είναι πολύ μεγάλοι: - + There are folders that were not synchronized because they are external storages: Υπάρχουν φάκελοι που δεν συγχρονίστηκαν επειδή είναι εξωτερικοί αποθηκευτικοί χώροι: - + There are folders that were not synchronized because they are too big or external storages: Υπάρχουν φάκελοι που δεν συγχρονίστηκαν επειδή είναι πολύ μεγάλοι ή αποθηκευτικοί χώροι: - + Confirm Account Removal Επιβεβαίωση Αφαίρεσης Λογαριασμού - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Θέλετε πραγματικά να αφαιρέσετε τη σύνδεση με το λογαριασμό <i>%1</i>;</p><p><b>Σημείωση:</b> Αυτό <b>δεν</b> θα διαγράψει κανένα αρχείο.</p> - + Remove connection Αφαίρεση σύνδεσης - - + + Open folder Άνοιγμα φακέλου - + Log out Αποσύνδεση - + Resume sync Συνέχιση συγχρονισμού - + Pause sync Παύση συγχρονισμού - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Θέλετε πραγματικά να σταματήσετε το συγχρονισμό του φακέλου <i>%1</i>;</p><p><b>Σημείωση:</b> Αυτό <b>δεν</b> θα διαγράψει κανένα αρχείο.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) από %2 σε χρήση. Μερικοί φάκελοι, συμπεριλαμβανομένων των δικτυακών ή των κοινόχρηστων μπορεί να έχουν διαφορετικά όρια. - + %1 of %2 in use %1 από %2 σε χρήση - + Currently there is no storage usage information available. Προς το παρόν δεν υπάρχουν πληροφορίες χρήσης χώρου αποθήκευσης διαθέσιμες. - + No %1 connection configured. Δεν έχει ρυθμιστεί σύνδεση με το %1. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured Δεν έχει ρυθμιστεί λογαριασμός ownCloud - + The configured server for this client is too old Ο ρυθμισμένος διακομιστής για αυτό το δέκτη είναι πολύ παλιός - + Please update to the latest server and restart the client. Παρακαλώ ενημερώστε το διακομιστή στη νεώτερη έκδοση και επανεκκινήστε το δέκτη. - + Authentication error: Either username or password are wrong. Σφάλμα Πιστοποίησης: Το όνομα χρήστη ή ο κωδικός πρόσβασης είναι λανθασμένα. - + timeout παρέλευση χρονικού ορίου - + The provided credentials are not correct Τα παρεχόμενα διαπιστευτήρια δεν είναι σωστά @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Ματαιώθηκε από το χρήστη @@ -943,12 +943,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an Προσθήκη σύνδεσης συγχρονισμού φακέλου - + Synchronizing with local folder Συγχρονισμός με τοπικό φάκελο - + File Αρχείο @@ -1096,12 +1096,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizard - + Add Folder Sync Connection Προσθήκη Σύνδεσης Συγχρονισμού Φακέλου - + Add Sync Connection Προσθήκη Σύνδεσης Συγχρονισμού @@ -1109,17 +1109,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Κλικάρετε για να επιλέξετε έναν τοπικό φάκελο προς συγχρονισμό. - + Enter the path to the local folder. Εισάγετε τη διαδρομή προς τον τοπικό φάκελο. - + Select the source folder Επιλογή του φακέλου προέλευσης @@ -1127,47 +1127,47 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardRemotePath - + Create Remote Folder Δημιουργία Απομακρυσμένου Φακέλου - + Enter the name of the new folder to be created below '%1': Εισάγετε το όνομα του νέου φακέλου που θα δημιουργηθεί παρακάτω '%1': - + Folder was successfully created on %1. Επιτυχής δημιουργία φακέλου στο %1. - + Authentication failed accessing %1 Η πιστοποίηση απέτυχε κατά την πρόσβαση %1 - + Failed to create the folder on %1. Please check manually. Αποτυχία δημιουργίας φακέλου στο %1. Παρακαλώ ελέγξτε χειροκίνητα. - + Failed to list a folder. Error: %1 Αδυναμία εμφάνισης ενός φακέλου. Σφάλμα: %1 - + Choose this to sync the entire account Επιλέξτε να συγχρονίσετε ολόκληρο το λογαριασμό - + This folder is already being synced. Αυτός ο φάκελος συγχρονίζεται ήδη. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Ο φάκελος <i>%1</i>, ο οποίος είναι γονεϊκός φάκελος του <i>%2</i>, συγχρονίζεται ήδη. @@ -1175,12 +1175,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Προειδοποίηση:</b> %1 - + <b>Warning:</b> <b>Προειδοποίηση:</b> @@ -2711,33 +2711,33 @@ It is not advisable to use it. - + Delete Διαγραφή - + Open link in browser Άνοιγμα συνδέσμου στον περιηγητή - + Copy link to clipboard Αντιγραφή συνδέσμου στο πρόχειρο - + Copy link to clipboard (direct download) - + Send link by email Αποστολή συνδέσμου με αλληλογραφία - + Send link by email (direct download) @@ -2871,12 +2871,12 @@ It is not advisable to use it. OCC::ShibbolethCredentials - + Login Error Σφάλμα Σύνδεσης - + You must sign in as user %1 Πρέπει να εισέλθετε σαν χρήστης %1 @@ -3221,38 +3221,38 @@ It is not advisable to use it. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Μόνο %1 είναι διαθέσιμα, απαιτούνται τουλάχιστον %2 για την εκκίνηση - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder Δεν επιτρέπεται επειδή δεν έχετε δικαιώματα να προσθέσετε γονικό κατάλογο - + Not allowed because you don't have permission to add files in that folder Δεν επιτρέπεται επειδή δεν έχετε δικαιώματα να προσθέσετε αρχεία σε αυτόν τον φάκελο - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3342,89 +3342,94 @@ It is not advisable to use it. Το όνομα αρχείου είνια πολύ μεγάλο. - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. - + Stat failed. Απέτυχε. - + Filename encoding is not valid Η κωδικοποίηση του ονόματος αρχείου δεν είναι έγκυρη - + Invalid characters, please rename "%1" Μη έγκυροι χαρακτήρες, παρακαλώ μετονομάστε το "%1" - + Unable to read the blacklist from the local database Αδυναμία ανάγνωσης της μαύρης λίστας από την τοπική βάση δεδομένων - + Unable to read from the sync journal. Αδυναμία ανάγνωσης από το ημερολόγιο συγχρονισμού. - + Cannot open the sync journal Αδυναμία ανοίγματος του αρχείου συγχρονισμού - + File name contains at least one invalid character Το όνομα αρχείου περιέχει έναν τουλάχιστον μη έγκυρο χαρακτήρα - - + + Ignored because of the "choose what to sync" blacklist Αγνοήθηκε εξαιτίας της μαύρης λίστας "διάλεξε τι να συγχρονιστεί" - + Not allowed because you don't have permission to add subfolders to that folder Δεν επιτρέπεται επειδή δεν έχετε δικαιώματα να προσθέσετε υποφακέλους σε αυτό τον φάκελο - + Not allowed to upload this file because it is read-only on the server, restoring Δεν επιτρέπεται να μεταφορτώσετε αυτό το αρχείο επειδή είναι μόνο για ανάγνωση στο διακομιστή, αποκατάσταση σε εξέλιξη - - + + Not allowed to remove, restoring Δεν επιτρέπεται η αφαίρεση, αποκατάσταση σε εξέλιξη - + Local files and share folder removed. Οι τοπικοί φάκελοι και ο φάκελος κοινής χρήσης αφαιρέθηκαν. - + Move not allowed, item restored Η μετακίνηση δεν επιτρέπεται, το αντικείμενο αποκαταστάθηκε - + Move not allowed because %1 is read-only Η μετακίνηση δεν επιτρέπεται επειδή το %1 είναι μόνο για ανάγνωση - + the destination ο προορισμός - + the source η προέλευση @@ -3466,17 +3471,17 @@ It is not advisable to use it. OCC::ValidateChecksumHeader - + The checksum header is malformed. Η κεφαλίδα του αθροίσματος ελέγχου δεν είναι σωστά διαμορφωμένη. - + The checksum header contained an unknown checksum type '%1' Το checksum header περιέχει άγνωστο τύπο checksum '%1' - + The downloaded file does not match the checksum, it will be resumed. Το αρχείο που μεταφορτώθηκε δεν επαληθεύει το άθροισμα ελέγχου, θα συγχρονιστεί πάλι. diff --git a/translations/client_en.ts b/translations/client_en.ts index 3c95cd1fb..b5288470d 100644 --- a/translations/client_en.ts +++ b/translations/client_en.ts @@ -137,8 +137,8 @@ - - + + Cancel @@ -168,184 +168,184 @@ - + Choose what to sync - + Force sync now - + Restart sync - + Remove folder sync connection - + Folder creation failed - + <p>Could not create local folder <i>%1</i>. - + Confirm Folder Sync Connection Removal - + Remove Folder Sync Connection - + Sync Running - + The syncing operation is running.<br/>Do you want to terminate it? - + %1 in use - + %1 as <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. - + Connected to %1. - + Server %1 is temporarily unavailable. - + Server %1 is currently in maintenance mode. - + Signed out from %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... - + No connection to %1 at %2. - + Log in - + There are folders that were not synchronized because they are too big: - + There are folders that were not synchronized because they are external storages: - + There are folders that were not synchronized because they are too big or external storages: - + Confirm Account Removal - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection - - + + Open folder - + Log out - + Resume sync - + Pause sync - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. - + %1 of %2 in use - + Currently there is no storage usage information available. - + No %1 connection configured. @@ -612,32 +612,32 @@ OCC::ConnectionValidator - + No ownCloud account configured - + The configured server for this client is too old - + Please update to the latest server and restart the client. - + Authentication error: Either username or password are wrong. - + timeout - + The provided credentials are not correct @@ -645,7 +645,7 @@ OCC::DiscoveryMainThread - + Aborted by the user @@ -963,12 +963,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an - + Synchronizing with local folder - + File @@ -1119,12 +1119,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizard - + Add Folder Sync Connection - + Add Sync Connection @@ -1132,17 +1132,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardLocalPath - + Click to select a local folder to sync. - + Enter the path to the local folder. - + Select the source folder @@ -1150,47 +1150,47 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardRemotePath - + Create Remote Folder - + Enter the name of the new folder to be created below '%1': - + Folder was successfully created on %1. - + Authentication failed accessing %1 - + Failed to create the folder on %1. Please check manually. - + Failed to list a folder. Error: %1 - + Choose this to sync the entire account - + This folder is already being synced. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. @@ -1198,12 +1198,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 - + <b>Warning:</b> @@ -2730,33 +2730,33 @@ It is not advisable to use it. - + Delete - + Open link in browser - + Copy link to clipboard - + Copy link to clipboard (direct download) - + Send link by email - + Send link by email (direct download) @@ -2890,12 +2890,12 @@ It is not advisable to use it. OCC::ShibbolethCredentials - + Login Error - + You must sign in as user %1 @@ -3238,38 +3238,38 @@ It is not advisable to use it. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder - + Not allowed because you don't have permission to add files in that folder - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3359,89 +3359,94 @@ It is not advisable to use it. - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. - + Stat failed. - + Filename encoding is not valid - + Invalid characters, please rename "%1" - + Unable to read the blacklist from the local database - + Unable to read from the sync journal. - + Cannot open the sync journal - + File name contains at least one invalid character - - + + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed to upload this file because it is read-only on the server, restoring - - + + Not allowed to remove, restoring - + Local files and share folder removed. - + Move not allowed, item restored - + Move not allowed because %1 is read-only - + the destination - + the source @@ -3483,17 +3488,17 @@ It is not advisable to use it. OCC::ValidateChecksumHeader - + The checksum header is malformed. - + The checksum header contained an unknown checksum type '%1' - + The downloaded file does not match the checksum, it will be resumed. diff --git a/translations/client_es.ts b/translations/client_es.ts index bd3943363..f5588ea94 100644 --- a/translations/client_es.ts +++ b/translations/client_es.ts @@ -135,8 +135,8 @@ - - + + Cancel Cancelar @@ -166,184 +166,184 @@ Cuenta - + Choose what to sync Elija qué sincronizar - + Force sync now Forzar la sincronización ahora - + Restart sync Reiniciar sync - + Remove folder sync connection Eliminar la sincronización de carpetas conectadas - + Folder creation failed Hubo un fallo al crear la carpeta - + <p>Could not create local folder <i>%1</i>. <p>No se pudo crear la carpeta local <i>%1</i>. - + Confirm Folder Sync Connection Removal Confirme la sincronización para la eliminación de la carpeta conectada - + Remove Folder Sync Connection Eliminar carpeta de sincronización conectada - + Sync Running Sincronización en curso - + The syncing operation is running.<br/>Do you want to terminate it? La sincronización está en curso.<br/>¿Desea interrumpirla? - + %1 in use %1 en uso - + %1 as <i>%2</i> %1 como <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. La versión del servidor %1 es antigua, ¡y no está soportada! Si continúas, lo haces bajo tu propio riesgo. - + Connected to %1. Conectado a %1. - + Server %1 is temporarily unavailable. Servidor %1 no está disponible temporalmente. - + Server %1 is currently in maintenance mode. El servidor %1 está actualmente en modo mantenimiento. - + Signed out from %1. Cerró sesión desde %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Obteniendo autorización desde el navegador. <a href='%1'>Haga click aqui</a> para re-abrir el navegador . - + Connecting to %1... Conectando a %1... - + No connection to %1 at %2. Sin conexión a %1 en %2. - + Log in Iniciar sesión - + There are folders that were not synchronized because they are too big: Hay carpetas que no fueron sincronizadas porque son demasiado grandes: - + There are folders that were not synchronized because they are external storages: Hay carpetas que no fueron sincronizadas porque residen en almacenamiento externo: - + There are folders that were not synchronized because they are too big or external storages: Hay carpetas que no fueron sincronizadas porque son demasiado grandes o residen en almacenes externos: - + Confirm Account Removal Confirmar eliminación de cuenta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿De verdad quiere eliminar la conexión a la cuenta <i>%1</i>?</p><p><b>Nota:</b> Esto <b>no</b> eliminará los archivos.</p> - + Remove connection Eliminar conexión - - + + Open folder Abrir carpeta - + Log out Cerrar sesión - + Resume sync Continuar sincronización - + Pause sync Pausar sincronización - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿De verdad quiere dejar de sincronizar la carpeta <i>%1</i>?</p><p><b>Nota:</b> Esto <b>no</b> elminará los archivo.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) de %2 en uso. Algunas carpetas, como carpetas de red o compartidas, podrían tener límites diferentes. - + %1 of %2 in use %1 de %2 en uso - + Currently there is no storage usage information available. Actualmente no hay información disponible sobre el uso de almacenamiento. - + No %1 connection configured. No hay ninguna conexión de %1 configurada. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured No se ha configurado ninguna cuenta de ownCloud - + The configured server for this client is too old La configuración del servidor para este cliente está obsoleta - + Please update to the latest server and restart the client. Por favor, actualice a la última versión del servidor y reinicie el cliente - + Authentication error: Either username or password are wrong. Error de autenticación: El usuario o la contraseña son incorrectos - + timeout tiempo de espera - + The provided credentials are not correct Las credenciales proporcionadas no son correctas @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Interrumpido por el usuario @@ -943,12 +943,12 @@ Si continua con la sincronización todos los archivos serán remplazados por su Añadir Conexión para el Directorio de Sincronización - + Synchronizing with local folder Sincronizando con carpeta local - + File Archivo @@ -1096,12 +1096,12 @@ Si continua con la sincronización todos los archivos serán remplazados por su OCC::FolderWizard - + Add Folder Sync Connection Añadir Conexión para el Directorio de Sincronización - + Add Sync Connection Añadir Sincronización de Conexión @@ -1109,17 +1109,17 @@ Si continua con la sincronización todos los archivos serán remplazados por su OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Haga clic para seleccionar una carpeta local para sincronizar. - + Enter the path to the local folder. Ingrese la ruta de la carpeta local. - + Select the source folder Seleccione la carpeta de origen @@ -1127,47 +1127,47 @@ Si continua con la sincronización todos los archivos serán remplazados por su OCC::FolderWizardRemotePath - + Create Remote Folder Crear carpeta remota - + Enter the name of the new folder to be created below '%1': Introduzca más abajo el nombre de la nueva carpeta que crear '%1': - + Folder was successfully created on %1. La carpeta fue creada con éxito en %1. - + Authentication failed accessing %1 Falló la autenticación al acceder a %1 - + Failed to create the folder on %1. Please check manually. Fallo al crear la carpeta %1. Por favor, revíselo manualmente. - + Failed to list a folder. Error: %1 Falló al listar una carpeta. Error: %1 - + Choose this to sync the entire account Elija esto para sincronizar la cuenta entera - + This folder is already being synced. Este directorio ya se ha sincronizado. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Ya ha sincronizado <i>%1</i>, el cual es la carpeta de <i>%2</i>. @@ -1175,12 +1175,12 @@ Si continua con la sincronización todos los archivos serán remplazados por su OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Advertencia:</b> %1 - + <b>Warning:</b> <b>Advertencia:</b> @@ -1960,7 +1960,7 @@ No se recomienda usarla. The server reported the following error: - + El servidor informa del siguiente error: @@ -2710,45 +2710,45 @@ No se recomienda usarla. Crear un enlace público compartido - + Delete Eliminar - + Open link in browser Abrir enlace en el explorador - + Copy link to clipboard Copiar enlace al portapapeles - + Copy link to clipboard (direct download) Copiar enlace al portapapeles (descarga directa) - + Send link by email Enviar enlace por e-mail - + Send link by email (direct download) Enviar enlace por e-mail (descarga directa) Confirm Link Share Deletion - + Confirmar eliminación de enlace de recurso compartido <p>Do you really want to delete the public link share <i>%1</i>?</p><p>Note: This action cannot be undone.</p> - + <p>¿Realmente desea borrar el enlace público compartido <i>%1</i>?</p><p>Nota: Esta acción no se puede deshacer</p> @@ -2763,7 +2763,7 @@ No se recomienda usarla. Delete link share - + Borrar el enlace compartido @@ -2870,12 +2870,12 @@ No se recomienda usarla. OCC::ShibbolethCredentials - + Login Error Error al iniciar sesión - + You must sign in as user %1 Debe iniciar sesión como el usuario %1 @@ -3220,38 +3220,38 @@ No se recomienda usarla. demasiadas subcarpetas anidadas - + Conflict: Server version downloaded, local copy renamed and not uploaded. Conflicto: Versión del servidor descargada, La copia local ha sido renombrada pero no se ha podido subir. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Solo %1 disponible, se necesita por lo menos %2 para comenzar - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Imposible abrir o crear la BBDD local de sync. Asegurese de que tiene permisos de escritura en la carpeta de sync. - + Not allowed because you don't have permission to add parent folder No permitido porque no tienes permiso para añadir un directorio padre - + Not allowed because you don't have permission to add files in that folder No permitido porque no tienes permiso para añadir archivos a ese directorio - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Poco espacio libre en disco: La descarga lo reducirá por debajo del %1, deberia abortar. - + There is insufficient space available on the server for some uploads. No hay suficiente espacio libre en el servidor para algunas subidas. @@ -3341,89 +3341,94 @@ No se recomienda usarla. El nombre del archivo es demasiado largo. - + + The filename cannot be encoded on your file system. + El nombre de archivo no se puede codificar en tu sistema de archivos. + + + Unresolved conflict. Conflicto sin resolver. - + Stat failed. Stat ha fallado. - + Filename encoding is not valid Los caracteres del nombre de fichero no son válidos - + Invalid characters, please rename "%1" Caracteres inválidos, por favor renombre "%1" - + Unable to read the blacklist from the local database No se pudo leer la lista de bloqueo de la base de datos local - + Unable to read from the sync journal. No se ha podido leer desde el registro de sincronización - + Cannot open the sync journal No es posible abrir el diario de sincronización - + File name contains at least one invalid character Nombre de archivo contiene al menos un caracter no válido - - + + Ignored because of the "choose what to sync" blacklist Ignorado porque se encuentra en la lista negra de "elija qué va a sincronizar" - + Not allowed because you don't have permission to add subfolders to that folder No permitido porque no tienes permiso para añadir subdirectorios a ese directorio - + Not allowed to upload this file because it is read-only on the server, restoring No está permitido subir este archivo porque es de solo lectura en el servidor, restaurando. - - + + Not allowed to remove, restoring No está permitido borrar, restaurando. - + Local files and share folder removed. Se han eliminado los archivos locales y la carpeta compartida. - + Move not allowed, item restored No está permitido mover, elemento restaurado. - + Move not allowed because %1 is read-only No está permitido mover, porque %1 es de sólo lectura. - + the destination destino - + the source origen @@ -3449,7 +3454,7 @@ No se recomienda usarla. <p>Version %1. For more information please visit <a href='%2'>%3</a>.</p> - <p>La versión %1. Para obtener más información, visite<a href='%2'>%3</a>.</p> + <p>Versión %1. Para obtener más información, visita<a href='%2'>%3</a>.</p> @@ -3465,17 +3470,17 @@ No se recomienda usarla. OCC::ValidateChecksumHeader - + The checksum header is malformed. La cabecera del archivo de comprobación es incorrecto. - + The checksum header contained an unknown checksum type '%1' La suma de comprobación de cabeceras contenía una suma de comprobación desconocida de tipo '%1' - + The downloaded file does not match the checksum, it will be resumed. El archivo descargado no coincide con el archivo de comprobación, será reanudado. diff --git a/translations/client_es_AR.ts b/translations/client_es_AR.ts index b9f2ae1cf..5663831ad 100644 --- a/translations/client_es_AR.ts +++ b/translations/client_es_AR.ts @@ -135,8 +135,8 @@ - - + + Cancel Cancelar @@ -166,184 +166,184 @@ Cuenta - + Choose what to sync Elegir que sincronizar - + Force sync now Forzar sincronización ahora - + Restart sync Reinicia sincronización - + Remove folder sync connection Eliminar conexión de sincronización de carpeta - + Folder creation failed Falló la creacion de la carpeta - + <p>Could not create local folder <i>%1</i>. <p>No pudó ser creada la carpeta local <i>%1</i>. - + Confirm Folder Sync Connection Removal Confirmar eliminación de conexión de sincronización de carpeta - + Remove Folder Sync Connection Eliminar Conexión de Sincronización de Carpeta - + Sync Running Sincronización en curso - + The syncing operation is running.<br/>Do you want to terminate it? La sincronización está en curso.<br/>¿Querés interrumpirla? - + %1 in use %1 en uso - + %1 as <i>%2</i> %1 de <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. ¡La versión del servidor% 1 es antigua y no está soportada! Proceda bajo su propio riesgo. - + Connected to %1. Conectado a %1 - + Server %1 is temporarily unavailable. El servidor %1 esta temporalmente sin conexión - + Server %1 is currently in maintenance mode. Servidor %1 actualmente en modo mantenimiento. - + Signed out from %1. Registrado desde %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Obteniendo autorización del navegador. <a href='%1'>Click aquí</a> para volver a abrir el navegador. - + Connecting to %1... Conectando a %1... - + No connection to %1 at %2. Sin conexión a %1 desde %2. - + Log in Iniciar sesión - + There are folders that were not synchronized because they are too big: - + There are folders that were not synchronized because they are external storages: - + There are folders that were not synchronized because they are too big or external storages: - + Confirm Account Removal Confirmar la eliminación de la cuenta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection Eliminar conexión - - + + Open folder Abrir carpeta - + Log out Cerrar la sesión - + Resume sync Reanudar sincronización - + Pause sync Pausar sincronización - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Realmente quieres detener la sincronización de la carpeta <i>%1</i>?</p><p><b>Nota:</b> Esto <b>no</b> eliminara ningun archivo.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. - + %1 of %2 in use %1 de %2 en uso - + Currently there is no storage usage information available. Actualmente no hay información disponible acerca del uso del almacenamiento. - + No %1 connection configured. No hay ninguna conexión de %1 configurada. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured No hay una cuenta ownCloud configurada. - + The configured server for this client is too old La configuración del servidor al cliente es obsoleta - + Please update to the latest server and restart the client. Por favor actualice a la última versión del servidor y reinicie el cliente. - + Authentication error: Either username or password are wrong. Error de autentificación: el usuario o contraseña es incorrecta. - + timeout agotado - + The provided credentials are not correct Las credenciales otorgadas no son correctas @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Interrumpido por el usuario @@ -934,12 +934,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an - + Synchronizing with local folder - + File Archivo @@ -1087,12 +1087,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizard - + Add Folder Sync Connection - + Add Sync Connection @@ -1100,17 +1100,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Clic para seleccionar un directorio local a sincornizar - + Enter the path to the local folder. Ingrese el path al directorio local. - + Select the source folder Seleccioná el directorio origen @@ -1118,47 +1118,47 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardRemotePath - + Create Remote Folder Crear carpeta remota - + Enter the name of the new folder to be created below '%1': - + Folder was successfully created on %1. El directorio fue creado con éxito en %1. - + Authentication failed accessing %1 Autenticación fallida accediendo a %1. - + Failed to create the folder on %1. Please check manually. Fallo al crear el directorio en %1. Por favor chequee manualmente. - + Failed to list a folder. Error: %1 Fallo al listar carpetas. Error: %1 - + Choose this to sync the entire account Seleccioná acá para sincronizar la cuenta completa - + This folder is already being synced. Este folder ya está siendo sincronizado. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Ya estás sincronizando <i>%1</i>, el cual es el directorio de <i>%2</i>. @@ -1166,12 +1166,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 - + <b>Warning:</b> @@ -2698,33 +2698,33 @@ It is not advisable to use it. - + Delete Borrar - + Open link in browser - + Copy link to clipboard - + Copy link to clipboard (direct download) - + Send link by email Mandar enlace por e-mail - + Send link by email (direct download) @@ -2858,12 +2858,12 @@ It is not advisable to use it. OCC::ShibbolethCredentials - + Login Error - + You must sign in as user %1 @@ -3206,38 +3206,38 @@ It is not advisable to use it. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder - + Not allowed because you don't have permission to add files in that folder - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3327,89 +3327,94 @@ It is not advisable to use it. - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. - + Stat failed. - + Filename encoding is not valid - + Invalid characters, please rename "%1" - + Unable to read the blacklist from the local database - + Unable to read from the sync journal. - + Cannot open the sync journal - + File name contains at least one invalid character - - + + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed to upload this file because it is read-only on the server, restoring - - + + Not allowed to remove, restoring - + Local files and share folder removed. - + Move not allowed, item restored - + Move not allowed because %1 is read-only - + the destination - + the source @@ -3451,17 +3456,17 @@ It is not advisable to use it. OCC::ValidateChecksumHeader - + The checksum header is malformed. - + The checksum header contained an unknown checksum type '%1' - + The downloaded file does not match the checksum, it will be resumed. diff --git a/translations/client_et.ts b/translations/client_et.ts index 537d03caa..8830831a6 100644 --- a/translations/client_et.ts +++ b/translations/client_et.ts @@ -135,8 +135,8 @@ - - + + Cancel Loobu @@ -166,184 +166,184 @@ Konto - + Choose what to sync Vali, mida sünkroniseerida - + Force sync now - + Restart sync - + Remove folder sync connection - + Folder creation failed Kausta loomine ebaõnnestus - + <p>Could not create local folder <i>%1</i>. - + Confirm Folder Sync Connection Removal - + Remove Folder Sync Connection - + Sync Running Sünkroniseerimine on käimas - + The syncing operation is running.<br/>Do you want to terminate it? Sünkroniseerimine on käimas.<br/>Kas sa soovid seda lõpetada? - + %1 in use %1 kasutusel - + %1 as <i>%2</i> %1 as <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. - + Connected to %1. Ühendatud %1 - + Server %1 is temporarily unavailable. Server %1 pole ajutiselt saadaval. - + Server %1 is currently in maintenance mode. - + Signed out from %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... - + No connection to %1 at %2. - + Log in Logi sisse - + There are folders that were not synchronized because they are too big: - + There are folders that were not synchronized because they are external storages: - + There are folders that were not synchronized because they are too big or external storages: - + Confirm Account Removal Kinnita konto eemaldamine - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection Eemalda ühendus - - + + Open folder Ava kaust - + Log out Logi välja - + Resume sync Taasta sünroonimist - + Pause sync Peata sünkroonimine - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. - + %1 of %2 in use - + Currently there is no storage usage information available. Hetkel pole mahu kasutuse info saadaval. - + No %1 connection configured. Ühtegi %1 ühendust pole seadistatud. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured Ühtegi ownCloud kontot pole seadistatud - + The configured server for this client is too old Seadistatud server on selle kliendi jaoks liiga vana - + Please update to the latest server and restart the client. Palun uuenda server viimasele versioonile ning taaskäivita klient. - + Authentication error: Either username or password are wrong. Autentimise tõrge: Kasutajanimi või parool on vale - + timeout aegumine - + The provided credentials are not correct Sisestatud kasutajatunnused pole õiged @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Kasutaja poolt tühistatud @@ -934,12 +934,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an - + Synchronizing with local folder - + File Fail @@ -1087,12 +1087,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizard - + Add Folder Sync Connection - + Add Sync Connection @@ -1100,17 +1100,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Klõpsa valimaks kohalikku sünkroniseeritavat kataloogi. - + Enter the path to the local folder. Sisesta otsingutee kohaliku kataloogini. - + Select the source folder Vali algne kaust @@ -1118,47 +1118,47 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardRemotePath - + Create Remote Folder Loo kaugkaust - + Enter the name of the new folder to be created below '%1': - + Folder was successfully created on %1. %1 - kaust on loodud. - + Authentication failed accessing %1 - + Failed to create the folder on %1. Please check manually. Kausta loomine ebaõnnestus - %1. Palun kontrolli käsitsi. - + Failed to list a folder. Error: %1 - + Choose this to sync the entire account Vali see sünkroniseering tervele kontole - + This folder is already being synced. Seda kataloogi juba sünkroniseeritakse. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Sa juba sünkroniseerid <i>%1</i>, mis on <i>%2</i> ülemkataloog. @@ -1166,12 +1166,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Hoiatus:</b> %1 - + <b>Warning:</b> <b>Hoiatus:</b> @@ -2699,33 +2699,33 @@ Selle kasutamine pole soovitatav. - + Delete Kustuta - + Open link in browser - + Copy link to clipboard - + Copy link to clipboard (direct download) - + Send link by email Saada link e-postiga - + Send link by email (direct download) @@ -2859,12 +2859,12 @@ Selle kasutamine pole soovitatav. OCC::ShibbolethCredentials - + Login Error Sisselogimise viga - + You must sign in as user %1 Pead sisse logima kui kasutaja %1 @@ -3209,38 +3209,38 @@ Selle kasutamine pole soovitatav. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder - + Not allowed because you don't have permission to add files in that folder - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3330,89 +3330,94 @@ Selle kasutamine pole soovitatav. Faili nimi on liiga pikk. - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. - + Stat failed. - + Filename encoding is not valid Failinime kodeering pole kehtiv - + Invalid characters, please rename "%1" - + Unable to read the blacklist from the local database - + Unable to read from the sync journal. - + Cannot open the sync journal Ei suuda avada sünkroniseeringu zurnaali - + File name contains at least one invalid character Faili nimesonvähemalt üks keelatud märk - - + + Ignored because of the "choose what to sync" blacklist "Vali, mida sünkroniseerida" musta nimekirja tõttu vahele jäetud - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed to upload this file because it is read-only on the server, restoring Pole lubatud üles laadida, kuna tegemist on ainult-loetava serveriga, taastan - - + + Not allowed to remove, restoring Eemaldamine pole lubatud, taastan - + Local files and share folder removed. Kohalikud failid ja jagatud kaustad eemaldatud. - + Move not allowed, item restored Liigutamine pole lubatud, üksus taastatud - + Move not allowed because %1 is read-only Liigutamien pole võimalik kuna %1 on ainult lugemiseks - + the destination sihtkoht - + the source allikas @@ -3454,17 +3459,17 @@ Selle kasutamine pole soovitatav. OCC::ValidateChecksumHeader - + The checksum header is malformed. - + The checksum header contained an unknown checksum type '%1' - + The downloaded file does not match the checksum, it will be resumed. diff --git a/translations/client_eu.ts b/translations/client_eu.ts index 81cd78095..cf37af90a 100644 --- a/translations/client_eu.ts +++ b/translations/client_eu.ts @@ -135,8 +135,8 @@ - - + + Cancel Ezeztatu @@ -166,184 +166,184 @@ Kontua - + Choose what to sync Hautatu zer sinkronizatu - + Force sync now Behartu orain sinkronizatzen - + Restart sync Berrabiarazi sinkronizazioa - + Remove folder sync connection Ezabatu karpeta honen konexioa - + Folder creation failed Karpeta sortzeak huts egin du - + <p>Could not create local folder <i>%1</i>. <p>Ezin izan da <i>%1</i> bertako karpeta sortu. - + Confirm Folder Sync Connection Removal Baieztatu Karpetaren Konexioaren Ezabatzea - + Remove Folder Sync Connection Ezabatu Karpeta Honen Konexioa - + Sync Running Sinkronizazioa martxan da - + The syncing operation is running.<br/>Do you want to terminate it? Sinkronizazio martxan da.<br/>Bukatu nahi al duzu? - + %1 in use %1 erabiltzen - + %1 as <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. Zerbitzariaren bertsioa %1 zaharra eta euskarririk gabekoa da! Zure ardurapean aritu. - + Connected to %1. %1ra konektatuta. - + Server %1 is temporarily unavailable. %1 zerbitzaria ez dago orain eskuragarri - + Server %1 is currently in maintenance mode. - + Signed out from %1. %1etik saioa itxita. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... - + No connection to %1 at %2. Konexiorik ez %1-ekin %2-etan - + Log in Hasi saioa - + There are folders that were not synchronized because they are too big: - + There are folders that were not synchronized because they are external storages: - + There are folders that were not synchronized because they are too big or external storages: - + Confirm Account Removal Baieztatu Kontuaren Ezabatzea - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection Ezabatu konexioa - - + + Open folder Ireki karpeta - + Log out Saioa bukatu - + Resume sync Berrekin sinkronizazioa - + Pause sync Gelditu sinkronizazioa - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. - + %1 of %2 in use %2tik %1 erabilita - + Currently there is no storage usage information available. Orain ez dago eskuragarri biltegiratze erabileraren informazioa. - + No %1 connection configured. Ez dago %1 konexiorik konfiguratuta. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured Ez dago ownCloud konturik konfiguratuta - + The configured server for this client is too old Bezero honentzako konfiguratutako zerbitzaria oso zaharra da - + Please update to the latest server and restart the client. Mesedez eguneratu zerbitzarira eta berrabiarazi bezeroa. - + Authentication error: Either username or password are wrong. Autentikazio errorea: Erabiltzaile izena edota pasahitza gaizki daude. - + timeout denbora iraungi da - + The provided credentials are not correct Emandako kredentzialak ez dira zuzenak @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Erabiltzaileak bertan behera utzita @@ -934,12 +934,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an Gehitu Karpeta Sinkronizatzeko Konexioa - + Synchronizing with local folder - + File Fitxategia @@ -1087,12 +1087,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizard - + Add Folder Sync Connection Gehitu Karpeta Sinkronizatzeko Konexioa - + Add Sync Connection Gehitu Sinkronizazio Konexioa @@ -1100,17 +1100,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Klikatu sinkronizatzeko bertako karpeta bat sinkronizatzeko. - + Enter the path to the local folder. Sartu bertako karpeta berriaren bidea: - + Select the source folder Hautatu jatorrizko karpeta @@ -1118,47 +1118,47 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardRemotePath - + Create Remote Folder Sortu Urruneko Karpeta - + Enter the name of the new folder to be created below '%1': Sartu behean sortuko den karpeta berriaren izena '%1': - + Folder was successfully created on %1. %1-en karpeta ongi sortu da. - + Authentication failed accessing %1 Autentikazioak huts egin du %1en sartzean - + Failed to create the folder on %1. Please check manually. Huts egin du %1-(e)an karpeta sortzen. Egiaztatu eskuz. - + Failed to list a folder. Error: %1 Karpetaren zerrenda lortzeak huts egin du: Error: %1 - + Choose this to sync the entire account Hautatu hau kontu osoa sinkronizatzeko - + This folder is already being synced. Karpeta hau dagoeneko sinkronizatzen ari da. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Dagoeneko <i>%1</i> sinkronizatzen ari zara, <i>%2</i>-ren guraso karpeta dena. @@ -1166,12 +1166,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Abisua:</b> %1 - + <b>Warning:</b> <b>Abisua:</b> @@ -2701,33 +2701,33 @@ Ez da gomendagarria erabltzea. - + Delete Ezabatu - + Open link in browser - + Copy link to clipboard - + Copy link to clipboard (direct download) - + Send link by email Bidali lotura posta bidez - + Send link by email (direct download) @@ -2861,12 +2861,12 @@ Ez da gomendagarria erabltzea. OCC::ShibbolethCredentials - + Login Error Errorea sartzean - + You must sign in as user %1 @@ -3209,38 +3209,38 @@ Ez da gomendagarria erabltzea. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder - + Not allowed because you don't have permission to add files in that folder - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3330,89 +3330,94 @@ Ez da gomendagarria erabltzea. - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. - + Stat failed. - + Filename encoding is not valid - + Invalid characters, please rename "%1" - + Unable to read the blacklist from the local database - + Unable to read from the sync journal. - + Cannot open the sync journal Ezin da sinkronizazio egunerokoa ireki - + File name contains at least one invalid character Fitxategi izenak behintzat baliogabeko karaktere bat du - - + + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed to upload this file because it is read-only on the server, restoring - - + + Not allowed to remove, restoring Ezabatzeko baimenik gabe, berrezartzen - + Local files and share folder removed. - + Move not allowed, item restored Mugitzea ez dago baimenduta, elementua berrezarri da - + Move not allowed because %1 is read-only Mugitzea ez dago baimenduta %1 irakurtzeko bakarrik delako - + the destination helburua - + the source jatorria @@ -3454,17 +3459,17 @@ Ez da gomendagarria erabltzea. OCC::ValidateChecksumHeader - + The checksum header is malformed. - + The checksum header contained an unknown checksum type '%1' - + The downloaded file does not match the checksum, it will be resumed. diff --git a/translations/client_fa.ts b/translations/client_fa.ts index 5342aa927..cdc94a553 100644 --- a/translations/client_fa.ts +++ b/translations/client_fa.ts @@ -135,8 +135,8 @@ - - + + Cancel منصرف شدن @@ -166,184 +166,184 @@ حساب کاربری - + Choose what to sync انتخاب موارد همگام‌سازی - + Force sync now - + Restart sync - + Remove folder sync connection - + Folder creation failed - + <p>Could not create local folder <i>%1</i>. - + Confirm Folder Sync Connection Removal - + Remove Folder Sync Connection - + Sync Running همگام سازی در حال اجراست - + The syncing operation is running.<br/>Do you want to terminate it? عملیات همگام سازی در حال اجراست.<br/>آیا دوست دارید آن را متوقف کنید؟ - + %1 in use - + %1 as <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. - + Connected to %1. متصل به %1. - + Server %1 is temporarily unavailable. سرور %1 بصورت موقت خارج از دسترس است. - + Server %1 is currently in maintenance mode. - + Signed out from %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... اتصال به %1... - + No connection to %1 at %2. - + Log in ورود - + There are folders that were not synchronized because they are too big: - + There are folders that were not synchronized because they are external storages: - + There are folders that were not synchronized because they are too big or external storages: - + Confirm Account Removal تائید حذف حساب‌کاربری - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection حذف ارتباط - - + + Open folder بازکردن پوشه - + Log out خروج - + Resume sync از سر‎گیری همگام‌سازی - + Pause sync توقف به‌هنگام‌سازی - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. - + %1 of %2 in use - + Currently there is no storage usage information available. - + No %1 connection configured. بدون %1 اتصال پیکربندی شده. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured - + The configured server for this client is too old - + Please update to the latest server and restart the client. - + Authentication error: Either username or password are wrong. - + timeout - + The provided credentials are not correct @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user متوقف شده توسط کاربر @@ -934,12 +934,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an - + Synchronizing with local folder همگام‌سازی با پوشه محلی - + File فایل @@ -1087,12 +1087,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizard - + Add Folder Sync Connection - + Add Sync Connection @@ -1100,17 +1100,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardLocalPath - + Click to select a local folder to sync. - + Enter the path to the local folder. - + Select the source folder پوشه ی اصلی را انتخاب کنید @@ -1118,47 +1118,47 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardRemotePath - + Create Remote Folder - + Enter the name of the new folder to be created below '%1': - + Folder was successfully created on %1. پوشه با موفقیت ایجاد شده است %1. - + Authentication failed accessing %1 - + Failed to create the folder on %1. Please check manually. - + Failed to list a folder. Error: %1 - + Choose this to sync the entire account - + This folder is already being synced. این پوشه همگام‌سازی شده است. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. @@ -1166,12 +1166,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>اخطار:</b> %1 - + <b>Warning:</b> <b>اخطار:</b> @@ -2698,33 +2698,33 @@ It is not advisable to use it. - + Delete حذف - + Open link in browser - + Copy link to clipboard - + Copy link to clipboard (direct download) - + Send link by email لینک را توسط ایمیل بفرست. - + Send link by email (direct download) @@ -2858,12 +2858,12 @@ It is not advisable to use it. OCC::ShibbolethCredentials - + Login Error خطای ورود - + You must sign in as user %1 @@ -3206,38 +3206,38 @@ It is not advisable to use it. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder - + Not allowed because you don't have permission to add files in that folder - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3327,89 +3327,94 @@ It is not advisable to use it. نام فایل خیلی طولانی است. - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. - + Stat failed. وضعیت ناموفق - + Filename encoding is not valid رمزگذاری نام فایل معتبر نیست - + Invalid characters, please rename "%1" کاراکتر نامعتبر، لطفا "%1" را تغییر نام دهید - + Unable to read the blacklist from the local database - + Unable to read from the sync journal. - + Cannot open the sync journal - + File name contains at least one invalid character نام فایل دارای حداقل یک کاراکتر نامعتبر است - - + + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder با توجه به عدم اجازه‌ی شما به ایجاد زیرپوشه به پوشه مجاز نیست - + Not allowed to upload this file because it is read-only on the server, restoring آپلود این فایل با توجه به فقط-خواندنی بودن آن در سرور مجاز نیست، در حال بازگرداندن - - + + Not allowed to remove, restoring حذف مجاز نیست، در حال بازگردادن - + Local files and share folder removed. فایل‌های محلی و پوشه‌ی اشتراک حذف شد. - + Move not allowed, item restored انتقال مجاز نیست، مورد بازگردانده شد - + Move not allowed because %1 is read-only - + the destination مقصد - + the source مبدا @@ -3451,17 +3456,17 @@ It is not advisable to use it. OCC::ValidateChecksumHeader - + The checksum header is malformed. - + The checksum header contained an unknown checksum type '%1' - + The downloaded file does not match the checksum, it will be resumed. diff --git a/translations/client_fi.ts b/translations/client_fi.ts index 76b076c9b..1d1138c10 100644 --- a/translations/client_fi.ts +++ b/translations/client_fi.ts @@ -135,8 +135,8 @@ - - + + Cancel Peruuta @@ -166,184 +166,184 @@ Tili - + Choose what to sync Valitse synkronoitavat tiedot - + Force sync now Pakota synkronointi nyt - + Restart sync Käynnistä synkronointi uudelleen - + Remove folder sync connection Poista kansion synkronointiyhteys - + Folder creation failed Kansion luominen epäonnistui - + <p>Could not create local folder <i>%1</i>. <p>Paikallisen kansion <i>%1</i> luominen epäonnistui. - + Confirm Folder Sync Connection Removal Vahvista kansion synkronointiyhteyden poisto - + Remove Folder Sync Connection Poista kansion synkronointiyhteys - + Sync Running Synkronointi meneillään - + The syncing operation is running.<br/>Do you want to terminate it? Synkronointioperaatio on meneillään.<br/>Haluatko keskeyttää sen? - + %1 in use %1 käytössä - + %1 as <i>%2</i> %1 käyttäjänä <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. Palvelimen versio %1 on vanha ja sen tuki on loppunut! Jatka omalla vastuulla. - + Connected to %1. Yhteys muodostettu kohteeseen %1. - + Server %1 is temporarily unavailable. Palvelin %1 ei ole juuri nyt saatavilla. - + Server %1 is currently in maintenance mode. - + Signed out from %1. Kirjauduttu ulos kohteesta %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... - + No connection to %1 at %2. Ei yhteyttä kohteeseen %1 osoitteessa %2. - + Log in Kirjaudu sisään - + There are folders that were not synchronized because they are too big: - + There are folders that were not synchronized because they are external storages: - + There are folders that were not synchronized because they are too big or external storages: - + Confirm Account Removal Vahvista tilin poistaminen - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Haluatko varmasti poistaa tilin <i>%1</i>?</p><p><b>Huomio:</b> Tämä toimenpide <b>ei</b> poista mitään tiedostoja.</p> - + Remove connection Poista yhteys - - + + Open folder Avaa kansio - + Log out Kirjaudu ulos - + Resume sync Palauta synkronointi - + Pause sync Keskeytä synkronointi - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Haluatko varmasti lopettaa kansion <i>%1</i> synkronoinnin?</p><p><b>Huomio:</b> Tämä toimenpide <b>ei</b> poista mitään tiedostoja.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1/%2 (%3 %) käytössä. Jotkin kansiot, mukaan lukien verkkojaot ja jaetut kansiot, voivat sisältää eri rajoitukset. - + %1 of %2 in use %1/%2 käytössä - + Currently there is no storage usage information available. Tallennustilan käyttötietoja ei ole juuri nyt saatavilla. - + No %1 connection configured. %1-yhteyttä ei ole määritelty. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured ownCloud-tiliä ei ole määritelty - + The configured server for this client is too old Määritelty palvelin on ohjelmistoversioltaan liian vanha tälle asiakasohjelmistolle - + Please update to the latest server and restart the client. Päivitä uusimpaan palvelinversioon ja käynnistä asiakasohjelmisto uudelleen. - + Authentication error: Either username or password are wrong. Tunnistautumisvirhe: käyttäjätunnus tai salasana on väärin. - + timeout aikakatkaisu - + The provided credentials are not correct Annetut tilitiedot eivät ole oikein @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Keskeytetty käyttäjän toimesta @@ -934,12 +934,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an Lisää kansion synkronointiyhteys - + Synchronizing with local folder Synkronoidaan paikallisen kansion kanssa - + File Tiedosto @@ -1087,12 +1087,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizard - + Add Folder Sync Connection Lisää kansion synkronointiyhteys - + Add Sync Connection Lisää synkronointiyhteys @@ -1100,17 +1100,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Napsauta valitaksesi synkronoitavan paikalliskansion. - + Enter the path to the local folder. Anna paikallisen kansion polku - + Select the source folder Valitse lähdekansio @@ -1118,47 +1118,47 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardRemotePath - + Create Remote Folder Luo etäkansio - + Enter the name of the new folder to be created below '%1': - + Folder was successfully created on %1. - + Authentication failed accessing %1 - + Failed to create the folder on %1. Please check manually. - + Failed to list a folder. Error: %1 Kansion listaaminen epäonnistui. Virhe: %1 - + Choose this to sync the entire account Valitse tämä synkronoidaksesi koko tilin - + This folder is already being synced. Tätä kansiota synkronoidaan jo. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Synkronoit jo kansiota <i>%1</i>, ja se on kansion <i>%2</i> yläkansio. @@ -1166,12 +1166,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Varoitus:</b> %1 - + <b>Warning:</b> <b>Varoitus:</b> @@ -2701,33 +2701,33 @@ Osoitteen käyttäminen ei ole suositeltavaa. - + Delete Poista - + Open link in browser - + Copy link to clipboard - + Copy link to clipboard (direct download) - + Send link by email Lähetä linkki sähköpostitse - + Send link by email (direct download) @@ -2861,12 +2861,12 @@ Osoitteen käyttäminen ei ole suositeltavaa. OCC::ShibbolethCredentials - + Login Error Kirjautumisvirhe - + You must sign in as user %1 Sinun tulee kirjautua käyttäjänä %1 @@ -3211,38 +3211,38 @@ Osoitteen käyttäminen ei ole suositeltavaa. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Vain %1 on käytettävissä, käynnistymiseen tarvitaan %2 - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder Ei sallittu, koska käyttöoikeutesi eivät riitä ylätason kansion lisäämiseen - + Not allowed because you don't have permission to add files in that folder Ei sallittu, koska käyttöoikeutesi eivät riitä tiedostojen lisäämiseen kyseiseen kansioon - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3332,89 +3332,94 @@ Osoitteen käyttäminen ei ole suositeltavaa. Tiedoston nimi on liian pitkä. - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. - + Stat failed. Stat epäonnistui. - + Filename encoding is not valid Tiedostonimen merkistökoodaus ei ole kelvollista - + Invalid characters, please rename "%1" Virheellisiä merkkejä, anna uusi nimi kohteelle "%1" - + Unable to read the blacklist from the local database - + Unable to read from the sync journal. - + Cannot open the sync journal - + File name contains at least one invalid character Tiedoston nimi sisältää ainakin yhden virheellisen merkin - - + + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder Ei sallittu, koska oikeutesi eivät riitä alikansioiden lisäämiseen kyseiseen kansioon - + Not allowed to upload this file because it is read-only on the server, restoring - - + + Not allowed to remove, restoring Poistaminen ei ole sallittua, palautetaan - + Local files and share folder removed. Paikalliset tiedostot ja jakokansio poistettu. - + Move not allowed, item restored Siirtäminen ei ole sallittua, kohde palautettu - + Move not allowed because %1 is read-only Siirto ei ole sallittu, koska %1 on "vain luku"-tilassa - + the destination kohde - + the source lähde @@ -3456,17 +3461,17 @@ Osoitteen käyttäminen ei ole suositeltavaa. OCC::ValidateChecksumHeader - + The checksum header is malformed. Tarkistesumman otsake on muodostettu väärin. - + The checksum header contained an unknown checksum type '%1' - + The downloaded file does not match the checksum, it will be resumed. diff --git a/translations/client_fr.ts b/translations/client_fr.ts index f6726d35c..c436a0661 100644 --- a/translations/client_fr.ts +++ b/translations/client_fr.ts @@ -135,8 +135,8 @@ - - + + Cancel Annuler @@ -166,184 +166,184 @@ Compte - + Choose what to sync Sélectionner le contenu à synchroniser - + Force sync now Forcer la synchronisation maintenant - + Restart sync Redémarrer la synchronisation - + Remove folder sync connection Supprimer la synchronisation du dossier - + Folder creation failed Échec de création du dossier - + <p>Could not create local folder <i>%1</i>. <p>Impossible de créer le dossier local <i>%1</i>. - + Confirm Folder Sync Connection Removal Confirmer une suppression de synchronisation de dossier - + Remove Folder Sync Connection Supprimer la synchronisation de ce dossier - + Sync Running Synchronisation en cours - + The syncing operation is running.<br/>Do you want to terminate it? La synchronisation est en cours.<br/>Voulez-vous l'arrêter ? - + %1 in use %1 utilisés - + %1 as <i>%2</i> %1 avec le compte <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. La version %1 du serveur est ancienne et n'est pas prise en charge. Continuez à vos risques et périls. - + Connected to %1. Connecté au serveur %1. - + Server %1 is temporarily unavailable. Le serveur %1 est temporairement indisponible. - + Server %1 is currently in maintenance mode. Le serveur %1 est en cours de maintenance. - + Signed out from %1. Session sur %1 fermée. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. En attente d'autorisation du navigateur. <a href='%1'>Cliquer ici</a> pour recharger le navigateur. - + Connecting to %1... Connexion à %1 - + No connection to %1 at %2. Aucune connexion au serveur %1 à l'adresse %2. - + Log in Se connecter - + There are folders that were not synchronized because they are too big: Certains dossiers n'ont pas été synchronisés parce qu'ils sont de taille trop importante : - + There are folders that were not synchronized because they are external storages: Certains dossiers n'ont pas été synchronisés parce qu'ils sont localisés sur un stockage externe : - + There are folders that were not synchronized because they are too big or external storages: Certains dossiers n'ont pas été synchronisés par qu'ils sont localisés sur un stockage externe ou qu'ils sont de taille trop importante : - + Confirm Account Removal Confirmation de retrait du compte - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Êtes-vous certain de vouloir retirer <i>%1</i> des comptes synchronisés avec le serveur ?</p><p><b>Remarque :</b> cela ne supprimera pas votre compte sur le serveur et aucun fichier ne sera supprimé ni localement ni en ligne.</p> - + Remove connection Retirer le compte - - + + Open folder Ouvrir le dossier local - + Log out Se déconnecter - + Resume sync Reprendre la synchronisation - + Pause sync Mettre en pause - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Voulez-vous vraiment arrêter de synchroniser le dossier <i>%1</i> ?</p><p><b>Note :</b> Aucun fichier ne sera supprimé.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) utilisés sur %2. Certains dossiers, montés depuis le réseau ou partagés, peuvent avoir des limites différentes. - + %1 of %2 in use %1 utilisés sur %2 - + Currently there is no storage usage information available. Actuellement aucune information d'utilisation de stockage n'est disponible. - + No %1 connection configured. Aucune connexion à %1 configurée @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured Aucun compte ownCloud configuré - + The configured server for this client is too old Le serveur configuré pour ce client est trop vieux - + Please update to the latest server and restart the client. Veuillez mettre à jour le serveur vers la dernière version et redémarrer le client. - + Authentication error: Either username or password are wrong. Erreur d'authentification: nom d'utilisateur et/ou mot de passe incorrect(s). - + timeout délai d'attente - + The provided credentials are not correct Les informations d'identification fournies ne sont pas correctes @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Interrompu par l'utilisateur @@ -944,12 +944,12 @@ Continuer la synchronisation comme d'habitude fera en sorte que tous les fi Ajouter une synchronisation de dossier - + Synchronizing with local folder Sélectionnez les sous-dossiers à synchroniser à partir du dossier local - + File Fichier @@ -1097,12 +1097,12 @@ Continuer la synchronisation comme d'habitude fera en sorte que tous les fi OCC::FolderWizard - + Add Folder Sync Connection Ajouter une synchronisation de dossier - + Add Sync Connection Ajouter une Synchronisation @@ -1110,17 +1110,17 @@ Continuer la synchronisation comme d'habitude fera en sorte que tous les fi OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Cliquez pour choisir un dossier local à synchroniser. - + Enter the path to the local folder. Entrez le chemin du dossier local. - + Select the source folder Sélectionnez le dossier source @@ -1128,47 +1128,47 @@ Continuer la synchronisation comme d'habitude fera en sorte que tous les fi OCC::FolderWizardRemotePath - + Create Remote Folder Créer un dossier distant - + Enter the name of the new folder to be created below '%1': Entrez le nom du nouveau dossier à créer dans '%1' : - + Folder was successfully created on %1. Le dossier a été créé sur %1 - + Authentication failed accessing %1 Erreur d'authentification lors de l'accès à %1 - + Failed to create the folder on %1. Please check manually. Échec à la création du dossier sur %1. Veuillez vérifier manuellement. - + Failed to list a folder. Error: %1 Impossible de lister un dossier. Erreur : %1 - + Choose this to sync the entire account Sélectionnez ceci pour synchroniser l'ensemble du compte - + This folder is already being synced. Ce dossier est déjà en cours de synchronisation. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Vous synchronisez déja <i>%1</i>, qui est un dossier parent de <i>%2</i>. @@ -1176,12 +1176,12 @@ Continuer la synchronisation comme d'habitude fera en sorte que tous les fi OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Avertissement :</b> %1 - + <b>Warning:</b> <b>Avertissement :</b> @@ -2712,33 +2712,33 @@ Il est déconseillé de l'utiliser. Créer une lien de partage public - + Delete Supprimer - + Open link in browser Ouvrir le lien dans le navigateur - + Copy link to clipboard Copier le lien vers le presse-papier - + Copy link to clipboard (direct download) Copier le lien vers le presse-papier (téléchargement direct) - + Send link by email Envoyer le lien par email - + Send link by email (direct download) Envoyer le lien par courriel (téléchargement direct) @@ -2873,12 +2873,12 @@ Il est déconseillé de l'utiliser. OCC::ShibbolethCredentials - + Login Error Erreur de connexion - + You must sign in as user %1 Vous devez vous connecter en tant qu'utilisateur %1 @@ -3223,38 +3223,38 @@ Il est déconseillé de l'utiliser. La hiérarchie du dossier est trop profonde - + Conflict: Server version downloaded, local copy renamed and not uploaded. Conflit : La version du serveur a été téléchargée, la version locale renommée et non téléversée. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Seulement %1 disponibles, il faut au moins %2 pour démarrer - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Impossible d'accéder ou de créer une base de données locale de synchronisation. Assurez vous de disposer des droits d'écriture dans le dossier de synchronisation. - + Not allowed because you don't have permission to add parent folder Non autorisé car vous n'avez pas la permission d'ajouter un dossier parent - + Not allowed because you don't have permission to add files in that folder Non autorisé car vous n'avez pas la permission d'ajouter des fichiers dans ce dossier - + Disk space is low: Downloads that would reduce free space below %1 were skipped. L'espace disque est faible : les téléchargements qui amèneraient à réduire l'espace libre en dessous de %1 ont été ignorés. - + There is insufficient space available on the server for some uploads. Il n'y a pas suffisamment d’espace disponible sur le serveur pour certains téléversements. @@ -3344,89 +3344,94 @@ Il est déconseillé de l'utiliser. Le nom de fichier est trop long. - + + The filename cannot be encoded on your file system. + Le nom de fichier ne peut pas être encodé sur votre système. + + + Unresolved conflict. conflit non résolu. - + Stat failed. Stat échoué. - + Filename encoding is not valid L'encodage du nom de fichier n'est pas valide - + Invalid characters, please rename "%1" Caractères non valides. Veuillez renommer "%1" - + Unable to read the blacklist from the local database Impossible de lire la liste noire de la base de données locale - + Unable to read from the sync journal. Impossible de lire le journal de synchronisation. - + Cannot open the sync journal Impossible d'ouvrir le journal de synchronisation - + File name contains at least one invalid character Le nom de fichier contient au moins un caractère non valable - - + + Ignored because of the "choose what to sync" blacklist Ignoré en raison de la liste noire "Sélectionner le contenu à synchroniser". - + Not allowed because you don't have permission to add subfolders to that folder Non autorisé car vous n'avez pas la permission d'ajouter des sous-dossiers dans ce dossier - + Not allowed to upload this file because it is read-only on the server, restoring Non autorisé à envoyer ce fichier car il est en lecture seule sur le serveur. Restauration - - + + Not allowed to remove, restoring Non autorisé à supprimer. Restauration - + Local files and share folder removed. Fichiers locaux et dossier partagé supprimés. - + Move not allowed, item restored Déplacement non autorisé, élément restauré - + Move not allowed because %1 is read-only Déplacement non autorisé car %1 est en mode lecture seule - + the destination la destination - + the source la source @@ -3468,17 +3473,17 @@ Il est déconseillé de l'utiliser. OCC::ValidateChecksumHeader - + The checksum header is malformed. L'entête de somme de contrôle est mal formée. - + The checksum header contained an unknown checksum type '%1' L'en-tête de la somme de contrôle contenait un type de somme de contrôle inconnu '%1' - + The downloaded file does not match the checksum, it will be resumed. Le fichier téléchargé ne correspond pas à la somme de contrôle, il va être téléchargé à nouveau. diff --git a/translations/client_gl.ts b/translations/client_gl.ts index 8e8a87a56..bd0fbd54a 100644 --- a/translations/client_gl.ts +++ b/translations/client_gl.ts @@ -135,8 +135,8 @@ - - + + Cancel Cancelar @@ -166,184 +166,184 @@ Conta - + Choose what to sync Escolla que sincronizar - + Force sync now Forzar a sincronización - + Restart sync Reiniciar a sincronización - + Remove folder sync connection Retirar a conexión da sincronización do cartafol - + Folder creation failed Non foi posíbel crear o cartafol - + <p>Could not create local folder <i>%1</i>. <p>Non foi posíbel crear o cartafol local <i>%1</i>. - + Confirm Folder Sync Connection Removal Confirmar a retirada da conexión da sincronización do cartafol - + Remove Folder Sync Connection Retirar a conexión da sincronización do cartafol - + Sync Running Sincronización en proceso - + The syncing operation is running.<br/>Do you want to terminate it? Estase a realizar a sincronización.<br/>Quere interrompela e rematala? - + %1 in use %1 en uso - + %1 as <i>%2</i> %1 como <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. Este servidor da versión %1 é vello e non ten soporte! Vostede verá o que fai. - + Connected to %1. Conectado a %1. - + Server %1 is temporarily unavailable. O servidor %1 non está dispoñíbel temporalmente. - + Server %1 is currently in maintenance mode. - + Signed out from %1. Desconectado de %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... - + No connection to %1 at %2. Non hai conexión con %1 en %2. - + Log in Acceder - + There are folders that were not synchronized because they are too big: Hai cartafoles que non se sincronizaron por ser demasiado grandes: - + There are folders that were not synchronized because they are external storages: Hai cartafoles que non se sincronizaron porque son almacenamentos externos: - + There are folders that were not synchronized because they are too big or external storages: Hai cartafoles que non se sincronizaron porque son demasiado grandes ou almacenamentos externos: - + Confirm Account Removal Confirme a retirada da conta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>De verdade quere retirar a conexión a conta <i>%1</i>?</p><p><b>Aviso:</b> Esto <b>non</b> eliminará ningún ficheiro.</p> - + Remove connection Retirar conexión - - + + Open folder Abrir o cartafol - + Log out Desconectar - + Resume sync Continuar coa sincronización - + Pause sync Por en pausa a sincronización - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Quere realmente deixar de sincronizar o cartafol <i>%1</i>?</p><p><b>Aviso:</b> Esto <b>non</b> eliminará ningún ficheiro.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) de %2 en uso. Algúns cartafoles, incluíndo os compartidos e os montados en rede, poderían ter diferentes límites. - + %1 of %2 in use %1 de %2 en uso - + Currently there is no storage usage information available. Actualmente non hai dispoñíbel ningunha información sobre o uso do almacenamento. - + No %1 connection configured. Non se configurou a conexión %1. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured Non hai configurada ningunha conta ownCloud - + The configured server for this client is too old O servidor configurado para este cliente é moi antigo - + Please update to the latest server and restart the client. Actualice ao último servidor e reinicie o cliente. - + Authentication error: Either username or password are wrong. Produciuse un erro de autenticación: Ou o nome de usuario ou o contrasinal poderían ser erróneos - + timeout caducidade - + The provided credentials are not correct As credenciais fornecidas non son correctas @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Interrompido polo usuario @@ -934,12 +934,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an - + Synchronizing with local folder - + File Ficheiro @@ -1087,12 +1087,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizard - + Add Folder Sync Connection - + Add Sync Connection @@ -1100,17 +1100,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Prema para escoller un cartafol local para sincronizar. - + Enter the path to the local folder. Escriba a ruta ao cartafol local. - + Select the source folder Escolla o cartafol de orixe @@ -1118,47 +1118,47 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardRemotePath - + Create Remote Folder Crear un cartafol remoto - + Enter the name of the new folder to be created below '%1': Introduza o nome do novo cartafol que se creará a seguir «%1»: - + Folder was successfully created on %1. Creouse correctamente o cartafol en %1. - + Authentication failed accessing %1 Non foi posíbel facer a autenticación accedendo a %1 - + Failed to create the folder on %1. Please check manually. Non foi posíbel crear o cartafol en %1. Compróbeo manualmente. - + Failed to list a folder. Error: %1 - + Choose this to sync the entire account Escolla isto para sincronizar toda a conta - + This folder is already being synced. Este cartafol xa está sincronizado. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Xa está a sincronizar <i>%1</i>, é o cartafol pai de <i>%2</i>. @@ -1166,12 +1166,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Aviso:</b> %1 - + <b>Warning:</b> <b>Aviso:</b> @@ -2700,33 +2700,33 @@ Recomendámoslle que non o use. - + Delete Eliminar - + Open link in browser - + Copy link to clipboard - + Copy link to clipboard (direct download) - + Send link by email Enviar a ligazón por correo - + Send link by email (direct download) @@ -2860,12 +2860,12 @@ Recomendámoslle que non o use. OCC::ShibbolethCredentials - + Login Error Erro de acceso - + You must sign in as user %1 Ten que rexistrarse como usuario %1 @@ -3210,38 +3210,38 @@ Recomendámoslle que non o use. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder - + Not allowed because you don't have permission to add files in that folder - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3331,89 +3331,94 @@ Recomendámoslle que non o use. O nome de ficheiro é longo de máis. - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. - + Stat failed. Fallou a obtención de estatísticas. - + Filename encoding is not valid O nome de ficheiro codificado non é correcto - + Invalid characters, please rename "%1" Caracteres incorrectos, déalle outro nome a «%1» - + Unable to read the blacklist from the local database - + Unable to read from the sync journal. - + Cannot open the sync journal Non foi posíbel abrir o rexistro de sincronización - + File name contains at least one invalid character O nome de ficheiro contén algún carácter incorrecto - - + + Ignored because of the "choose what to sync" blacklist Ignorado por mor da lista negra de «escolla que sincronizar» - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed to upload this file because it is read-only on the server, restoring Non está permitido o envío xa que o ficheiro é só de lectura no servidor, restaurando - - + + Not allowed to remove, restoring Non está permitido retiralo, restaurando - + Local files and share folder removed. Retirados os ficheiros locais e o cartafol compartido. - + Move not allowed, item restored Nos está permitido movelo, elemento restaurado - + Move not allowed because %1 is read-only Bon está permitido movelo xa que %1 é só de lectura - + the destination o destino - + the source a orixe @@ -3455,17 +3460,17 @@ Recomendámoslle que non o use. OCC::ValidateChecksumHeader - + The checksum header is malformed. A cabeceira da suma de comprobación é incorrecta. - + The checksum header contained an unknown checksum type '%1' - + The downloaded file does not match the checksum, it will be resumed. O ficheiro descargado non coincide coa suma de comprobación. Retomase. diff --git a/translations/client_hu.ts b/translations/client_hu.ts index a4bb8cf79..decde9b8c 100644 --- a/translations/client_hu.ts +++ b/translations/client_hu.ts @@ -135,8 +135,8 @@ - - + + Cancel Mégsem @@ -166,184 +166,184 @@ Fiók - + Choose what to sync Szinkronizálandó elemek kiválasztása - + Force sync now Kényszerített szinkronizálás - + Restart sync Szinkronizálás újraindítása - + Remove folder sync connection Könyvtár szinkronizációs kapcsolat törlése - + Folder creation failed Könyvtár létrehozása nem sikerült - + <p>Could not create local folder <i>%1</i>. <p>Nem lehet helyi könyvtárat létrehozni: <i>%1</i>. - + Confirm Folder Sync Connection Removal Könyvtár szinkronizációs kapcsolat törlésének megerősítése - + Remove Folder Sync Connection Könyvtár szinkronizációs kapcsolat törlése - + Sync Running Szinkronizálás fut - + The syncing operation is running.<br/>Do you want to terminate it? A szinkronizálás folyamatban van. <br/>Szakítsuk meg? - + %1 in use %1 használatban - + %1 as <i>%2</i> %1, mint <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. %1 szerver verzió régi és már nem támogatott! Folytatás saját felelősségre. - + Connected to %1. Csatlakozva: %1. - + Server %1 is temporarily unavailable. %1 szerver jelenleg nem elérhető. - + Server %1 is currently in maintenance mode. A(z) %1 szerver jelenleg karbantartási módban van. - + Signed out from %1. Kijelentkezve innen: %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Engedély kérése a böngészőtől. <a href='%1'>Kattintson ide</a> a böngésző újranyitásához. - + Connecting to %1... Csatlakozás ehhez: %1 - + No connection to %1 at %2. Nincs kapcsolat ehhez: %1 ekkor: %2. - + Log in Bejelentkezés - + There are folders that were not synchronized because they are too big: - + There are folders that were not synchronized because they are external storages: - + There are folders that were not synchronized because they are too big or external storages: - + Confirm Account Removal Fiók törlésének megerősítése - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Tényleg törölni szeretné a kapcsolatot <i>%1</i> fiókkal?</p><p><b>Megjegyzés:</b> Ez <b>nem</b> töröl fájlokat.</p> - + Remove connection Kapcsolat törlése - - + + Open folder Könyvtár megnyitása - + Log out Kilépés - + Resume sync Szinkronizálás folytatása - + Pause sync Szinkronizálás szüneteltetése - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Tényleg leszeretné állítani <i>%1</i> könyvtár szinkronizálását?</p><p><b>Megjegyzés:</b> Ez <b>nem</b> töröl fájlokat.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) / %2 használatban. Néhány könyvtár - beleértve a hálózati megosztásokat és a megosztott könyvtárakat - eltérő korlátozással rendelkezhet. - + %1 of %2 in use %1 / %2 használatban - + Currently there is no storage usage information available. Jelenleg nem érhető el tárhelyhasználati információ. - + No %1 connection configured. Nincs beállított kapcsolat: %1. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured Nincs ownCloud fiók beállítva - + The configured server for this client is too old A beállított szerver ehhez a klienshez túl régi - + Please update to the latest server and restart the client. Kérjük, frissítse a szervert az utolsó verzióra és indítsa újra a klienst. - + Authentication error: Either username or password are wrong. Hitelesítési hiba: A felhasználónév vagy a jelszó hibás. - + timeout időtúllépés - + The provided credentials are not correct A megadott adatok helytelenek. @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Felhasználó megszakította @@ -934,12 +934,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an - + Synchronizing with local folder - + File Fájl @@ -1087,12 +1087,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizard - + Add Folder Sync Connection - + Add Sync Connection @@ -1100,17 +1100,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardLocalPath - + Click to select a local folder to sync. A szinkronizáláshoz válasszon ki egy helyi mappát. - + Enter the path to the local folder. Adjon meg a helyi könyvtár elérési útját. - + Select the source folder Forrás könyvtár kiválasztása @@ -1118,47 +1118,47 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardRemotePath - + Create Remote Folder - + Enter the name of the new folder to be created below '%1': - + Folder was successfully created on %1. A mappa sikeresen létrehozva: %1. - + Authentication failed accessing %1 - + Failed to create the folder on %1. Please check manually. - + Failed to list a folder. Error: %1 - + Choose this to sync the entire account - + This folder is already being synced. Ez a mappa már szinkronizálva van. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. @@ -1166,12 +1166,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Figyelmeztetés:</b> %1 - + <b>Warning:</b> <b>Figyelmeztetés:</b> @@ -2698,33 +2698,33 @@ It is not advisable to use it. - + Delete Törlés - + Open link in browser - + Copy link to clipboard - + Copy link to clipboard (direct download) - + Send link by email Link küldése e-mail-ben - + Send link by email (direct download) @@ -2858,12 +2858,12 @@ It is not advisable to use it. OCC::ShibbolethCredentials - + Login Error Bejelentkezési hiba - + You must sign in as user %1 %1 felhasználóként kell belépned @@ -3207,38 +3207,38 @@ It is not advisable to use it. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder - + Not allowed because you don't have permission to add files in that folder - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3328,89 +3328,94 @@ It is not advisable to use it. Fájlnév túl nagy. - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. - + Stat failed. - + Filename encoding is not valid - + Invalid characters, please rename "%1" Érvénytelen karakterek, kérjük nevezd át: %1 - + Unable to read the blacklist from the local database - + Unable to read from the sync journal. - + Cannot open the sync journal - + File name contains at least one invalid character A fájlnév legalább egy érvénytelen karaktert tartalmaz! - - + + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed to upload this file because it is read-only on the server, restoring - - + + Not allowed to remove, restoring - + Local files and share folder removed. - + Move not allowed, item restored - + Move not allowed because %1 is read-only - + the destination a cél - + the source a forrás @@ -3452,17 +3457,17 @@ It is not advisable to use it. OCC::ValidateChecksumHeader - + The checksum header is malformed. - + The checksum header contained an unknown checksum type '%1' - + The downloaded file does not match the checksum, it will be resumed. diff --git a/translations/client_it.ts b/translations/client_it.ts index e93170914..50cd825f9 100644 --- a/translations/client_it.ts +++ b/translations/client_it.ts @@ -135,8 +135,8 @@ - - + + Cancel Annulla @@ -166,184 +166,184 @@ Account - + Choose what to sync Scegli cosa sincronizzare - + Force sync now Forza ora la sincronizzazione - + Restart sync Riavvia sincronizzazione - + Remove folder sync connection Rimuovi connessione di sincronizzazione cartelle - + Folder creation failed Creazione della cartella non riuscita - + <p>Could not create local folder <i>%1</i>. <p>Impossibile creare la cartella locale <i>%1</i>. - + Confirm Folder Sync Connection Removal Conferma rimozione connessione di sincronizzazione cartelle - + Remove Folder Sync Connection Rimuovi connessione di sincronizzazione cartelle - + Sync Running La sincronizzazione è in corso - + The syncing operation is running.<br/>Do you want to terminate it? L'operazione di sincronizzazione è in corso.<br/>Vuoi terminarla? - + %1 in use %1 in uso - + %1 as <i>%2</i> %1 come <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. La versione %1 del server è datata e non supportata! Continua a tuo rischio. - + Connected to %1. Connesso a %1. - + Server %1 is temporarily unavailable. Il server %1 è temporaneamente non disponibile. - + Server %1 is currently in maintenance mode. Il Server %1 è attualmente in manutenzione - + Signed out from %1. Disconnesso da %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... - + No connection to %1 at %2. Nessuna connessione a %1 su %2. - + Log in Accedi - + There are folders that were not synchronized because they are too big: Ci sono nuove cartelle che non sono state sincronizzate poiché sono troppo grandi: - + There are folders that were not synchronized because they are external storages: Ci sono nuove cartelle che non sono state sincronizzate poiché sono archiviazioni esterne: - + There are folders that were not synchronized because they are too big or external storages: Ci sono nuove cartelle che non sono state sincronizzate poiché sono troppo grandi o archiviazioni esterne: - + Confirm Account Removal Conferma rimozione account - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Vuoi davvero eliminare la connessione all'account <i>%1</i>?</p><p><b>Nota:</b> ciò <b>non</b> eliminerà alcun file.</p> - + Remove connection Rimuovi connessione - - + + Open folder Apri cartella - + Log out Esci - + Resume sync Riprendi la sincronizzazione - + Pause sync Sospendi la sincronizzazione - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Vuoi davvero fermare la sincronizzazione della cartella <i>%1</i>?</p><p><b>Nota:</b> ciò <b>non</b> eliminerà alcun file.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) di %2 in uso. Alcune cartelle, incluse quelle montate in rete o le cartelle condivise, potrebbero avere limiti diversi. - + %1 of %2 in use %1% di %2 in uso - + Currently there is no storage usage information available. Non ci sono informazioni disponibili sull'utilizzo dello spazio di archiviazione. - + No %1 connection configured. Nessuna connessione di %1 configurata. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured Nessun account ownCloud configurato. - + The configured server for this client is too old Il server configurato per questo client è troppo datato - + Please update to the latest server and restart the client. Aggiorna all'ultima versione del server e riavvia il client. - + Authentication error: Either username or password are wrong. Errore di autenticazione: nome utente o password errati. - + timeout timeout - + The provided credentials are not correct Le credenziali fornite non sono corrette @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Interrotto dall'utente @@ -939,12 +939,12 @@ Se continui normalmente la sincronizzazione provocherai la sovrascrittura di tut Aggiungi connessioni di sincronizzazione cartelle - + Synchronizing with local folder Sincronizzazione con cartella locale - + File File @@ -1092,12 +1092,12 @@ Se continui normalmente la sincronizzazione provocherai la sovrascrittura di tut OCC::FolderWizard - + Add Folder Sync Connection Aggiungi connessioni di sincronizzazione cartelle - + Add Sync Connection Aggiungi connessione di sincronizzazione @@ -1105,17 +1105,17 @@ Se continui normalmente la sincronizzazione provocherai la sovrascrittura di tut OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Fai clic per selezionare una cartella locale da sincronizzare. - + Enter the path to the local folder. Digita il percorso della cartella locale. - + Select the source folder Seleziona la cartella di origine @@ -1123,47 +1123,47 @@ Se continui normalmente la sincronizzazione provocherai la sovrascrittura di tut OCC::FolderWizardRemotePath - + Create Remote Folder Crea cartella remota - + Enter the name of the new folder to be created below '%1': Digita il nome della nuova cartella da creare sotto a '%1': - + Folder was successfully created on %1. La cartella è stata creata correttamente su %1. - + Authentication failed accessing %1 Autenticazione non riuscita durante l'accesso a %1 - + Failed to create the folder on %1. Please check manually. Non è stato possibile creare la cartella su %1. Controlla manualmente. - + Failed to list a folder. Error: %1 Impossibile elencare una cartella. Errore: %1 - + Choose this to sync the entire account Selezionala per sincronizzare l'intero account - + This folder is already being synced. Questa cartella è già sincronizzata. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Stai già sincronizzando <i>%1</i>, che è la cartella superiore di <i>%2</i>. @@ -1171,12 +1171,12 @@ Se continui normalmente la sincronizzazione provocherai la sovrascrittura di tut OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Avviso:</b> %1 - + <b>Warning:</b> <b>Avviso:</b> @@ -2706,33 +2706,33 @@ Non è consigliabile utilizzarlo. Crea collegamento pubblico - + Delete Elimina - + Open link in browser Apri collegamento nel browser - + Copy link to clipboard Copia link negli appunti - + Copy link to clipboard (direct download) - + Send link by email Invia collegamento tramite email - + Send link by email (direct download) @@ -2866,12 +2866,12 @@ Non è consigliabile utilizzarlo. OCC::ShibbolethCredentials - + Login Error Errore di accesso - + You must sign in as user %1 Devi accedere con l'utente %1 @@ -3216,38 +3216,38 @@ Non è consigliabile utilizzarlo. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Sono disponibili solo %1, servono almeno %2 per iniziare - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder Non consentito poiché non disponi dei permessi per aggiungere la cartella superiore - + Not allowed because you don't have permission to add files in that folder Non consentito poiché non disponi dei permessi per aggiungere file in quella cartella - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3337,89 +3337,94 @@ Non è consigliabile utilizzarlo. Il nome del file è troppo lungo. - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. - + Stat failed. Stat non riuscita. - + Filename encoding is not valid La codifica del nome del file non è valida - + Invalid characters, please rename "%1" Caratteri non validi, rinomina "%1" - + Unable to read the blacklist from the local database Impossibile leggere la lista nera dal database locale - + Unable to read from the sync journal. Impossibile leggere dal registro di sincronizzazione. - + Cannot open the sync journal Impossibile aprire il registro di sincronizzazione - + File name contains at least one invalid character Il nome del file contiene almeno un carattere non valido - - + + Ignored because of the "choose what to sync" blacklist Ignorato in base alla lista nera per la scelta di cosa sincronizzare - + Not allowed because you don't have permission to add subfolders to that folder Non consentito poiché non disponi dei permessi per aggiungere sottocartelle in quella cartella - + Not allowed to upload this file because it is read-only on the server, restoring Il caricamento di questo file non è consentito poiché è in sola lettura sul server, ripristino - - + + Not allowed to remove, restoring Rimozione non consentita, ripristino - + Local files and share folder removed. I file locali e la cartella condivisa sono stati rimossi. - + Move not allowed, item restored Spostamento non consentito, elemento ripristinato - + Move not allowed because %1 is read-only Spostamento non consentito poiché %1 è in sola lettura - + the destination la destinazione - + the source l'origine @@ -3461,17 +3466,17 @@ Non è consigliabile utilizzarlo. OCC::ValidateChecksumHeader - + The checksum header is malformed. L'intestazione del codice di controllo non è valida. - + The checksum header contained an unknown checksum type '%1' L'intestazione di controllo conteneva un tipo di codice di controllo '%1' sconosciuto - + The downloaded file does not match the checksum, it will be resumed. Il file scaricato non verifica il codice di controllo, sarà ripristinato. diff --git a/translations/client_ja.ts b/translations/client_ja.ts index 092c13f23..4d509b624 100644 --- a/translations/client_ja.ts +++ b/translations/client_ja.ts @@ -135,8 +135,8 @@ - - + + Cancel キャンセル @@ -166,184 +166,184 @@ アカウント - + Choose what to sync 同期フォルダーを選択 - + Force sync now 今すぐ強制的に同期 - + Restart sync 同期を再実行 - + Remove folder sync connection 同期フォルダー接続を削除 - + Folder creation failed フォルダーの作成に失敗しました - + <p>Could not create local folder <i>%1</i>. <p>ローカルフォルダー <i>%1</i> を作成できません。 - + Confirm Folder Sync Connection Removal 同期フォルダー接続の削除を確認 - + Remove Folder Sync Connection 同期フォルダー接続を削除 - + Sync Running 同期を実行中 - + The syncing operation is running.<br/>Do you want to terminate it? 同期作業を実行中です。<br/>終了しますか? - + %1 in use %1 を使用中 - + %1 as <i>%2</i> <i>%2</i> の %1 - + The server version %1 is old and unsupported! Proceed at your own risk. サーバーバージョン %1 は古くサポートされていません!自己責任で進んでください。 - + Connected to %1. %1 に接続 - + Server %1 is temporarily unavailable. サーバー %1 は一時的に利用できません - + Server %1 is currently in maintenance mode. - + サーバー %1 は現在メンテナンスモードです。 - + Signed out from %1. %1 からサインアウトしました。 - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... - + %1 に接続中... - + No connection to %1 at %2. %2 の %1 への接続がありません。 - + Log in ログイン - + There are folders that were not synchronized because they are too big: 大きすぎるため同期されなかったフォルダーがあります: - + There are folders that were not synchronized because they are external storages: 外部ストレージにあるため同期されなかったフォルダーがあります: - + There are folders that were not synchronized because they are too big or external storages: 大きすぎたか、外部ストレージにあるため同期されなかったフォルダーがあります: - + Confirm Account Removal アカウント削除確認 - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p> アカウント <i>%1</i> を本当に削除しますか?</p><p><b>注意:</b> これによりファイルが一切削除されることはありません。</p> - + Remove connection 接続削除 - - + + Open folder フォルダーを開く - + Log out ログアウト - + Resume sync 再開 - + Pause sync 一時停止 - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>フォルダー<i>%1</i>の同期を本当に止めますか?</p><p><b>注:</b> これによりファイルが一切削除されることはありません。</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %2 の %1(%3%) 利用中。外部ネットワークストレージや共有フォルダーを含むフォルダーがある場合は、容量の上限値が異なる可能性があります。 - + %1 of %2 in use %2 のうち %1 を使用中 - + Currently there is no storage usage information available. 現在、利用できるストレージ利用状況はありません。 - + No %1 connection configured. %1 の接続は設定されていません。 @@ -373,7 +373,7 @@ Maintenance mode - + メンテナンスモード @@ -388,7 +388,7 @@ Asking Credentials - + 証明書を要求 @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured ownCloudアカウントが設定されていません - + The configured server for this client is too old このクライアントのサーバー設定は古すぎます。 - + Please update to the latest server and restart the client. サーバーを最新にアップデートして、クライアントを再起動してください。 - + Authentication error: Either username or password are wrong. 認証エラー: ユーザー名またはパスワードが間違っています。 - + timeout タイムアウト - + The provided credentials are not correct 入力された資格情報が正しくありません @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user ユーザーによって中止されました @@ -941,12 +941,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an 同期フォルダーを追加 - + Synchronizing with local folder ローカルフォルダーを同期中 - + File ファイル @@ -988,7 +988,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an There are unresolved conflicts. Click for details. - + 未解決の競合があります。クリックで詳細。 @@ -1094,12 +1094,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizard - + Add Folder Sync Connection 同期フォルダーを追加 - + Add Sync Connection 同期接続を追加 @@ -1107,17 +1107,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardLocalPath - + Click to select a local folder to sync. 同期したいローカルフォルダーをクリックしてください。 - + Enter the path to the local folder. ローカルフォルダーのパスを入力してください。 - + Select the source folder ソースフォルダーを選択 @@ -1125,47 +1125,47 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardRemotePath - + Create Remote Folder リモートフォルダーを追加 - + Enter the name of the new folder to be created below '%1': '%1'の下に新しいフォルダーの名前を入力: - + Folder was successfully created on %1. %1 にフォルダーが作成されました。 - + Authentication failed accessing %1 %1 アクセス中に認証に失敗しました - + Failed to create the folder on %1. Please check manually. %1 にフォルダーを作成できませんでした。手作業で確認してください。 - + Failed to list a folder. Error: %1 フォルダーをリストアップできません。エラー: %1 - + Choose this to sync the entire account アカウント全体を同期する場合はこちらを選択 - + This folder is already being synced. このフォルダーはすでに同期されています。 - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. <i>%1</i>は、<i>%2</i>の親フォルダーですでに同期しています。 @@ -1173,12 +1173,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>警告:</b> %1 - + <b>Warning:</b> <b>警告:</b> @@ -1396,7 +1396,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from List of issues - + 課題一覧 @@ -1448,7 +1448,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from Issue - + 課題 @@ -2707,33 +2707,33 @@ It is not advisable to use it. - + Delete 削除 - + Open link in browser - + Copy link to clipboard - + Copy link to clipboard (direct download) - + Send link by email メールでリンクを送信 - + Send link by email (direct download) @@ -2867,12 +2867,12 @@ It is not advisable to use it. OCC::ShibbolethCredentials - + Login Error ログインエラー - + You must sign in as user %1 ユーザー %1 としてログインする必要があります @@ -3217,38 +3217,38 @@ It is not advisable to use it. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() %1 しか空き容量がありません、開始するためには少なくとも %2 は必要です。 - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder 親フォルダーを追加する権限がありません - + Not allowed because you don't have permission to add files in that folder そのフォルダーにファイルを追加する権限がありません - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3338,89 +3338,94 @@ It is not advisable to use it. ファイル名が長すぎます - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. - + Stat failed. 情報取得エラー - + Filename encoding is not valid ファイル名のエンコーディングが無効です。 - + Invalid characters, please rename "%1" 無効な文字です、"%1" を変更してください。 - + Unable to read the blacklist from the local database ローカルデータベースからブラックリストを読み込みできません - + Unable to read from the sync journal. 同期ジャーナルから読み込みできません - + Cannot open the sync journal 同期ジャーナルを開くことができません - + File name contains at least one invalid character ファイル名に1文字以上の無効な文字が含まれています - - + + Ignored because of the "choose what to sync" blacklist "同期対象先" ブラックリストにより無視されました。 - + Not allowed because you don't have permission to add subfolders to that folder そのフォルダーにサブフォルダーを追加する権限がありません - + Not allowed to upload this file because it is read-only on the server, restoring サーバーでは読み取り専用となっているため、このファイルをアップロードすることはできません、復元しています - - + + Not allowed to remove, restoring 削除できないので復元しています - + Local files and share folder removed. ローカルファイルと共有フォルダーを削除しました。 - + Move not allowed, item restored 移動できないので項目を復元しました - + Move not allowed because %1 is read-only %1 は読み取り専用のため移動できません - + the destination 移動先 - + the source 移動元 @@ -3462,17 +3467,17 @@ It is not advisable to use it. OCC::ValidateChecksumHeader - + The checksum header is malformed. ヘッダーのチェックサムが異常です。 - + The checksum header contained an unknown checksum type '%1' チェックサムヘッダーに '%1' という未知のチェックサムが含まれていました - + The downloaded file does not match the checksum, it will be resumed. ダウンロードしたファイルがチェックサムエラーです。再ダウンロードします。 diff --git a/translations/client_nb_NO.ts b/translations/client_nb_NO.ts index 8086b3e0d..42c272b95 100644 --- a/translations/client_nb_NO.ts +++ b/translations/client_nb_NO.ts @@ -135,8 +135,8 @@ - - + + Cancel Avbryt @@ -166,184 +166,184 @@ Konto - + Choose what to sync Velg hva som synkroniseres - + Force sync now Tving synkronisering nå - + Restart sync Prøv synkronisering igjen - + Remove folder sync connection Fjern tilkobling for mappe-synkronisering - + Folder creation failed Oppretting av mappe feilet - + <p>Could not create local folder <i>%1</i>. <p>Klarte ikke å opprette lokal mappe <i>%1</i>. - + Confirm Folder Sync Connection Removal Bekreft fjerning av tilkobling for mappe-synkronisering - + Remove Folder Sync Connection Fjern tilkobling for mappe-synkronisering - + Sync Running Synkroniserer... - + The syncing operation is running.<br/>Do you want to terminate it? Synkronisering kjører.<br/>Vil du avbryte den? - + %1 in use %1 i bruk - + %1 as <i>%2</i> %1 som <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. Server-versjonen %1 er gammel og støttes ikke! Fortsett på egen risiko. - + Connected to %1. Tilkoblet %1. - + Server %1 is temporarily unavailable. Server %1 er midlertidig utilgjengelig. - + Server %1 is currently in maintenance mode. Server %1 er for øyeblikket i vedlikeholdsmodus. - + Signed out from %1. Logget ut fra %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... Kobler til %1... - + No connection to %1 at %2. Ingen tilkobling til %1 på %2. - + Log in Logg inn - + There are folders that were not synchronized because they are too big: Noen mapper ble ikke synkronisert fordi de er for store - + There are folders that were not synchronized because they are external storages: Noen mapper ble ikke synkronisert fordi de er eksterne lagringsplasser: - + There are folders that were not synchronized because they are too big or external storages: Noen mapper ble ikke synkronisert fordi de er for store eller de er eksterne lagringsplasser: - + Confirm Account Removal Bekreft fjerning av konto - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Vil du virkelig fjerne tilkoblingen til kontoen <i>%1</i>?</p><p><b>Merk:</b> Dette vil <b>ikke</b> slette noen filer.</p> - + Remove connection Fjern tilkobling - - + + Open folder Åpne mappe - + Log out Logg ut - + Resume sync Fortsett synkronisering - + Pause sync Sett synkronisering på pause - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Vil du virkelig stoppe synkronisering av mappen <i>%1</i>?</p><p><b>Merk:</b> Dette vil <b>ikke</b> slette noen filer.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) av %2 i bruk. Noen mapper, inkludert nettverkstilkoblede eller delte mapper, kan ha andre begrensninger. - + %1 of %2 in use %1 av %2 i bruk - + Currently there is no storage usage information available. Ingen informasjon om bruk av lagringsplass tilgjengelig for øyeblikket. - + No %1 connection configured. Ingen %1-forbindelse konfigurert. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured Ingen ownCloud-konter konfigurert - + The configured server for this client is too old Den konfigurerte serveren for denne klienten er for gammel - + Please update to the latest server and restart the client. Vennligst oppdatert til den nyeste serveren og start klienten på nytt. - + Authentication error: Either username or password are wrong. Autentiseringsfeil: Bruker navn eller passord er feil. - + timeout tidsavbrudd - + The provided credentials are not correct Oppgitt påloggingsinformasjon er feil @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Avbrutt av brukeren @@ -691,17 +691,17 @@ %1 and %n other file(s) have been removed. - %1 og %2 annen fil har blitt fjernet.%1 og %2 andre filer har blitt fjernet. + %1 og %n annen fil har blitt fjernet.%1 og %n andre filer har blitt fjernet. %1 and %n other file(s) have been downloaded. - %1 og %2 annen fil har blitt lastet ned.%1 og %n andre filer har blitt lastet ned. + %1 og %n annen fil har blitt lastet ned.%1 og %n andre filer har blitt lastet ned. %1 and %n other file(s) have been updated. - %1 og %2 annen fil har blitt oppdatert.%1 og %n andre filer har blitt oppdatert. + %1 og %n annen fil har blitt oppdatert.%1 og %n andre filer har blitt oppdatert. @@ -942,12 +942,12 @@ Hvis synkroniseringen fortsetter som normalt, vil alle filene dine bli overskrev Legg til mappe-synkronisering - + Synchronizing with local folder Synkroniserer med lokal mappe - + File Fil @@ -1095,12 +1095,12 @@ Hvis synkroniseringen fortsetter som normalt, vil alle filene dine bli overskrev OCC::FolderWizard - + Add Folder Sync Connection Legg til mappe-synkronisering - + Add Sync Connection Legg til tilkobling for synkronisering @@ -1108,17 +1108,17 @@ Hvis synkroniseringen fortsetter som normalt, vil alle filene dine bli overskrev OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Klikk for å velge en lokal mappe å synkronisere. - + Enter the path to the local folder. Legg inn stien til den lokale mappen. - + Select the source folder Velg kildemappe @@ -1126,47 +1126,47 @@ Hvis synkroniseringen fortsetter som normalt, vil alle filene dine bli overskrev OCC::FolderWizardRemotePath - + Create Remote Folder Opprett ekstern mappe - + Enter the name of the new folder to be created below '%1': Oppgi navnet på den nye mappen som skal opprettes under '%1': - + Folder was successfully created on %1. Mappen ble opprettet på %1. - + Authentication failed accessing %1 Autentisering feilet ved tilgang til %1 - + Failed to create the folder on %1. Please check manually. Klarte ikke å opprette mappen på %1. Sjekk manuelt. - + Failed to list a folder. Error: %1 Klarte ikke å liste en mappe. Feil: %1 - + Choose this to sync the entire account Velg dette for å synkronisere en hel konto - + This folder is already being synced. Denne mappen synkroniseres allerede. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Du synkroniserer allerede <i>%1</i>, som er foreldremappe for <i>%2</i>. @@ -1174,12 +1174,12 @@ Hvis synkroniseringen fortsetter som normalt, vil alle filene dine bli overskrev OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Advarsel:</b> %1 - + <b>Warning:</b> <b>Advarsel:</b> @@ -1408,7 +1408,7 @@ Elementer hvor sletting er tillatt, vil bli slettet hvis de forhindrer fjerning <no filter> - + <no filter> @@ -2710,33 +2710,33 @@ Det er ikke tilrådelig å bruke den. - + Delete Slett - + Open link in browser - + Copy link to clipboard - + Copy link to clipboard (direct download) - + Send link by email Send link i e-post - + Send link by email (direct download) @@ -2870,12 +2870,12 @@ Det er ikke tilrådelig å bruke den. OCC::ShibbolethCredentials - + Login Error Innloggingsfeil - + You must sign in as user %1 Du må logge inn som bruker %1 @@ -3220,38 +3220,38 @@ Det er ikke tilrådelig å bruke den. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Bare %1 er tilgjengelig, trenger minst %2 for å begynne - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder Ikke tillatt fordi du ikke har lov til å legge til foreldremappe - + Not allowed because you don't have permission to add files in that folder Ikke tillatt fordi du ikke har lov til å opprette filer i den mappen - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3341,89 +3341,94 @@ Det er ikke tilrådelig å bruke den. Filnavn er for langt. - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. Uløst konflikt - + Stat failed. Stat feilet. - + Filename encoding is not valid Filnavn-koding er ikke gyldig - + Invalid characters, please rename "%1" Ugyldige tegn, gi et annet navn til "%1" - + Unable to read the blacklist from the local database Kan ikke lese svartelisten fra den lokale databasen - + Unable to read from the sync journal. Kan ikke lese fra synkroniseringsjournalen - + Cannot open the sync journal Kan ikke åpne synkroniseringsjournalen - + File name contains at least one invalid character Filnavnet inneholder minst ett ulovlig tegn - - + + Ignored because of the "choose what to sync" blacklist Ignorert på grunn av svartelisten "velg hva som skal synkroniseres" - + Not allowed because you don't have permission to add subfolders to that folder Ikke tillatt fordi du ikke har lov til å lage undermapper i den mappen - + Not allowed to upload this file because it is read-only on the server, restoring Ikke tillatt å laste opp denne filenfordi den er skrivebeskyttet på serveren, gjenoppretter - - + + Not allowed to remove, restoring Ikke tillatt å fjerne, gjenoppretter - + Local files and share folder removed. Lokale filer og delingsmappe fjernet. - + Move not allowed, item restored Flytting ikke tillatt, element gjenopprettet - + Move not allowed because %1 is read-only Flytting ikke tillatt fordi %1 er skrivebeskyttet - + the destination målet - + the source kilden @@ -3465,17 +3470,17 @@ Det er ikke tilrådelig å bruke den. OCC::ValidateChecksumHeader - + The checksum header is malformed. Sjekksum-headeren har feil format. - + The checksum header contained an unknown checksum type '%1' Sjekksum-header inneholdt ukjent sjekksum-type '%1' - + The downloaded file does not match the checksum, it will be resumed. Den nedlastede filen passer ikke med sjekksummen, den vil bli gjenopptatt. diff --git a/translations/client_nl.ts b/translations/client_nl.ts index aea940ae4..7aff8a8c8 100644 --- a/translations/client_nl.ts +++ b/translations/client_nl.ts @@ -135,8 +135,8 @@ - - + + Cancel Annuleren @@ -166,184 +166,184 @@ Account - + Choose what to sync Selectieve synchronisatie - + Force sync now Forceer sync nu - + Restart sync Herstarten sync - + Remove folder sync connection Verwijderen map sync verbinding - + Folder creation failed Maken map mislukt - + <p>Could not create local folder <i>%1</i>. <p>Kon lokale map <i>%1</i> niet maken. - + Confirm Folder Sync Connection Removal Bevestig verwijderen Map Sync verbinding - + Remove Folder Sync Connection Verwijderen Map Sync verbinding - + Sync Running Bezig met synchroniseren - + The syncing operation is running.<br/>Do you want to terminate it? Bezig met synchroniseren.<br/>Wilt u stoppen met synchroniseren? - + %1 in use %1 in gebruik - + %1 as <i>%2</i> %1 als <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. De serverversie %1 is oud en wordt niet meer ondersteund. Verdergaan is op eigen risico. - + Connected to %1. Verbonden met %1. - + Server %1 is temporarily unavailable. Server %1 is tijdelijk niet beschikbaar - + Server %1 is currently in maintenance mode. - + Signed out from %1. Uitgelogd van %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... - + No connection to %1 at %2. Geen verbinding met %1 op %2. - + Log in Meld u aan - + There are folders that were not synchronized because they are too big: Er zijn mappen die niet gesynchroniseerd werden, omdat ze te groot zijn: - + There are folders that were not synchronized because they are external storages: Er zijn mappen die niet gesynchroniseerd werden, omdat ze op externe opslag staan: - + There are folders that were not synchronized because they are too big or external storages: Er zijn mappen die niet gesynchroniseerd werden, omdat ze te groot zijn of op externe opslag staan: - + Confirm Account Removal Bevestig verwijderen account - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Wilt u echt de verbinding met het account <i>%1</i> verbreken?</p><p><b>Let op:</b> Hierdoor verwijdert u <b>geen</b> bestanden.</p> - + Remove connection Verwijderen verbinding - - + + Open folder Openen map - + Log out Afmelden - + Resume sync Hervatten sync - + Pause sync Pauzeren sync - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Weet u zeker dat u de synchronisatie van map <i>%1</i> wilt stoppen?</p><p><b>Opmerking:</b> Dit zal <b>geen</b> bestanden verwijderen.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) van %2 in gebruik. Sommige mappen, inclusief netwerkmappen en gedeelde mappen, kunnen andere limieten hebben. - + %1 of %2 in use %1 van %2 in gebruik - + Currently there is no storage usage information available. Er is nu geen informatie over het gebruik van de opslagruimte beschikbaar. - + No %1 connection configured. Geen %1 connectie geconfigureerd. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured Geen ownCloud-account geconfigureerd - + The configured server for this client is too old De voor dit programma ingestelde server is te oud - + Please update to the latest server and restart the client. Werk de server bij naar de nieuwste versie en herstart het programma. - + Authentication error: Either username or password are wrong. Authenticatiefout: Gebruikersnaam of wachtwoord onjuist. - + timeout time-out - + The provided credentials are not correct De verstrekte inloggegevens zijn niet juist @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Afgebroken door de gebruiker @@ -942,12 +942,12 @@ Doorgaan met deze synchronisatie overschrijft al uw bestanden door een eerdere v Toevoegen mapsync verbinding - + Synchronizing with local folder Synchroniseren met lokale map - + File Bestand @@ -1096,12 +1096,12 @@ Doorgaan met deze synchronisatie overschrijft al uw bestanden door een eerdere v OCC::FolderWizard - + Add Folder Sync Connection Toevoegen mapsync verbinding - + Add Sync Connection Toevoegen Sync verbinding @@ -1109,17 +1109,17 @@ Doorgaan met deze synchronisatie overschrijft al uw bestanden door een eerdere v OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Klikken om een lokale map te selecteren voor synchronisatie - + Enter the path to the local folder. Geef het pad op naar de lokale map. - + Select the source folder Selecteer de bronmap @@ -1127,47 +1127,47 @@ Doorgaan met deze synchronisatie overschrijft al uw bestanden door een eerdere v OCC::FolderWizardRemotePath - + Create Remote Folder Externe map aanmaken - + Enter the name of the new folder to be created below '%1': Voer de naam van de hieronder te maken nieuwe map in '%1': - + Folder was successfully created on %1. Map is succesvol aangemaakt op %1. - + Authentication failed accessing %1 Authenticatie mislukt bij benaderen %1 - + Failed to create the folder on %1. Please check manually. Aanmaken van de map op %1 mislukt. Controleer handmatig. - + Failed to list a folder. Error: %1 Tonen mappenlijst mislukt. Fout: %1 - + Choose this to sync the entire account Kies dit om uw volledige account te synchroniseren - + This folder is already being synced. Deze map is al gesynchroniseerd. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. U synchroniseert <i>%1</i> al, dat is de bovenliggende map van <i>%2</i>. @@ -1175,12 +1175,12 @@ Doorgaan met deze synchronisatie overschrijft al uw bestanden door een eerdere v OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Waarschuwing:</b> %1 - + <b>Warning:</b> <b>Waarschuwing:</b> @@ -2715,33 +2715,33 @@ We adviseren deze site niet te gebruiken. - + Delete Verwijderen - + Open link in browser - + Copy link to clipboard - + Copy link to clipboard (direct download) - + Send link by email Versturen links via e-mail - + Send link by email (direct download) @@ -2875,12 +2875,12 @@ We adviseren deze site niet te gebruiken. OCC::ShibbolethCredentials - + Login Error Inlogfout - + You must sign in as user %1 U moet inloggen als gebruiker %1 @@ -3225,38 +3225,38 @@ We adviseren deze site niet te gebruiken. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Slechts %1 beschikbaar, maar heeft minimaal %2 nodig om te starten - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder Niet toegestaan omdat u geen rechten hebt om een bovenliggende map toe te voegen - + Not allowed because you don't have permission to add files in that folder Niet toegestaan omdat u geen rechten hebt om bestanden in die map toe te voegen - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3346,89 +3346,94 @@ We adviseren deze site niet te gebruiken. De bestandsnaam is te lang. - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. - + Stat failed. Stat mislukt. - + Filename encoding is not valid Bestandsnaamcodering is niet geldig - + Invalid characters, please rename "%1" Ongeldige tekens, hernoem "%1" - + Unable to read the blacklist from the local database Kan de blacklist niet lezen uit de lokale database - + Unable to read from the sync journal. Niet mogelijk om te lezen uit het synchronisatie verslag. - + Cannot open the sync journal Kan het sync transactielog niet openen - + File name contains at least one invalid character De bestandsnaam bevat ten minste één ongeldig teken - - + + Ignored because of the "choose what to sync" blacklist Genegeerd vanwege de "wat synchroniseren" zwarte lijst - + Not allowed because you don't have permission to add subfolders to that folder Niet toegestaan, omdat je geen permissies hebt om submappen aan die map toe te voegen - + Not allowed to upload this file because it is read-only on the server, restoring Niet toegestaan om dit bestand te uploaden, omdat het alleen-lezen is op de server, herstellen - - + + Not allowed to remove, restoring Niet toegestaan om te verwijderen, herstellen - + Local files and share folder removed. Lokale bestanden en share-map verwijderd. - + Move not allowed, item restored Verplaatsen niet toegestaan, object hersteld - + Move not allowed because %1 is read-only Verplaatsen niet toegestaan, omdat %1 alleen-lezen is - + the destination bestemming - + the source bron @@ -3470,17 +3475,17 @@ We adviseren deze site niet te gebruiken. OCC::ValidateChecksumHeader - + The checksum header is malformed. De header van het controlegetal is misvormd. - + The checksum header contained an unknown checksum type '%1' Het header controlegetal bevat een onbekend controlegetal type '%1' - + The downloaded file does not match the checksum, it will be resumed. Het gedownloade bestand komt niet overeen met het controlegetal. Het wordt opnieuw verwerkt. diff --git a/translations/client_pl.ts b/translations/client_pl.ts index eba27612a..515acd5b2 100644 --- a/translations/client_pl.ts +++ b/translations/client_pl.ts @@ -135,8 +135,8 @@ - - + + Cancel Anuluj @@ -166,184 +166,184 @@ Konto - + Choose what to sync Wybierz co synchronizować - + Force sync now Zsynchronizuj teraz - + Restart sync Uruchom ponownie synchronizację - + Remove folder sync connection Usuń folder połączenia synchronizacji - + Folder creation failed Nie udało się stworzyć katalogu - + <p>Could not create local folder <i>%1</i>. <p>Nie można stworzyć lokalnego katalogu <i>%1</i>. - + Confirm Folder Sync Connection Removal Usuń folder połączenia synchronizacji - + Remove Folder Sync Connection Usuń folder połączenia synchronizacji - + Sync Running Synchronizacja uruchomiona - + The syncing operation is running.<br/>Do you want to terminate it? Operacja synchronizacji jest uruchomiona.<br>Czy chcesz ją zakończyć? - + %1 in use %1 w użyciu - + %1 as <i>%2</i> %1 jako <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. Wersja serwera %1 jest przestarzała i nie jest już wspierana. Kontynuujesz na własne ryzyko. - + Connected to %1. Podłączony do %1. - + Server %1 is temporarily unavailable. Serwer %1 jest tymczasowo niedostępny. - + Server %1 is currently in maintenance mode. - + Serwer %1 jest obecnie w trybie konserwacji. - + Signed out from %1. Wylogowano z %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... - + Łączenie do %1... - + No connection to %1 at %2. Brak połączenia do %1 z %2. - + Log in Zaloguj - + There are folders that were not synchronized because they are too big: Te foldery nie zostały zsynchronizowane ponieważ są zbyt duze: - + There are folders that were not synchronized because they are external storages: Te foldery nie zostały zsynchronizowane ponieważ znajdują się w pamięci zewnętrznej: - + There are folders that were not synchronized because they are too big or external storages: Te foldery nie zostały zsynchronizowane ponieważ są zbyt duże lub znajdują się w pamięci zewnętrznej: - + Confirm Account Removal Potwierdź usunięcie konta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Czy na pewno chcesz usunąć połączenie z kontem <i>%1</i>?</p><p><b>Uwaga:</b> ta operacja <b>nie</b> usunie plików klienta.</p> - + Remove connection Usuwanie połączenia - - + + Open folder Otwórz katalog - + Log out Wyloguj - + Resume sync Przywróć synchronizację - + Pause sync Zatrzymaj synchronizację - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Czy na pewno chcesz zatrzymać synchronizację folderu <i>%1</i>?</p><p><b>Uwaga:</b> ta operacja <b>nie</b> usunie plików z klienta.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) z %2 w użyciu. Niektóre foldery, w tym zamontowane lub udostępnione foldery w sieci, mogą mieć różne limity. - + %1 of %2 in use %1 z %2 w użyciu - + Currently there is no storage usage information available. Obecnie nie ma dostępnych informacji o wykorzystaniu pamięci masowej. - + No %1 connection configured. Połączenie %1 nie skonfigurowane. @@ -373,7 +373,7 @@ Maintenance mode - + Tryb konserwacji @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured Nie skonfigurowano konta ownCloud - + The configured server for this client is too old Konfigurowany serwer dla tego klienta jest za stary - + Please update to the latest server and restart the client. Proszę zaaktualizować serwer do najnowszej wersji i zrestartować klienta. - + Authentication error: Either username or password are wrong. Błąd autentykacji: nazwa użytkownika lub hasło są nieprawidłowe. - + timeout wygaśnięcie - + The provided credentials are not correct Podane dane logowania są nieprawidłowe @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Anulowane przez użytkownika @@ -768,7 +768,10 @@ These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore. If you decide to keep the files, they will be re-synced with the server if you have rights to do so. If you decide to delete the files, they will be unavailable to you, unless you are the owner. - + Wszystkie pliki z folderu '%1' zostały usunięte z serwera. +W momencie synchronizacji zostaną usunięte z lokalnego katalogu, co spowoduje ich niedostępność, chyba, że posiadasz prawo do przywracania. +Jeśli zdecydujesz się zatrzymać pliki i posiadasz odpowiednie uprawnienia, zostaną one ponownie przesłane na serwer. +Jeśli zdecydujesz je usunąć, nie będą więcej dostępne. @@ -936,12 +939,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an Dodaj folder połączenia synchronizacji - + Synchronizing with local folder Synchronizacja z folderem lokalnym. - + File Plik @@ -1089,12 +1092,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizard - + Add Folder Sync Connection Dodaj folder połączenia synchronizacji - + Add Sync Connection Dodaj połączenie synchronizacji @@ -1102,17 +1105,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Kliknij, aby wybrać folder lokalny do synchronizacji. - + Enter the path to the local folder. Wpisz ścieżkę do folderu lokalnego. - + Select the source folder Wybierz katalog źródłowy @@ -1120,47 +1123,47 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardRemotePath - + Create Remote Folder Dodaj zdalny katalog - + Enter the name of the new folder to be created below '%1': Wpisz nazwę dla nowego katalogu, utworzonego poniżej '%1': - + Folder was successfully created on %1. Folder został utworzony pomyślnie na %1 - + Authentication failed accessing %1 Błąd autentykacji w dostępie do %1 - + Failed to create the folder on %1. Please check manually. Nie udało się utworzyć folderu na %1. Proszę sprawdzić ręcznie. - + Failed to list a folder. Error: %1 Nie udało się wyświetlić folderu. Błąd: %1 - + Choose this to sync the entire account Wybierz to, aby zsynchronizować całe konto - + This folder is already being synced. Ten katalog jest już synchronizowany. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Synchronizujesz już <i>%1</i>, który jest folderem nadrzędnym <i>%2</i>. @@ -1168,12 +1171,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Ostrzeżenie:</b> %1 - + <b>Warning:</b> <b>Ostrzeżenie:</b> @@ -2704,33 +2707,33 @@ Niezalecane jest jego użycie. - + Delete Usuń - + Open link in browser - + Copy link to clipboard - + Copy link to clipboard (direct download) - + Send link by email Wyślij link mailem - + Send link by email (direct download) @@ -2864,12 +2867,12 @@ Niezalecane jest jego użycie. OCC::ShibbolethCredentials - + Login Error Błąd logowania - + You must sign in as user %1 Musisz zalogować się jako użytkownik %1 @@ -3214,38 +3217,38 @@ Niezalecane jest jego użycie. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder Niedozwolone, ponieważ nie masz uprawnień do dodawania katalogu nadrzędnego - + Not allowed because you don't have permission to add files in that folder Niedozwolone, ponieważ nie masz uprawnień do dodawania plików w tym katalogu - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3335,89 +3338,94 @@ Niezalecane jest jego użycie. Nazwa pliku zbyt długa - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. - + Stat failed. Błąd statystyk. - + Filename encoding is not valid - + Invalid characters, please rename "%1" - + Unable to read the blacklist from the local database Nie można odczytać czarnej listy z lokalnej bazy danych - + Unable to read from the sync journal. Nie można czytać z dziennika synchronizacji. - + Cannot open the sync journal Nie można otworzyć dziennika synchronizacji - + File name contains at least one invalid character Nazwa pliku zawiera co najmniej jeden nieprawidłowy znak - - + + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder Niedozwolone, ponieważ nie masz uprawnień do dodawania podkatalogów w tym katalogu - + Not allowed to upload this file because it is read-only on the server, restoring Wgrywanie niedozwolone, ponieważ plik jest tylko do odczytu na serwerze, przywracanie - - + + Not allowed to remove, restoring Brak uprawnień by usunąć, przywracanie - + Local files and share folder removed. Lokalne pliki i udostępniane foldery zostały usunięte. - + Move not allowed, item restored Przenoszenie niedozwolone, obiekt przywrócony - + Move not allowed because %1 is read-only Przenoszenie niedozwolone, ponieważ %1 jest tylko do odczytu - + the destination docelowy - + the source źródło @@ -3459,17 +3467,17 @@ Niezalecane jest jego użycie. OCC::ValidateChecksumHeader - + The checksum header is malformed. - + The checksum header contained an unknown checksum type '%1' - + The downloaded file does not match the checksum, it will be resumed. @@ -3763,7 +3771,7 @@ Niezalecane jest jego użycie. Ask for confirmation before synchronizing e&xternal storages - + Pytaj o potwierdzenie przed synchronizacją napędów zewnętrznych @@ -3829,12 +3837,12 @@ Niezalecane jest jego użycie. An error occured while connecting. Please try again. - + Podczas połączenia wystąpił problem. Proszę spróbować ponownie. Re-open Browser - + Otwórz przeglądarkę ponownie @@ -4162,12 +4170,12 @@ Kliknij Could not open browser - + Nie można otworzyć przeglądarki There was an error when launching the browser to go to URL %1. Maybe no default browser is configured? - + Podczas uruchamiania przeglądarki aby przejść do adresu URL %1 wystąpił problem. Czy skonfigurowano domyślną przeglądarkę? @@ -4177,7 +4185,7 @@ Kliknij There was an error when launching the email client to create a new message. Maybe no default email client is configured? - + Podczas uruchamiania klienta poczty wystąpił problem. Czy skonfigurowano domyślnego klienta pocztowego? \ No newline at end of file diff --git a/translations/client_pt.ts b/translations/client_pt.ts index e5766104f..fad3f1776 100644 --- a/translations/client_pt.ts +++ b/translations/client_pt.ts @@ -135,8 +135,8 @@ - - + + Cancel Cancelar @@ -166,184 +166,184 @@ Conta - + Choose what to sync Escolher o que sincronizar - + Force sync now Forçar a sincronização - + Restart sync Retomar sincronização - + Remove folder sync connection Remover ligação de sincronização de pasta - + Folder creation failed Não foi possível criar a pasta - + <p>Could not create local folder <i>%1</i>. <p>Não foi possível criar a pasta local<i>%1</i>. - + Confirm Folder Sync Connection Removal Confirmar Remoção da Ligação de Sincronização de Pasta - + Remove Folder Sync Connection Remover Ligação da Sincronização de Pasta - + Sync Running Sincronização em Execução - + The syncing operation is running.<br/>Do you want to terminate it? A operação de sincronização está em execução.<br/>Deseja terminá-la? - + %1 in use %1 em utilização - + %1 as <i>%2</i> %1 como <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. A versão %1 do servidor é antiga e não é suportada! Prossiga por sua conta e risco. - + Connected to %1. Ligado a %1. - + Server %1 is temporarily unavailable. O servidor %1 está temporariamente indisponível. - + Server %1 is currently in maintenance mode. O Servidor %1 encontra-se em manutenção - + Signed out from %1. Terminou a sessão de %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... A Conectar a %1... - + No connection to %1 at %2. Sem ligação para %1 em %2. - + Log in Iniciar Sessão - + There are folders that were not synchronized because they are too big: Existem pastas que não foram sincronizadas por serem demasiado grandes: - + There are folders that were not synchronized because they are external storages: Existem pastas que não foram sincronizadas por serem armazenamento externo: - + There are folders that were not synchronized because they are too big or external storages: Existem pastas que não foram sincronizadas por serem demasiado grandes ou armazenamento externo: - + Confirm Account Removal Confirmar Remoção da Conta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Deseja mesmo remover a ligação da conta <i>%1</i>?</p><p><b>Nota:</b> isto <b>não</b> irá eliminar quaisquer ficheiros.</p> - + Remove connection Remover ligação - - + + Open folder Abrir pasta - + Log out Terminar sessão - + Resume sync Retomar sincronização - + Pause sync Pausar sincronização - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Deseja mesmo parar a sincronização da pasta <i>%1</i>?</p><p><b>Nota:</b> isto <b>não</b> irá eliminar qualquer ficheiro.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) de %2 em utilização. Algumas pastas, incluindo a rede montada ou as pastas partilhadas, podem ter limites diferentes. - + %1 of %2 in use %1 de %2 em utilização - + Currently there is no storage usage information available. Atualmente não está disponível nenhuma informação da utilização do armazenamento. - + No %1 connection configured. %1 sem ligação configurada. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured Não foi configurada nenhuma conta ownCloud - + The configured server for this client is too old O servidor configurado para este cliente é muito antigo - + Please update to the latest server and restart the client. Por favor, atualize para a ultima versão do servidor e reinicie o cliente. - + Authentication error: Either username or password are wrong. Erro de autenticação: o nome de utilizador ou a palavra-passe estão errados. - + timeout tempo expirado - + The provided credentials are not correct As credenciais fornecidas não estão corretas @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Abortado pelo utilizador @@ -943,12 +943,12 @@ Continuando a sincronização fará com que todos os seus ficheiros sejam substi Adicionar Ligação de Sincronização de Pasta - + Synchronizing with local folder A sincronizar com a pasta local - + File Ficheiro @@ -1096,12 +1096,12 @@ Continuando a sincronização fará com que todos os seus ficheiros sejam substi OCC::FolderWizard - + Add Folder Sync Connection Adicionar Ligação de Sincronização de Pasta - + Add Sync Connection Adicionar Ligação de Sincronização @@ -1109,17 +1109,17 @@ Continuando a sincronização fará com que todos os seus ficheiros sejam substi OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Clique para selecionar a pasta local para sincronizar. - + Enter the path to the local folder. Insira o caminho para a pasta local. - + Select the source folder Selecione a pasta de origem @@ -1127,47 +1127,47 @@ Continuando a sincronização fará com que todos os seus ficheiros sejam substi OCC::FolderWizardRemotePath - + Create Remote Folder Criar Pasta Remota - + Enter the name of the new folder to be created below '%1': Insira o nome da nova pasta para ser criada em baixo '%1': - + Folder was successfully created on %1. A pasta foi criada com sucesso em %1. - + Authentication failed accessing %1 A autenticação falhou ao aceder %1 - + Failed to create the folder on %1. Please check manually. Não foi possível criar a pasta em %1. Por favor, verifique manualmente. - + Failed to list a folder. Error: %1 Não foi possível listar uma pasta. Erro: %1 - + Choose this to sync the entire account Escolha isto para sincronizar a conta completa - + This folder is already being synced. Esta pasta já foi sincronizada. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Já está a sincronizar <i>%1</i>, que é uma pasta de origem de <i>%2</i>. @@ -1175,12 +1175,12 @@ Continuando a sincronização fará com que todos os seus ficheiros sejam substi OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Aviso:</b> %1 - + <b>Warning:</b> <b>Aviso:</b> @@ -2711,33 +2711,33 @@ Não é aconselhada a sua utilização. - + Delete Eliminar - + Open link in browser - + Copy link to clipboard - + Copy link to clipboard (direct download) - + Send link by email Enviar hiperligação por e-mail - + Send link by email (direct download) @@ -2871,12 +2871,12 @@ Não é aconselhada a sua utilização. OCC::ShibbolethCredentials - + Login Error Erro de login - + You must sign in as user %1 Deve fazer o login como utilizador %1. @@ -3221,38 +3221,38 @@ Não é aconselhada a sua utilização. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Apenas %1 estão disponíveis, é preciso um mínimo de %2 para começar - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder Não permitido, porque não tem permissão para adicionar a pasta fonte - + Not allowed because you don't have permission to add files in that folder Não permitido, porque não tem permissão para adicionar os ficheiros nessa pasta - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3342,89 +3342,94 @@ Não é aconselhada a sua utilização. O nome do ficheiro é muito grande - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. Conflito por resolver. - + Stat failed. Estado falhou. - + Filename encoding is not valid Codificação de nome de ficheiro não é válida - + Invalid characters, please rename "%1" Carateres inválidos, por favor, renomeie "%1" - + Unable to read the blacklist from the local database Não foi possível ler a lista negra a partir da base de dados local - + Unable to read from the sync journal. Não foi possível ler a partir do jornal de sincronização. - + Cannot open the sync journal Impossível abrir o jornal de sincronismo - + File name contains at least one invalid character O nome de ficheiro contém pelo menos um caráter inválido - - + + Ignored because of the "choose what to sync" blacklist Ignorado devido à blacklist de escolha para sincronização - + Not allowed because you don't have permission to add subfolders to that folder Não permitido, porque não tem permissão para adicionar as subpastas nessa pasta - + Not allowed to upload this file because it is read-only on the server, restoring Não é permitido enviar este ficheiro porque este é só de leitura no servidor, a restaurar - - + + Not allowed to remove, restoring Não autorizado para remoção, restaurando - + Local files and share folder removed. Ficheiros locais e pasta partilhada removidos. - + Move not allowed, item restored Mover não foi permitido, item restaurado - + Move not allowed because %1 is read-only Mover não foi autorizado porque %1 é só de leitura - + the destination o destino - + the source a origem @@ -3466,17 +3471,17 @@ Não é aconselhada a sua utilização. OCC::ValidateChecksumHeader - + The checksum header is malformed. O cabeçalho de "checksum" está com problemas. - + The checksum header contained an unknown checksum type '%1' O header checksum continha um tipo de checksum desconhecido '%1' - + The downloaded file does not match the checksum, it will be resumed. O ficheiro transferido não corresponde ao "checksum", Este irá ser retomado. diff --git a/translations/client_pt_BR.ts b/translations/client_pt_BR.ts index 12a1ff955..6dbcd008f 100644 --- a/translations/client_pt_BR.ts +++ b/translations/client_pt_BR.ts @@ -135,8 +135,8 @@ - - + + Cancel Cancelar @@ -166,184 +166,184 @@ Conta - + Choose what to sync Escolha o que quer sincronizar - + Force sync now Forçar sincronização agora - + Restart sync Reiniciar a sincronização - + Remove folder sync connection Remover a conexão de sincronização de pastas - + Folder creation failed Falha na criação de pasta - + <p>Could not create local folder <i>%1</i>. <p>Não foi possível criar pasta local <i>%1</i>. - + Confirm Folder Sync Connection Removal Confirme a Remoção de Sincronização de Pasta - + Remove Folder Sync Connection Remover a Conexão de Sincronização de pasta - + Sync Running Sincronização Acontecendo - + The syncing operation is running.<br/>Do you want to terminate it? A operação de sincronização está acontecendo.<br/>Você deseja finaliza-la? - + %1 in use %1 em uso - + %1 as <i>%2</i> %1 como <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. A versão do servidor %1 é antiga e não suportada! Prossiga por conta própria. - + Connected to %1. Conectado a %1. - + Server %1 is temporarily unavailable. O Servidor %1 está temporariamente indisponível. - + Server %1 is currently in maintenance mode. Servidor %1 está atualmente em modo de manutenção. - + Signed out from %1. Desconectado de %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Obtendo autorização do navegador. <a href='%1'>Clique aqui</a> para reabrir o navegador. - + Connecting to %1... Conectando a %1... - + No connection to %1 at %2. Sem conexão para %1 em %2. - + Log in Entrar - + There are folders that were not synchronized because they are too big: Existem pastas que não foram sincronizadas porque são muito grandes: - + There are folders that were not synchronized because they are external storages: Existem pastas que não foram sincronizadas porque são armazenamentos externos: - + There are folders that were not synchronized because they are too big or external storages: Existem pastas que não foram sincronizadas porque são muito grandes ou armazenamentos externos: - + Confirm Account Removal Confirmar a Remoção da Conta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Você realmente deseja remover a conexão desta conta<i>%1</i>?</p><p><b>Nota:</b> Isto <b>não</b> irá deletar nenhum arquivo.</p> - + Remove connection Remover conexão - - + + Open folder Abrir pasta - + Log out Sair - + Resume sync Resumir sincronização - + Pause sync Pausar sincronização - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Você realmente deseja para a sincronização desta pasta <i>%1</i>?</p><p><b>Nota:</b> Isto <b>não</b> vai deletar qualquer arquivo.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) de%2 em uso. Algumas pastas, incluindo montadas na rede ou pastas compartilhadas, podem ter limites diferenes. - + %1 of %2 in use %1 de %2 em uso - + Currently there is no storage usage information available. Atualmente, não há informações de uso de armazenamento disponível. - + No %1 connection configured. Nenhuma %1 conexão configurada. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured Nenhuma conta ownCloud configurada - + The configured server for this client is too old O servidor configurado para este cliente é muito antigo - + Please update to the latest server and restart the client. Por favor, atualize para o último servidor e reinicie o cliente. - + Authentication error: Either username or password are wrong. Erro de autenticação. Ou nome de usuário ou senha está errada. - + timeout tempo limite - + The provided credentials are not correct As credenciais fornecidas não estão corretas @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Abortado pelo usuário @@ -941,12 +941,12 @@ Continuar a sincronização como normal fará com que todos os seus arquivos sej Adicionar Pasta a Sincronizar - + Synchronizing with local folder Sincronizando com a pasta local - + File Arquivo @@ -1094,12 +1094,12 @@ Continuar a sincronização como normal fará com que todos os seus arquivos sej OCC::FolderWizard - + Add Folder Sync Connection Adicionar Conexão de Sincronização de pasta - + Add Sync Connection Adicionar Conexão de Sincronização @@ -1107,17 +1107,17 @@ Continuar a sincronização como normal fará com que todos os seus arquivos sej OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Clique para selecionar uma pasta local para sincronização. - + Enter the path to the local folder. Entre com o caminha para a pasta local. - + Select the source folder Selecione a pasta de origem @@ -1125,47 +1125,47 @@ Continuar a sincronização como normal fará com que todos os seus arquivos sej OCC::FolderWizardRemotePath - + Create Remote Folder Criar uma Pasta Remota - + Enter the name of the new folder to be created below '%1': Entre com o nome da nova pasta a ser criada abaixo '%1': - + Folder was successfully created on %1. Pasta foi criada com sucesso em %1. - + Authentication failed accessing %1 Falha na autenticação acessando %1 - + Failed to create the folder on %1. Please check manually. Falha ao criar a pasta em %1. Por favor, verifique manualmente. - + Failed to list a folder. Error: %1 Falha ao listar uma pasta. Erro: %1 - + Choose this to sync the entire account Escolha esta opção para sincronizar a conta inteira - + This folder is already being synced. Esta pasta já está sendo sincronizada. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Você já está sincronizando <i>%1</i>, que é uma pasta mãe de <i>%2</i>. @@ -1173,12 +1173,12 @@ Continuar a sincronização como normal fará com que todos os seus arquivos sej OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Alerta:</b> %1 - + <b>Warning:</b> <b>Alerta:</b> @@ -2708,33 +2708,33 @@ It is not advisable to use it. Criar linque de compartilhamento público - + Delete Excluir - + Open link in browser Abrir linque no navegador - + Copy link to clipboard Copiar o linque para a área de transferência - + Copy link to clipboard (direct download) Copiar o linque para a área de transferência (download direto) - + Send link by email Enviar linque por e-mail - + Send link by email (direct download) Enviar linque por e-mail (download direto) @@ -2868,12 +2868,12 @@ It is not advisable to use it. OCC::ShibbolethCredentials - + Login Error Erro de Login - + You must sign in as user %1 Você deve entrar como usuário %1 @@ -3218,38 +3218,38 @@ It is not advisable to use it. A hierarquia de pastas é muito profunda - + Conflict: Server version downloaded, local copy renamed and not uploaded. Conflito: Versão do servidor baixada, cópia local renomeada e não carregada. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Apenas %1 estão disponíveis, precisamos de pelo menos %2 para começar - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Não é possível abrir ou criar o banco de dados de sincronização local. Certifique-se de ter acesso de gravação na pasta de sincronização. - + Not allowed because you don't have permission to add parent folder Não permitido porque você não tem permissão para adicionar pasta mãe - + Not allowed because you don't have permission to add files in that folder Não permitido porque você não tem permissão para adicionar arquivos na pasta - + Disk space is low: Downloads that would reduce free space below %1 were skipped. O espaço em disco é pequeno: Os downloads que reduzam o espaço livre abaixo de %1 foram ignorados. - + There is insufficient space available on the server for some uploads. Há espaço disponível no servidor para alguns envios. @@ -3339,89 +3339,94 @@ It is not advisable to use it. O nome do arquivo é muito longo. - + + The filename cannot be encoded on your file system. + O nome do arquivo não pode ser codificado em seu sistema de arquivos. + + + Unresolved conflict. Conflito não solucionado. - + Stat failed. Stat falhou. - + Filename encoding is not valid A codificação do nome do arquivo não é válida - + Invalid characters, please rename "%1" Caracteres inválidos, por favor renomear "%1" - + Unable to read the blacklist from the local database Não é possível ler a lista negra a partir do banco de dados local - + Unable to read from the sync journal. Não é possível ler a partir do relatório de sincronização. - + Cannot open the sync journal Não é possível abrir o arquivo de sincronização - + File name contains at least one invalid character O nome do arquivo contem pelo menos um caractere inválido - - + + Ignored because of the "choose what to sync" blacklist Ignorado por causa da lista negra "escolher o que sincronizar" - + Not allowed because you don't have permission to add subfolders to that folder Não permitido porque você não tem permissão para adicionar subpastas para essa pasta - + Not allowed to upload this file because it is read-only on the server, restoring Não é permitido fazer o upload deste arquivo porque ele é somente leitura no servidor, restaurando - - + + Not allowed to remove, restoring Não é permitido remover, restaurando - + Local files and share folder removed. Arquivos locais e pasta compartilhada removida. - + Move not allowed, item restored Não é permitido mover, item restaurado - + Move not allowed because %1 is read-only Não é permitido mover porque %1 é somente para leitura - + the destination o destino - + the source a fonte @@ -3463,17 +3468,17 @@ It is not advisable to use it. OCC::ValidateChecksumHeader - + The checksum header is malformed. O cabeçalho da soma de verificação está incorreto. - + The checksum header contained an unknown checksum type '%1' A cabeçalho da soma de verificação continha um tipo de soma de verificação desconhecido '%1' - + The downloaded file does not match the checksum, it will be resumed. O arquivo baixado não coincide com o checksum, ele será retomado. diff --git a/translations/client_ru.ts b/translations/client_ru.ts index d076aedd4..ba0d719f6 100644 --- a/translations/client_ru.ts +++ b/translations/client_ru.ts @@ -135,8 +135,8 @@ - - + + Cancel Отмена @@ -166,184 +166,184 @@ Уч.запись - + Choose what to sync Выбрать объекты для синхронизации - + Force sync now Принудительно синхронизовать сейчас - + Restart sync Перезапустить синхронизацию - + Remove folder sync connection Удалить подключение синхронизации каталога - + Folder creation failed Ошибка создания каталога - + <p>Could not create local folder <i>%1</i>. <p>Не удалось создать локальный каталог <i>%1</i>. - + Confirm Folder Sync Connection Removal Подтвердите удаление подключения синхронизации каталога - + Remove Folder Sync Connection Удалить подключение синхронизации каталога - + Sync Running Синхронизация запущена - + The syncing operation is running.<br/>Do you want to terminate it? Выполняется синхронизация.<br/>Вы хотите её остановить? - + %1 in use %1 используется - + %1 as <i>%2</i> %1 как <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. Сервер версии %1 устарел и не поддерживается! Продолжайте на свой страх и риск. - + Connected to %1. Соединен с %1. - + Server %1 is temporarily unavailable. Сервер %1 временно недоступен. - + Server %1 is currently in maintenance mode. Сервер %1 в настоящее время находится в режиме технического обслуживания. - + Signed out from %1. Успешно вышли из %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Получение авторизации из браузера. <a href='%1'>Нажмите здесь</a>, чтобы повторно открыть браузер. - + Connecting to %1... Соединение с %1... - + No connection to %1 at %2. Нет соединения с %1 в %2. - + Log in Войти - + There are folders that were not synchronized because they are too big: Есть каталоги, которые не были синхронизированы, так как они слишком большие: - + There are folders that were not synchronized because they are external storages: Есть каталоги, которые не были синхронизированы, так как они являются внешними хранилищами: - + There are folders that were not synchronized because they are too big or external storages: Есть каталоги, которые не были синхронизированы, так как они слишком велики или являются внешними хранилищами: - + Confirm Account Removal Подтверждение удаления учетной записи - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Вы действительно желаете удалить подключение к учетной записи <i>%1</i>?</p><p><b>Примечание:</b> Это действие <b>НЕ</b> удалит ваши файлы.</p> - + Remove connection Удалить подключение - - + + Open folder Открыть папку - + Log out Выйти - + Resume sync Возобновить синхронизацию - + Pause sync Приостановить синхронизацию - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Вы действительно желаете остановить синхронизацию папки <i>%1</i>?</p><p><b>Примечание:</b> Это действие <b>НЕ</b> удалит ваши файлы.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) из %2 используется. Некоторые папки, включая сетевые или общие, могут иметь свои собственные ограничения. - + %1 of %2 in use %1 из %2 используется - + Currently there is no storage usage information available. В данный момент информация о заполненности хранилища недоступна. - + No %1 connection configured. Нет настроенного подключения %1. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured Учётная запись OwnCloud не настроена - + The configured server for this client is too old Настроенный сервер слишком стар для этого клиента - + Please update to the latest server and restart the client. Обновите сервер до последней версии и перезапустите клиент. - + Authentication error: Either username or password are wrong. Ошибка авторизации: Имя пользователя или пароль не верны. - + timeout тайм-аут - + The provided credentials are not correct Введённые учётные данные не верны @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Прервано пользов @@ -941,12 +941,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an Добавить папку для синхронизации - + Synchronizing with local folder Синхронизация с локальным каталогом - + File Файл @@ -1094,12 +1094,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizard - + Add Folder Sync Connection Добавить папку для синхронизации - + Add Sync Connection Добавить подключение для синхронизации @@ -1107,17 +1107,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Кликните, чтобы выбрать локальный каталог для синхронизации. - + Enter the path to the local folder. Укажите путь к локальному каталогу. - + Select the source folder Выберите исходный каталог @@ -1125,47 +1125,47 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardRemotePath - + Create Remote Folder Создать Удалённый Каталог - + Enter the name of the new folder to be created below '%1': Введите имя каталога, который должен быть создан под '%1': - + Folder was successfully created on %1. Каталог успешно создан на %1. - + Authentication failed accessing %1 Ошибка авторизации при доступе к %1 - + Failed to create the folder on %1. Please check manually. Невозможно создать каталог по пути %1. Попробуйте создать его вручную. - + Failed to list a folder. Error: %1 Ошибка просмотра папки. Ошибка: %1 - + Choose this to sync the entire account Нажмите здесь для синхронизации всей учётной записи - + This folder is already being synced. Этот каталог уже выбран для синхронизации. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Каталог <i>%1</i> уже настроен для синхронизации, и он является родительским для каталога <i>%2</i>. @@ -1173,12 +1173,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Предупреждение:</b> %1 - + <b>Warning:</b> <b>Предупреждение:</b> @@ -2708,33 +2708,33 @@ It is not advisable to use it. Создать ссылку общего доступа - + Delete Удалить - + Open link in browser Открыть ссылку в браузере - + Copy link to clipboard Копировать ссылку в буфер обмена - + Copy link to clipboard (direct download) Скопировать ссылку в буфер обмена (прямое скачивание) - + Send link by email Отправить ссылку по email - + Send link by email (direct download) Отправить ссылку по почте (прямое скачивание) @@ -2868,12 +2868,12 @@ It is not advisable to use it. OCC::ShibbolethCredentials - + Login Error Ошибка входа - + You must sign in as user %1 Вы должны войти как пользователь %1 @@ -3218,38 +3218,38 @@ It is not advisable to use it. Иерархия каталогов слишком глубока - + Conflict: Server version downloaded, local copy renamed and not uploaded. Конфликт: Серверная версия скачана, локальная копия переименована и не закачана. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Только %1 доступно, нужно как минимум %2 чтобы начать - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Не могу открыть или создать локальную базу данных синхронизации. Удостоверьтесь, что у вас есть доступ на запись в каталог синхронизации. - + Not allowed because you don't have permission to add parent folder Не разрешается, так как у вас нет полномочий на добавление родительской папки - + Not allowed because you don't have permission to add files in that folder Не разрешается, так как у вас нет полномочий на добавление файлов в эту папку - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Мало места на диске: Скачивания, которые сократят свободное место ниже %1, будут пропущены. - + There is insufficient space available on the server for some uploads. На сервере недостаточно места для некоторых закачек. @@ -3339,89 +3339,94 @@ It is not advisable to use it. Имя файла слишком длинное. - + + The filename cannot be encoded on your file system. + Невозможно перекодировать имя файла для вашей системы. + + + Unresolved conflict. Неразрешённый конфликт. - + Stat failed. Не удалось загрузить статистику. - + Filename encoding is not valid Кодировка имени файла не верна - + Invalid characters, please rename "%1" Недопустимые символы, пожалуйста, переименуйте "%1" - + Unable to read the blacklist from the local database Не удалось прочитать файл чёрного списка из локальной базы данных. - + Unable to read from the sync journal. Не удалось прочитать из журнала синхронизации. - + Cannot open the sync journal Не удаётся открыть журнал синхронизации - + File name contains at least one invalid character Имя файла содержит по крайней мере один некорректный символ - - + + Ignored because of the "choose what to sync" blacklist Игнорируется из-за черного списка в "что синхронизировать" - + Not allowed because you don't have permission to add subfolders to that folder Не разрешается, так как у вас нет полномочий на добавление подпапок в папку. - + Not allowed to upload this file because it is read-only on the server, restoring Не допускается загрузка этого файла, так как на сервере он помечен только для чтения, восстанавливаем - - + + Not allowed to remove, restoring Не допускается удаление, восстанавливаем - + Local files and share folder removed. Локальные файлы и общий каталог удалены. - + Move not allowed, item restored Перемещение не допускается, элемент восстановлен - + Move not allowed because %1 is read-only Перемещение не допускается, поскольку %1 помечен только для чтения - + the destination назначение - + the source источник @@ -3463,17 +3468,17 @@ It is not advisable to use it. OCC::ValidateChecksumHeader - + The checksum header is malformed. Некорректная контрольная сумма заголовка - + The checksum header contained an unknown checksum type '%1' Заголовок контрольной суммы содержал неизвестный тип '%1' контрольной суммы - + The downloaded file does not match the checksum, it will be resumed. Загруженный файл не соответствует контрольной сумме, операция будет возобновлена. diff --git a/translations/client_sk.ts b/translations/client_sk.ts index 90fbe0836..1db2d935f 100644 --- a/translations/client_sk.ts +++ b/translations/client_sk.ts @@ -135,8 +135,8 @@ - - + + Cancel Zrušiť @@ -166,184 +166,184 @@ Účet - + Choose what to sync Vybrať čo synchronizovať - + Force sync now Vynútiť synchronizáciu teraz - + Restart sync - + Remove folder sync connection Odstrániť prepojenie priečinka - + Folder creation failed Vytvorenie priečinka zlyhalo - + <p>Could not create local folder <i>%1</i>. <p>Nemožno vytvoriť lokálny priečinok <i>%1</i>. - + Confirm Folder Sync Connection Removal Potvrdiť odstránenie prepojenia priečinka - + Remove Folder Sync Connection Odstrániť prepojenie priečinka - + Sync Running Prebiehajúca synchronizácia - + The syncing operation is running.<br/>Do you want to terminate it? Proces synchronizácie práve prebieha.<br/>Chcete ho ukončiť? - + %1 in use %1 sa používa - + %1 as <i>%2</i> %1 ako <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. Verzia servera %1 je stará a nepodporovaná. Pokračujte na vlastné nebezpečenstvo. - + Connected to %1. Pripojené k %1 - + Server %1 is temporarily unavailable. Server %1 je dočasne nedostupný. - + Server %1 is currently in maintenance mode. - + Signed out from %1. Odhlásený z %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... - + No connection to %1 at %2. Žiadne pripojenie k %1 na %2. - + Log in Prihlásiť sa - + There are folders that were not synchronized because they are too big: - + There are folders that were not synchronized because they are external storages: - + There are folders that were not synchronized because they are too big or external storages: - + Confirm Account Removal Potvrďte ostránenie účtu - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Naozaj chcete odstrániť pripojenie k účtu <i>%1</i>?</p><p><b>Poznámka:</b> Tým sa <b>nevymažú</b> žiadne súbory.</p> - + Remove connection Vymazať pripojenie - - + + Open folder Otvoriť priečinok - + Log out Odhlásiť - + Resume sync Obnoviť synchronizáciu - + Pause sync Pozastaviť synchronizáciu - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Naozaj si prajete zastaviť synchronizácu priečinka <i>%1</i>?</p><p><b>Poznámka:</b> Toto <b>nevymaže</b> žiadne súbory.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) z %2 je využitých. Niektoré priečinky, vrátane sieťových a zdieľaných, môžu mať iné limity. - + %1 of %2 in use %1 z %2 je využitých - + Currently there is no storage usage information available. Teraz nie sú k dispozícii žiadne informácie o využití úložiska. - + No %1 connection configured. Žiadne nakonfigurované %1 spojenie @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured Žiadny účet v ownCloude nie je nastavený - + The configured server for this client is too old Server nakonfigurovaný pre tohto klienta je príliš starý - + Please update to the latest server and restart the client. Prosím aktualizujte na najnovšiu verziu servera a reštartujte klienta. - + Authentication error: Either username or password are wrong. Chyba overenia: Používateľské meno alebo heslo nie je správne. - + timeout vypršal časový limit - + The provided credentials are not correct Poskytnuté poverenia nie sú správne @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Zrušené používateľom @@ -934,12 +934,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an - + Synchronizing with local folder Synchronizujem lokálny priečinok - + File Súbor @@ -1087,12 +1087,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizard - + Add Folder Sync Connection - + Add Sync Connection @@ -1100,17 +1100,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Kliknutím vyberte lokálny priečinok, ktorý chcete synchronizovať. - + Enter the path to the local folder. Zadajte cestu do lokálneho priečinka. - + Select the source folder Vyberte zdrojový priečinok @@ -1118,47 +1118,47 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardRemotePath - + Create Remote Folder Vytvoriť vzdialený priečinok - + Enter the name of the new folder to be created below '%1': Zadajte názov nového priečinka, ktorý bude vytvorený v '%1': - + Folder was successfully created on %1. Priečinok bol úspešne vytvorený na %1. - + Authentication failed accessing %1 Zlyhalo overenie pri pripojení %1 - + Failed to create the folder on %1. Please check manually. Na %1 zlyhalo vytvorenie priečinka. Skontrolujte to, prosím, ručne. - + Failed to list a folder. Error: %1 - + Choose this to sync the entire account Zvoľte pre synchronizáciu celého účtu - + This folder is already being synced. Tento priečinok sa už synchronizuje. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Priečinok <i>%1</i> už synchronizujete a je nadradený priečinku <i>%2</i>. @@ -1166,12 +1166,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Upozornenie:</b> %1 - + <b>Warning:</b> <b>Upozornenie:</b> @@ -2700,33 +2700,33 @@ Nie je vhodné ju používať. - + Delete Zmazať - + Open link in browser - + Copy link to clipboard - + Copy link to clipboard (direct download) - + Send link by email Odoslať odkaz emailom - + Send link by email (direct download) @@ -2860,12 +2860,12 @@ Nie je vhodné ju používať. OCC::ShibbolethCredentials - + Login Error Chybné prihlásenie - + You must sign in as user %1 Musíte sa prihlásiť ako používateľ %1 @@ -3210,38 +3210,38 @@ Nie je vhodné ju používať. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder - + Not allowed because you don't have permission to add files in that folder - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3331,89 +3331,94 @@ Nie je vhodné ju používať. Meno súboru je veľmi dlhé. - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. - + Stat failed. - + Filename encoding is not valid Kódovanie znakov názvu súboru je neplatné - + Invalid characters, please rename "%1" Neplatné znaky, premenujte prosím "%1" - + Unable to read the blacklist from the local database - + Unable to read from the sync journal. Nemožno čítať zo synchronizačného žurnálu - + Cannot open the sync journal Nemožno otvoriť sync žurnál - + File name contains at least one invalid character Názov súboru obsahuje nevhodný znak - - + + Ignored because of the "choose what to sync" blacklist Ignorované podľa nastavenia "vybrať čo synchronizovať" - + Not allowed because you don't have permission to add subfolders to that folder Nie je dovolené, lebo nemáte oprávnenie pridávať podpriečinky do tohto priečinka - + Not allowed to upload this file because it is read-only on the server, restoring Nie je dovolené tento súbor nahrať, pretože je na serveri iba na čítanie. Obnovuje sa. - - + + Not allowed to remove, restoring Nie je dovolené odstrániť. Obnovuje sa. - + Local files and share folder removed. Lokálne súbory a zdieľaný priečinok boli odstránené. - + Move not allowed, item restored Presunutie nie je dovolené. Položka obnovená. - + Move not allowed because %1 is read-only Presunutie nie je dovolené, pretože %1 je na serveri iba na čítanie - + the destination cieľ - + the source zdroj @@ -3455,17 +3460,17 @@ Nie je vhodné ju používať. OCC::ValidateChecksumHeader - + The checksum header is malformed. Hlavička kontrolného súčtu je poškodená. - + The checksum header contained an unknown checksum type '%1' Hlavička kontrolného súčtu obsahovala neznámy typ kontrolného súčtu „%1“ - + The downloaded file does not match the checksum, it will be resumed. Stiahnutý súbor nemá správny kontrolný súčet, bude stiahnutý znovu. diff --git a/translations/client_sl.ts b/translations/client_sl.ts index addd8404a..8911d5ab7 100644 --- a/translations/client_sl.ts +++ b/translations/client_sl.ts @@ -135,8 +135,8 @@ - - + + Cancel Prekliči @@ -166,184 +166,184 @@ Račun - + Choose what to sync Izbor predmetov za usklajevanje - + Force sync now Vsili takojšnje usklajevanje - + Restart sync Ponovno zaženi usklajevanje - + Remove folder sync connection Odstrani povezavo mape usklajevanja - + Folder creation failed Ustvarjanje mape je spodletelo - + <p>Could not create local folder <i>%1</i>. <p>Ni mogoče ustvariti krajevne mape <i>%1</i>. - + Confirm Folder Sync Connection Removal Potrdi odstranjevanje povezave usklajevanja mape - + Remove Folder Sync Connection Odstrani povezavo usklajevanja mape - + Sync Running Usklajevanje je v teku - + The syncing operation is running.<br/>Do you want to terminate it? Izvaja se usklajevanje.<br/>Ali želite opravilo prekiniti? - + %1 in use %1 v uporabi - + %1 as <i>%2</i> %1 kot <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. Različica strežnika %1 je zastarela in ni več podprta! Nadaljujete na lastno odgovornost. - + Connected to %1. Povezano z %1. - + Server %1 is temporarily unavailable. Strežnik %1 trenutno ni dosegljiv. - + Server %1 is currently in maintenance mode. - + Signed out from %1. Uspešno odjavljeno iz %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... Poteka vzpostavljanje povezave s strežnikom %1 ... - + No connection to %1 at %2. Ni povezave z %1 pri %2. - + Log in Prijava - + There are folders that were not synchronized because they are too big: Zaznane so mape, ki zaradi omejitve velikosti niso bile usklajene: - + There are folders that were not synchronized because they are external storages: Zaznane so mape, ki zaradi pripadnosti zunanji shrambi niso bile usklajene: - + There are folders that were not synchronized because they are too big or external storages: Zaznane so mape, ki zaradi omejitve velikosti ali pripadnosti zunanji shrambi niso bile usklajene: - + Confirm Account Removal Potrdi odstranitev računa - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Ali res želite odstraniti povezavo z računom <i>%1</i>?</p><p><b>Opomba:</b> S tem <b>ne bo</b> izbrisana nobena datoteka.</p> - + Remove connection Odstrani povezavo - - + + Open folder Odpri mapo - + Log out Odjava - + Resume sync Nadaljuj z usklajevanjem - + Pause sync Premor usklajevanja - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Ali res želite zaustaviti usklajevanje mape <i>%1</i>?</p><p><b>Opomba:</b> s tem datoteke iz odjemalca <b>ne bodo</b> odstranjene.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) od %2 v uporabi. Nekatere mape, vključno s priklopljenimi mapami in mapami v souporabi, imajo morda različne omejitve. - + %1 of %2 in use %1 od %2 v uporabi - + Currently there is no storage usage information available. Trenutno ni na voljo nobenih podatkov o porabi prostora. - + No %1 connection configured. Ni nastavljene povezave %1. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured Ni nastavljenega računa v oblaku ownCloud - + The configured server for this client is too old Nastavljen strežnik tega odjemalca je prestar. - + Please update to the latest server and restart the client. Posodobite strežnik in ponovno zaženite odjemalca. - + Authentication error: Either username or password are wrong. Napaka overitve: uporabniško ime ali geslo je napačno. - + timeout časovni zamik - + The provided credentials are not correct Podana poverila niso pravilna. @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Opravilo je bilo prekinjeno s strani uporabnika @@ -943,12 +943,12 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi Dodaj povezavo za usklajevanje mape - + Synchronizing with local folder Poteka usklajevanje s krajevno mapo - + File Datoteka @@ -1096,12 +1096,12 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi OCC::FolderWizard - + Add Folder Sync Connection Dodaj povezavo za usklajevanje mape - + Add Sync Connection Dodaj povezavo za usklajevanje @@ -1109,17 +1109,17 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Kliknite za izbor krajevne mape za usklajevanje. - + Enter the path to the local folder. Vpišite pot do krajevne mape. - + Select the source folder Izbor izvorne mape @@ -1127,47 +1127,47 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi OCC::FolderWizardRemotePath - + Create Remote Folder Ustvari oddaljeno mapo - + Enter the name of the new folder to be created below '%1': Vnesite ime nove mape, ki bo ustvarjena kot podrejena '%1': - + Folder was successfully created on %1. Mapa je uspešno ustvarjena na %1. - + Authentication failed accessing %1 Overitev dostopa do %1 je spodletela. - + Failed to create the folder on %1. Please check manually. Ustvarjanje mape na %1 je spodletelo. Morda jo je mogoče ustvariti ročno. - + Failed to list a folder. Error: %1 Napaka izpisovanja datotek mape. Napaka: %1 - + Choose this to sync the entire account Izberite možnost za usklajevanje celotnega računa. - + This folder is already being synced. Ta mapa je že določena za usklajevanje. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Datoteke se že usklajujejo na ravni mape <i>%1</i>, ki je nadrejena mapi <i>%2</i>. @@ -1175,12 +1175,12 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Opozorilo:</b> %1 - + <b>Warning:</b> <b>Opozorilo:</b> @@ -2711,33 +2711,33 @@ Uporaba ni priporočljiva. - + Delete Izbriši - + Open link in browser Odpri povezavo v brskalniku - + Copy link to clipboard Kopiraj povezavo v odložišče - + Copy link to clipboard (direct download) - + Send link by email Pošlji povezavo po elektronski pošti - + Send link by email (direct download) @@ -2871,12 +2871,12 @@ Uporaba ni priporočljiva. OCC::ShibbolethCredentials - + Login Error Napaka prijave - + You must sign in as user %1 Prijaviti se je treba kot uporabnik %1 @@ -3221,38 +3221,38 @@ Uporaba ni priporočljiva. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Le %1 je na voljo, zahtevanih pa je vaj %2 za zagon - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder Dejanje ni dovoljeno, ker ni ustreznih dovoljenj za dodajanje starševske mape - + Not allowed because you don't have permission to add files in that folder Dejanje ni dovoljeno, ker ni ustreznih dovoljenj za dodajanje datotek v to mapo - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3342,89 +3342,94 @@ Uporaba ni priporočljiva. Ime datoteke je predolgo. - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. Nerazrešen spor - + Stat failed. Določanje statističnih podatkov je spodletelo. - + Filename encoding is not valid Kodni zapis imena datoteke ni veljaven. - + Invalid characters, please rename "%1" Uporabljen je neveljaven znak; preimenujte "%1" - + Unable to read the blacklist from the local database Ni mogoče prebrati črnega seznama iz krajevne mape - + Unable to read from the sync journal. Ni mogoče brati iz dnevnika usklajevanja - + Cannot open the sync journal Ni mogoče odpreti dnevnika usklajevanja - + File name contains at least one invalid character Ime datoteke vsebuje vsaj en neveljaven znak. - - + + Ignored because of the "choose what to sync" blacklist Prezrto, ker je predmet označen na črni listi za usklajevanje - + Not allowed because you don't have permission to add subfolders to that folder Dejanje ni dovoljeno! Ni ustreznih dovoljenj za dodajanje podmap v to mapo. - + Not allowed to upload this file because it is read-only on the server, restoring Ni dovoljeno pošiljati te datoteke, ker ima določena dovoljenja le za branje. Datoteka bo obnovljena na izvorno različico. - - + + Not allowed to remove, restoring Odstranitev ni dovoljena, datoteka bo obnovljena. - + Local files and share folder removed. Krajevne datoteke in mape v souporabi so odstranjene. - + Move not allowed, item restored Premikanje ni dovoljeno, datoteka bo obnovljena. - + Move not allowed because %1 is read-only Premikanje ni dovoljeno, ker je nastavljeno določilo %1 le za branje. - + the destination cilj - + the source vir @@ -3466,17 +3471,17 @@ Uporaba ni priporočljiva. OCC::ValidateChecksumHeader - + The checksum header is malformed. Glava nadzorne vsote je napačno oblikovana. - + The checksum header contained an unknown checksum type '%1' Glava nadzorne vsote vsebuje neznano vrsto zapisa '%1' - + The downloaded file does not match the checksum, it will be resumed. Prejeta datoteka ni skladna z nadzorno vsoto te datoteke, zato bo prenos ponovljen. diff --git a/translations/client_sr.ts b/translations/client_sr.ts index a465f4e71..2f2b30b57 100644 --- a/translations/client_sr.ts +++ b/translations/client_sr.ts @@ -135,8 +135,8 @@ - - + + Cancel Одустани @@ -166,184 +166,184 @@ Налог - + Choose what to sync Изаберите шта синхронизовати - + Force sync now - + Restart sync - + Remove folder sync connection - + Folder creation failed Прављење фасцикле није успело - + <p>Could not create local folder <i>%1</i>. <p>Не могу да направим локалну фасциклу <i>%1</i>. - + Confirm Folder Sync Connection Removal - + Remove Folder Sync Connection - + Sync Running Синхронизација у току - + The syncing operation is running.<br/>Do you want to terminate it? Синхронизација је у току.<br/>Желите ли да је прекинете? - + %1 in use %1 искоришћено - + %1 as <i>%2</i> %1 као <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. - + Connected to %1. Повезан са %1. - + Server %1 is temporarily unavailable. Сервер %1 је привремено недоступан. - + Server %1 is currently in maintenance mode. - + Signed out from %1. Одјављен са %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... - + No connection to %1 at %2. - + Log in Пријава - + There are folders that were not synchronized because they are too big: - + There are folders that were not synchronized because they are external storages: - + There are folders that were not synchronized because they are too big or external storages: - + Confirm Account Removal Потврда уклањања налога - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection Уклони везу - - + + Open folder Отвори фасциклу - + Log out Одјава - + Resume sync Настави синхронизацију - + Pause sync Паузирај синхронизацију - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Желите ли заиста да престанете са синхронизацијом фасцикле <i>%1</i>?</p><p><b>Напомена:</b> Ово <b>неће</b> обрисати ниједан фајл.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) од %2 искоришћено. Неке фасцикле, укључујући мрежно монтиране или дељене фасцикле, могу имати друга ограничења. - + %1 of %2 in use %1% од %2 искоришћено - + Currently there is no storage usage information available. Тренутно нема доступних података о заузећу складишта. - + No %1 connection configured. Нема подешене %1 везе. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured Нема подешеног оунКлауд налога - + The configured server for this client is too old Подешени сервер је сувише стар за ову верзију клијента - + Please update to the latest server and restart the client. Ажурирајте сервер и поново покрените клијента. - + Authentication error: Either username or password are wrong. Грешка аутентификације: лозинка или корисничко име су погрешни. - + timeout истек времена - + The provided credentials are not correct Дати акредитиви нису исправни @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Прекинуо корисник @@ -934,12 +934,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an Додај везу синхронизације фасцикле - + Synchronizing with local folder - + File Фајл @@ -1087,12 +1087,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizard - + Add Folder Sync Connection Додај везу синхронизације фасцикле - + Add Sync Connection Додај везу синхронизације @@ -1100,17 +1100,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Клик за избор локалне фасцикле за синхронизацију. - + Enter the path to the local folder. Унесите путању до локалне фасцикле. - + Select the source folder Изаберите изворну фасциклу @@ -1118,47 +1118,47 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardRemotePath - + Create Remote Folder Прављење удаљене фасцикле - + Enter the name of the new folder to be created below '%1': Унесите назив нове фасцикле која ће бити направљена у %1: - + Folder was successfully created on %1. Фасцикла је успешно направљена на %1 - + Authentication failed accessing %1 Неуспела аутентификација при приступу %1 - + Failed to create the folder on %1. Please check manually. Нисам успео да направим фасциклу на %1. Проверите ручно. - + Failed to list a folder. Error: %1 Неуспех излиставања фасцикле. Грешка: %1 - + Choose this to sync the entire account Ово изаберите да синхронизујете целокупан налог - + This folder is already being synced. Ова фасцикла се већ синхронизује. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Већ синхронизујете <i>%1</i>, која садржи фасциклу <i>%2</i>. @@ -1166,12 +1166,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Упозорење:</b> %1 - + <b>Warning:</b> <b>Упозорење:</b> @@ -2700,33 +2700,33 @@ It is not advisable to use it. - + Delete Обриши - + Open link in browser - + Copy link to clipboard - + Copy link to clipboard (direct download) - + Send link by email Пошаљи везу е-поштом - + Send link by email (direct download) @@ -2860,12 +2860,12 @@ It is not advisable to use it. OCC::ShibbolethCredentials - + Login Error Грешка пријављивања - + You must sign in as user %1 Морате се пријавити као %1 @@ -3210,38 +3210,38 @@ It is not advisable to use it. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder - + Not allowed because you don't have permission to add files in that folder - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3331,89 +3331,94 @@ It is not advisable to use it. Назив фајла је предугачак. - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. - + Stat failed. - + Filename encoding is not valid Кодирање назива фајла није исправно - + Invalid characters, please rename "%1" - + Unable to read the blacklist from the local database - + Unable to read from the sync journal. - + Cannot open the sync journal Не могу да отворим дневник синхронизације - + File name contains at least one invalid character Назив садржи бар један недозвољен карактер - - + + Ignored because of the "choose what to sync" blacklist Игнорисано јер се не налази на листи за синхронизацију - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed to upload this file because it is read-only on the server, restoring Није могуће отпремити овај фајл јер је на серверу само за читање. Враћам - - + + Not allowed to remove, restoring Није могуће уклањање. Враћам - + Local files and share folder removed. Локални фајлови и дељена фасцикла су уклоњени. - + Move not allowed, item restored Премештање није дозвољено. Ставка је враћена - + Move not allowed because %1 is read-only Премештање није дозвољено јер %1 је само за читање - + the destination одредиште - + the source извор @@ -3455,17 +3460,17 @@ It is not advisable to use it. OCC::ValidateChecksumHeader - + The checksum header is malformed. Заглавље контролне суме је лоше формирано. - + The checksum header contained an unknown checksum type '%1' - + The downloaded file does not match the checksum, it will be resumed. Преузети фајл се не поклапа с контролном сумом. Биће настављено. diff --git a/translations/client_sv.ts b/translations/client_sv.ts index d54f37d56..9d7462f6a 100644 --- a/translations/client_sv.ts +++ b/translations/client_sv.ts @@ -135,8 +135,8 @@ - - + + Cancel Avbryt @@ -166,184 +166,184 @@ Konto - + Choose what to sync Välj vad som ska synkas - + Force sync now Tvinga synkning - + Restart sync Starta om synkning - + Remove folder sync connection Ta bort anslutning till mappsynkronisering - + Folder creation failed Kunde inte skapa mappen - + <p>Could not create local folder <i>%1</i>. <p>Kunde inte skapa lokal mapp <i>%1</i>. - + Confirm Folder Sync Connection Removal Bekräfta radering av anslutning till mappsynkronisering - + Remove Folder Sync Connection Ta bort anslutning till mappsynkronisering - + Sync Running Synkronisering pågår - + The syncing operation is running.<br/>Do you want to terminate it? En synkronisering pågår.<br/>Vill du avbryta den? - + %1 in use %1 används - + %1 as <i>%2</i> %1 som <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. Serverversion %1 är gammal och stöds inte längre! Fortsätt på egen risk. - + Connected to %1. Ansluten till %1. - + Server %1 is temporarily unavailable. Servern %1 är för tillfället inte tillgänglig. - + Server %1 is currently in maintenance mode. Servern %1 är för närvarande i underhållsläge. - + Signed out from %1. Utloggad från %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Anskaffar autentisering från webbläsaren. <a href='%1'>Klicka här </a> för att öppna webbläsaren igen. - + Connecting to %1... Ansluter till %1... - + No connection to %1 at %2. Ingen anslutning till %1 vid %2. - + Log in Logga in - + There are folders that were not synchronized because they are too big: Dessa mappar har inte synkroniserats för att de är för stora: - + There are folders that were not synchronized because they are external storages: Det finns mappar som inte synkroniserats för att de är externa lagringsytor: - + There are folders that were not synchronized because they are too big or external storages: Det finns mappar som inte blivit synkroniserade på grund av att de är för stora eller är externa lagringsytor: - + Confirm Account Removal Bekräfta radering an kontot - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Vill du verkligen avsluta anslutningen till kontot <i>%1</i>?</p><p><b>Observera:</b> Detta kommer <b>inte</b> radera några filer.</p> - + Remove connection Radera anslutning - - + + Open folder Öppna mapp - + Log out Logga ut - + Resume sync Återuppta synkronisering - + Pause sync Pausa synkronisering - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Vill du verkligen avbryta synkronisering av mappen <i>%1</i>?</p><p><b>Observera:</b> Detta kommer <b>inte</b> radera några filer.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) av %2 används. Vissa mappar, inklusive nätverks- eller delade mappar, kan ha andra begränsningar. - + %1 of %2 in use %1 av %2 används - + Currently there is no storage usage information available. Just nu finns ingen utrymmes information tillgänglig - + No %1 connection configured. Ingen %1 anslutning konfigurerad. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured Inget ownCloud konto konfigurerat - + The configured server for this client is too old Den konfigurerade servern är för den här klienten är för gammal - + Please update to the latest server and restart the client. Uppgradera servern och starta sedan om klienten. - + Authentication error: Either username or password are wrong. Autentiseringsfel: Användarnamn eller lösenord är felaktigt - + timeout timeout - + The provided credentials are not correct De angivna uppgifterna stämmer ej @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Avbruten av användare @@ -938,12 +938,12 @@ Om du fortsätter synkningen kommer alla dina filer återställas med en äldre Lägg till mapp att synka. - + Synchronizing with local folder Synkroniserar med lokal mapp - + File Fil @@ -1091,12 +1091,12 @@ Om du fortsätter synkningen kommer alla dina filer återställas med en äldre OCC::FolderWizard - + Add Folder Sync Connection Lägg till mapp att synka. - + Add Sync Connection Lägg till anslutning. @@ -1104,17 +1104,17 @@ Om du fortsätter synkningen kommer alla dina filer återställas med en äldre OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Klicka för att välja en lokal mapp att synka. - + Enter the path to the local folder. Ange sökvägen till den lokala mappen. - + Select the source folder Välj källmapp @@ -1122,47 +1122,47 @@ Om du fortsätter synkningen kommer alla dina filer återställas med en äldre OCC::FolderWizardRemotePath - + Create Remote Folder Skapa fjärrmapp - + Enter the name of the new folder to be created below '%1': Ange namnet på den nya mappen som skall skapas under '%1': - + Folder was successfully created on %1. Mappen skapades på %1. - + Authentication failed accessing %1 Autentisering misslyckades att komma åt %1 - + Failed to create the folder on %1. Please check manually. Det gick inte att skapa mappen på %1. Kontrollera manuellt. - + Failed to list a folder. Error: %1 Kunde inte lista en mapp. Felkod: %1 - + Choose this to sync the entire account Välj detta för att synka allt - + This folder is already being synced. Denna mappen synkas redan. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Du synkar redan <i>%1</i>, vilket är övermapp till <i>%2</i> @@ -1170,12 +1170,12 @@ Om du fortsätter synkningen kommer alla dina filer återställas med en äldre OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Varning:</b> %1 - + <b>Warning:</b> <b>Varning:</b> @@ -1956,7 +1956,7 @@ Det är inte lämpligt använda den. The server reported the following error: - + Servern svarade med följande fel: @@ -2706,33 +2706,33 @@ Det är inte lämpligt använda den. Skapa publik delningslänk - + Delete Ta bort - + Open link in browser Öppna länk i webbläsare - + Copy link to clipboard Kopiera länk till urklipp - + Copy link to clipboard (direct download) Kopiera länk till urklipp (direktnedladdning) - + Send link by email Skicka länk via e-post - + Send link by email (direct download) Skicka länk med e-post (direktnedladdning) @@ -2866,12 +2866,12 @@ Det är inte lämpligt använda den. OCC::ShibbolethCredentials - + Login Error Login fel - + You must sign in as user %1 Du måste logga in som en användare %1 @@ -3216,38 +3216,38 @@ Det är inte lämpligt använda den. Folder hierarkin är för djup - + Conflict: Server version downloaded, local copy renamed and not uploaded. Konflikt: Serverversion nedladdad, lokal kopia omdöpt och ej uppladdad. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Endast %1 tillgängligt, behöver minst %2 för att starta - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Kunde inte öppna eller återskapa den lokala synkroniseringsdatabasen. Säkerställ att du har skrivrättigheter till synkroniseringsmappen. - + Not allowed because you don't have permission to add parent folder Otillåtet eftersom du inte har rättigheter att lägga till övermappar - + Not allowed because you don't have permission to add files in that folder Otillåtet eftersom du inte har rättigheter att lägga till filer i den mappen. - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Diskutrymmet är lågt: Nedladdningar som reduceringar det fria utrymmet under %1 skippades. - + There is insufficient space available on the server for some uploads. Det finns inte tillräckligt med utrymme på servern för vissa uppladdningar. @@ -3337,89 +3337,94 @@ Det är inte lämpligt använda den. Filnamnet är för långt. - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. Olöst konflikt. - + Stat failed. Stat misslyckades. - + Filename encoding is not valid Filnamnskodning är inte giltig - + Invalid characters, please rename "%1" Otillåtna tecken, var vänlig byt namn på "%1" - + Unable to read the blacklist from the local database Kunde inte läsa svartlistan från den lokala databasen - + Unable to read from the sync journal. Kunde inte läsa från synk-journalen. - + Cannot open the sync journal Kunde inte öppna synk journalen - + File name contains at least one invalid character Filnamnet innehåller minst ett ogiltigt tecken - - + + Ignored because of the "choose what to sync" blacklist Ignorerad eftersom den är svartlistad i "välj vad som ska synkas" - + Not allowed because you don't have permission to add subfolders to that folder Otillåtet eftersom du inte har rättigheter att lägga till undermappar i den mappen. - + Not allowed to upload this file because it is read-only on the server, restoring Inte behörig att ladda upp denna fil då den är skrivskyddad på servern, återställer - - + + Not allowed to remove, restoring Inte behörig att radera, återställer - + Local files and share folder removed. Lokala filer och mappar som är delade är borttagna. - + Move not allowed, item restored Det gick inte att genomföra flytten, objektet återställs - + Move not allowed because %1 is read-only Det gick inte att genomföra flytten då %1 är skrivskyddad - + the destination destinationen - + the source källan @@ -3461,17 +3466,17 @@ Det är inte lämpligt använda den. OCC::ValidateChecksumHeader - + The checksum header is malformed. Checksummans huvud är felformaterad. - + The checksum header contained an unknown checksum type '%1' Checksummans huvud innehåller en okänd checksumma av typ '%1' - + The downloaded file does not match the checksum, it will be resumed. Den nedladdade filen stämmer inte med checksumman, den kommer startas om. @@ -3616,12 +3621,12 @@ Det är inte lämpligt använda den. Error during synchronization - + Fel vid synkronisering No sync folders configured - + Inga mappar valda för synkronisering diff --git a/translations/client_th.ts b/translations/client_th.ts index 3f9d7c673..de8224547 100644 --- a/translations/client_th.ts +++ b/translations/client_th.ts @@ -135,8 +135,8 @@ - - + + Cancel ยกเลิก @@ -166,184 +166,184 @@ บัญชี - + Choose what to sync เลือกข้อมูลที่ต้องการประสาน - + Force sync now บังคับประสานข้อมูลเดี๋ยวนี้ - + Restart sync ประสานข้อมูลอีกครั้ง - + Remove folder sync connection ลบโฟลเดอร์ที่ประสานข้อมูลออก - + Folder creation failed สร้างโฟลเดอร์ล้มเหลว - + <p>Could not create local folder <i>%1</i>. <p>ไม่สามารถสร้างโฟลเดอร์ต้นทาง <i>%1</i>. - + Confirm Folder Sync Connection Removal ยืนยันการลบโฟลเดอร์ที่ประสานข้อมูลออก - + Remove Folder Sync Connection ลบโฟลเดอร์ที่ประสานข้อมูล - + Sync Running กำลังประสานข้อมูล - + The syncing operation is running.<br/>Do you want to terminate it? กำลังดำเนินการประสานข้อมูลอยู่ <br/>คุณต้องการสิ้นสุดการทำงาน? - + %1 in use %1 กำลังถูกใช้งาน - + %1 as <i>%2</i> %1 เช่น <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. เซิร์ฟเวอร์เวอร์ชัน %1 เป็นรุ่นเก่าและไม่ได้รับการสนับสนุน! ดำเนินการความเสี่ยงด้วยคุณเอง - + Connected to %1. เชื่อมต่อกับ %1 - + Server %1 is temporarily unavailable. เซิร์ฟเวอร์ %1 ไม่สามารถใช้ได้ชั่วคราว - + Server %1 is currently in maintenance mode. เซิร์ฟเวอร์ %1 กำลังอยู่ในโหมดการบำรุงรักษา - + Signed out from %1. ลงชื่อออกจาก %1 - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. กำลังได้รับอนุญาตจากเบราเซอร์ <a href='%1'>คลิกที่นี่</a> เพื่อเปิดเบราเซอร์อีกครั้ง - + Connecting to %1... กำลังเชื่อมต่อไปยัง %1... - + No connection to %1 at %2. ไม่มีการเชื่อมต่อไปยัง %1 ที่ %2 - + Log in เข้าสู่ระบบ - + There are folders that were not synchronized because they are too big: บางโฟลเดอร์จะไม่ถูกประสานข้อมูลเพราะขนาดของมันใหญ่เกินไป: - + There are folders that were not synchronized because they are external storages: มีบางโฟลเดอร์จะไม่ถูกประสานข้อมูลเพราะเป็นพื้นที่จัดเก็บข้อมูลภายนอก - + There are folders that were not synchronized because they are too big or external storages: มีบางโฟลเดอร์จะไม่ถูกประสานข้อมูลเพราะเป็นพื้นที่จัดเก็บข้อมูลภายนอกหรือมีขนาดที่ใหญ่เกินไป - + Confirm Account Removal ยืนยันการลบบัญชี - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>คุณต้องการลบการเชื่อมต่อกับบัญชี<i>%1</i>?</p><p><b>หมายเหตุ:</b> นี้จะ <b>ไม่</b> ลบไฟล์ใดๆ</p> - + Remove connection ลบการเชื่อมต่อ - - + + Open folder เปิดโฟลเดอร์ - + Log out ออกจากระบบ - + Resume sync ประสานข้อมูลอีกครั้ง - + Pause sync หยุดประสานข้อมูลชั่วคราว - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>คุณต้องการที่จะหยุดการประสานข้อมูลโฟลเดอร์<i>%1</i>?</p><p><b>หมายเหตุ:</b> นี้จะ <b>ไม่</b> ลบไฟล์ใดๆ</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. มีการใช้งาน %1 (%3%) จาก %2 บางโฟลเดอร์รวมทั้งเครือข่ายที่ติดตั้งหรือโฟลเดอร์ที่แชร์อาจมีข้อจำกัดที่แตกต่างกัน - + %1 of %2 in use มีการใช้งาน %1 จาก %2 - + Currently there is no storage usage information available. ขณะนี้ไม่มีพื้นที่จัดเก็บข้อมูลที่ใช้งานได้ - + No %1 connection configured. ไม่มีการเชื่อมต่อ %1 ที่ถูกกำหนดค่า @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured ไม่มีการกำหนดค่าบัญชี ownCloud - + The configured server for this client is too old การกำหนดค่าเซิร์ฟเวอร์สำหรับไคลเอ็นต์นี้เก่าเกินไป - + Please update to the latest server and restart the client. กรุณาอัพเดทเซิร์ฟเวอร์ใหม่ใหม่ที่สุดและรีสตาร์ทไคลเอนต์ - + Authentication error: Either username or password are wrong. ข้อผิดพลาดในการตรวจสอบ: ทั้งชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง - + timeout หมดเวลา - + The provided credentials are not correct ระบุข้อมูลประจำตัวไม่ถูกต้อง @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user ยกเลิกโดยผู้ใช้ @@ -945,12 +945,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an เพิ่มโฟลเดอร์ที่ต้องการประสานข้อมูล - + Synchronizing with local folder กำลังประสานข้อมูลกับโฟลเดอร์ต้นทาง - + File ไฟล์ @@ -1098,12 +1098,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizard - + Add Folder Sync Connection เพิ่มโฟลเดอร์ที่ต้องการประสานข้อมูล - + Add Sync Connection เพิ่มการประสานข้อมูลให้ตรงกัน @@ -1111,17 +1111,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardLocalPath - + Click to select a local folder to sync. คลิกเพื่อเลือกโฟลเดอร์ในการประสานข้อมูล - + Enter the path to the local folder. ป้อนพาธไปยังโฟลเดอร์ต้นทาง - + Select the source folder เลือกโฟลเดอร์ต้นฉบับ @@ -1129,47 +1129,47 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardRemotePath - + Create Remote Folder สร้างโฟลเดอร์รีโมท - + Enter the name of the new folder to be created below '%1': ใส่ชื่อของโฟลเดอร์ใหม่ที่จะถูกสร้างขึ้นดังต่อไปนี้ '%1': - + Folder was successfully created on %1. โฟลเดอร์ถูกสร้างขึ้นเรียบร้อยแล้วเมื่อ %1... - + Authentication failed accessing %1 รับรองความถูกต้องล้มเหลวขณะกำลังเข้าถึง %1 - + Failed to create the folder on %1. Please check manually. ไม่สามารถสร้างโฟลเดอร์บน %1 กรุณาตรวจสอบด้วยตนเอง - + Failed to list a folder. Error: %1 รายการโฟลเดอร์ล้มเหลว ข้อผิดพลาด: %1 - + Choose this to sync the entire account เลือกตัวเลือกนี้เพื่อประสานข้อมูลบัญชีทั้งหมด - + This folder is already being synced. โฟลเดอร์นี้ถูกประสานข้อมูลอยู่แล้ว - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. คุณประสานข้อมูล <i>%1</i> อยู่แล้ว ซึ่งมีโฟลเดอร์หลักเป็น <i>%2</i> @@ -1177,12 +1177,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>คําเตือน:</b> %1 - + <b>Warning:</b> <b>คําเตือน:</b> @@ -1962,7 +1962,7 @@ It is not advisable to use it. The server reported the following error: - + เซิร์ฟเวอร์รายงานข้อผิดพลาดต่อไปนี้: @@ -2712,45 +2712,45 @@ It is not advisable to use it. สร้างแชร์ลิงค์สาธารณะ - + Delete ลบ - + Open link in browser เปิดลิงค์ในเบราว์เซอร์ - + Copy link to clipboard คัดลอกลิงค์ไปยังคลิปบอร์ด - + Copy link to clipboard (direct download) คัดลอกลิงค์ทางอีเมล (ดาวน์โหลดโดยตรง) - + Send link by email ส่งลิงค์ทางอีเมล - + Send link by email (direct download) ส่งลิงค์ทางอีเมล (ดาวน์โหลดโดยตรง) Confirm Link Share Deletion - + ยืนยันการลบลิงค์ที่แชร์ <p>Do you really want to delete the public link share <i>%1</i>?</p><p>Note: This action cannot be undone.</p> - + <p>คุณต้องการลบลิงค์ที่แชร์แบบสาธารณะ<i>%1</i>?</p><p>หมายเหตุ: ไม่สามารถยกเลิกการดำเนินการนี้ได้</p> @@ -2765,7 +2765,7 @@ It is not advisable to use it. Delete link share - + ลบลิงค์ที่แชร์ @@ -2872,12 +2872,12 @@ It is not advisable to use it. OCC::ShibbolethCredentials - + Login Error เข้าสู่ระบบผิดพลาด - + You must sign in as user %1 คุณต้องเข้าสู่ระบบเป็นผู้ใช้ %1 @@ -3220,39 +3220,39 @@ It is not advisable to use it. โฟลเดอร์มีโฟลเดอร์ย่อยเกินไป - + Conflict: Server version downloaded, local copy renamed and not uploaded. เกิดปัญหาความขัดแย้ง: สำเนาที่อยู่ในเครื่องถูกเปลี่ยนชื่อและไม่ได้ถูกอัพโหลด เลยไม่ตรงกับข้อมูลที่เคยอัพโหลดไว้ในเซิฟเวอร์ - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() มีเพียง %1 ที่พร้อมใช้งาน คุณจำเป็นต้องมีไม่น้อยกว่า %2 เพื่อเริ่มใช้งาน - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. ไม่สามารถเปิดหรือสร้างฐานข้อมูลการประสานข้อมูลในเครื่อง ตรวจสอบว่าคุณมีสิทธิ์การเขียนในโฟลเดอร์ซิงค์ - + Not allowed because you don't have permission to add parent folder ไม่ได้รับอนุญาต เพราะคุณไม่มีสิทธิ์ที่จะเพิ่มโฟลเดอร์หลัก - + Not allowed because you don't have permission to add files in that folder ไม่ได้รับอนุญาต เพราะคุณไม่มีสิทธิ์ที่จะเพิ่มไฟล์ในโฟลเดอร์นั้น - + Disk space is low: Downloads that would reduce free space below %1 were skipped. พื้นที่จัดเก็บเหลือน้อย: การดาวน์โหลดจะช่วยลดพื้นที่ว่างด้านล่าง %1 ที่ถูกข้ามไป - + There is insufficient space available on the server for some uploads. มีพื้นที่ว่างไม่เพียงพอบนเซิร์ฟเวอร์สำหรับการอัพโหลดบางรายการ @@ -3342,89 +3342,94 @@ It is not advisable to use it. ชื่อไฟล์ยาวเกินไป - + + The filename cannot be encoded on your file system. + ชื่อไฟล์ไม่สามารถเข้ารหัสในระบบไฟล์ของคุณได้ + + + Unresolved conflict. ข้อขัดแย้งที่ยังไม่ได้แก้ไข - + Stat failed. สถิติความล้มเหลว - + Filename encoding is not valid การเข้ารหัสชื่อไฟล์ไม่ถูกต้อง - + Invalid characters, please rename "%1" ตัวอักษรไม่ถูกต้อง โปรดเปลี่ยนชื่อ "%1" - + Unable to read the blacklist from the local database ไม่สามารถอ่านบัญชีดำจากฐานข้อมูลต้นทาง - + Unable to read from the sync journal. ไม่สามารถอ่านจากบันทึกการประสานข้อมูล - + Cannot open the sync journal ไม่สามารถเปิดการผสานข้อมูลเจอร์นัล - + File name contains at least one invalid character มีชื่อแฟ้มอย่างน้อยหนึ่งตัวอักษรที่ไม่ถูกต้อง - - + + Ignored because of the "choose what to sync" blacklist ถูกละเว้นเพราะ "ข้อมูลที่เลือกประสาน" ติดบัญชีดำ - + Not allowed because you don't have permission to add subfolders to that folder ไม่อนุญาติเพราะคุณไม่มีสิทธิ์ที่จะเพิ่มโฟลเดอร์ย่อยของโฟลเดอร์นั้น - + Not allowed to upload this file because it is read-only on the server, restoring ไม่อนุญาตให้อัพโหลดไฟล์นี้เพราะมันจะอ่านได้เพียงอย่างเดียวบนเซิร์ฟเวอร์ กำลังฟื้นฟู - - + + Not allowed to remove, restoring ไม่อนุญาตให้ลบเพราะกำลังฟื้นฟู - + Local files and share folder removed. ไฟล์ต้นทางและโฟลเดอร์ที่แชร์ถูกลบออก - + Move not allowed, item restored ไม่ได้รับอนุญาตให้ย้าย เพราะกำลังกู้คืนรายการ - + Move not allowed because %1 is read-only ไม่อนุญาตให้ย้ายเพราะ %1 จะอ่านได้เพียงอย่างเดียว - + the destination ปลายทาง - + the source แหล่งที่มา @@ -3466,17 +3471,17 @@ It is not advisable to use it. OCC::ValidateChecksumHeader - + The checksum header is malformed. การตรวจสอบส่วนหัวผิดรูปแบบ - + The checksum header contained an unknown checksum type '%1' จากการตรวจสอบส่วนหัวมีประเภทที่ไม่รู้จัก '%1' - + The downloaded file does not match the checksum, it will be resumed. ไฟล์ที่ดาวน์โหลดมาไม่ตรงกับการตรวจสอบที่จะกลับมา diff --git a/translations/client_tr.ts b/translations/client_tr.ts index 40b6b969c..fce128ea4 100644 --- a/translations/client_tr.ts +++ b/translations/client_tr.ts @@ -135,8 +135,8 @@ - - + + Cancel İptal @@ -166,184 +166,184 @@ Hesap - + Choose what to sync Ne eşitleneceğini seçin - + Force sync now Şimdi eşitlemeye zorla - + Restart sync Eşitlemeyi yeniden başlat - + Remove folder sync connection Klasör eşitleme bağlantısını sil - + Folder creation failed Klasör oluşturma başarısız oldu - + <p>Could not create local folder <i>%1</i>. <p><i>%1</i> yerel klasörü oluşturulamadı. - + Confirm Folder Sync Connection Removal Klasör Eşitleme Bağlantısının Silinmesini Onaylayın - + Remove Folder Sync Connection Klasör Eşitleme Bağlantısını Sil - + Sync Running Eşitleme Çalışıyor - + The syncing operation is running.<br/>Do you want to terminate it? Eşitleme işlemi devam ediyor.<br/>Durdurmak istiyor musunuz? - + %1 in use %1 kullanımda - + %1 as <i>%2</i> %1 <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. Sunucu sürümü %1 eski ve desteklenmiyor! Kendi riskinizle devam edin. - + Connected to %1. %1 ile bağlı. - + Server %1 is temporarily unavailable. %1 sunucusu geçici olarak ulaşılamaz durumda. - + Server %1 is currently in maintenance mode. - + Signed out from %1. %1 oturumu sonlandırıldı. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... - + No connection to %1 at %2. %1 ile %2 bağlantısı yok. - + Log in Giriş yap - + There are folders that were not synchronized because they are too big: Çok büyük oldukları için eşitlenmeyen klasörler var: - + There are folders that were not synchronized because they are external storages: Harici depolama diskinde oldukları için eşitlenmeyen klasörler var: - + There are folders that were not synchronized because they are too big or external storages: Çok büyük oldukları için ya da harici depolama alanında oldukları için eşitlenmeyen klasörler var: - + Confirm Account Removal Hesap Silinmesini Onaylayın - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p><i>%1</i> hesabının bağlantısını kaldırmayı gerçekten istiyor musunuz?</p><p><b>Not:</b> Bu işlem herhangi bir dosyayı <b>silmeyecektir</b>.</p> - + Remove connection Bağlantıyı kaldır - - + + Open folder Klasörü aç - + Log out Çıkış yap - + Resume sync Eşitlemeye devam et - + Pause sync Eşitlemeyi duraklat - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p><i>%1</i> klasörünün eşitlemesini durdurmayı gerçekten istiyor musunuz?</p><p><b>Not:</b> Bu işlem herhangi bir dosyayı <b>silmeyecektir</b>.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) / %2 kullanımda. Ağdan bağlanmış veya paylaşılan dizinlerin farklı sınırları olabilir. - + %1 of %2 in use %1 / %2 kullanımda - + Currently there is no storage usage information available. Şu anda depolama kullanım bilgisi mevcut değil. - + No %1 connection configured. Hiç %1 bağlantısı yapılandırılmamış. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured Hiçbir ownCloud hesabı yapılandırılmamış - + The configured server for this client is too old Yapılandırılmış sunucu, bu istemci için çok eski - + Please update to the latest server and restart the client. Lütfen en son sunucuya güncelleyin veya istemciyi yeniden başlatın - + Authentication error: Either username or password are wrong. Giriş hatası: Kullanıcı adı veya parola hatalı. - + timeout zaman aşımı - + The provided credentials are not correct Sağlanan kimlik bilgileri doğru değil @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Kullanıcı tarafından iptal edildi @@ -934,12 +934,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an Klasör Eşitleme Bağlantısı Ekle - + Synchronizing with local folder Yerel klasör ile eşitleniyor - + File Dosya @@ -1087,12 +1087,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizard - + Add Folder Sync Connection Klasör Eşitleme Bağlantısı Ekle - + Add Sync Connection Eşitleme Bağlantısı Ekle @@ -1100,17 +1100,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Eşitlemek için yerel bir klasör seçmek üzere tıklayın. - + Enter the path to the local folder. Yerel klasörün yolunu girin. - + Select the source folder Kaynak klasörünü seçin @@ -1118,47 +1118,47 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardRemotePath - + Create Remote Folder Uzak Klasör Oluştur - + Enter the name of the new folder to be created below '%1': '%1' altında oluşturulacak yeni klasörün adını girin: - + Folder was successfully created on %1. Klasör %1 üzerinde başarıyla oluşturuldu. - + Authentication failed accessing %1 %1 erişimi için giriş başarısız - + Failed to create the folder on %1. Please check manually. %1 üzerinde klasör oluşturma başarısız. Lütfen elle denetleyin. - + Failed to list a folder. Error: %1 Bir klasörün listelenmesi başarısız oldu. Hata: %1 - + Choose this to sync the entire account Tüm hesabı eşitlemek için bunu seçin - + This folder is already being synced. Bu klasör zaten eşitleniyor. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. <i>%1</i> zaten eşitleniyor. Bu, <i>%2</i> klasörünün üst klasörü. @@ -1166,12 +1166,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Uyarı:</b> %1 - + <b>Warning:</b> <b>Uyarı:</b> @@ -2701,33 +2701,33 @@ Kullanmanız önerilmez. - + Delete Sil - + Open link in browser - + Copy link to clipboard - + Copy link to clipboard (direct download) - + Send link by email Bağlantıyı e-posta ile gönder - + Send link by email (direct download) @@ -2861,12 +2861,12 @@ Kullanmanız önerilmez. OCC::ShibbolethCredentials - + Login Error Oturum Açma Hatası - + You must sign in as user %1 %1 kullanıcısı olarak oturum açmalısınız @@ -3211,38 +3211,38 @@ Kullanmanız önerilmez. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Sadece %1 mevcut, Çalıştırmak için en az %2 gerekmektedir - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder Üst dizin ekleme yetkiniz olmadığından izin verilmedi - + Not allowed because you don't have permission to add files in that folder Bu klasöre dosya ekleme yetkiniz olmadığından izin verilmedi - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3332,89 +3332,94 @@ Kullanmanız önerilmez. Dosya adı çok uzun. - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. - + Stat failed. Durum alma başarısız. - + Filename encoding is not valid Dosya adı kodlaması geçerli değil - + Invalid characters, please rename "%1" Geçersiz karakterler, lütfen "%1" yerine yeni bir isim girin - + Unable to read the blacklist from the local database Yerel veritabanından kara liste okunamadı - + Unable to read from the sync journal. Eşitleme günlüğünden okunamadı. - + Cannot open the sync journal Eşitleme günlüğü açılamıyor - + File name contains at least one invalid character Dosya adı en az bir geçersiz karakter içeriyor - - + + Ignored because of the "choose what to sync" blacklist "Eşitlenecekleri seçin" kara listesinde olduğundan yoksayıldı. - + Not allowed because you don't have permission to add subfolders to that folder Bu dizine alt dizin ekleme yetkiniz olmadığından izin verilmedi - + Not allowed to upload this file because it is read-only on the server, restoring Sunucuda salt okunur olduğundan, bu dosya yüklenemedi, geri alınıyor - - + + Not allowed to remove, restoring Kaldırmaya izin verilmedi, geri alınıyor - + Local files and share folder removed. Yerel dosyalar ve paylaşım klasörü kaldırıldı. - + Move not allowed, item restored Taşımaya izin verilmedi, öge geri alındı - + Move not allowed because %1 is read-only %1 salt okunur olduğundan taşımaya izin verilmedi - + the destination hedef - + the source kaynak @@ -3456,17 +3461,17 @@ Kullanmanız önerilmez. OCC::ValidateChecksumHeader - + The checksum header is malformed. Sağlama toplam başlığı bozulmuş. - + The checksum header contained an unknown checksum type '%1' Sağlama başlığı bilinmeyen '%1' sağlama tipi içeriyor - + The downloaded file does not match the checksum, it will be resumed. İndirilen dosya sağlama toplamı ile eşleşmiyor, devam edilecek. diff --git a/translations/client_uk.ts b/translations/client_uk.ts index cb65f7494..fe97e9135 100644 --- a/translations/client_uk.ts +++ b/translations/client_uk.ts @@ -135,8 +135,8 @@ - - + + Cancel Скасувати @@ -166,184 +166,184 @@ Обліковий запис - + Choose what to sync Оберіть, що хочете синхронізувати - + Force sync now Примусово синхронізувати зараз - + Restart sync Перезапустити синхронізацію - + Remove folder sync connection - + Folder creation failed Не вдалося створити теку - + <p>Could not create local folder <i>%1</i>. - + Confirm Folder Sync Connection Removal - + Remove Folder Sync Connection - + Sync Running Виконується синхронізація - + The syncing operation is running.<br/>Do you want to terminate it? Виконується процедура синхронізації.<br/>Бажаєте зупинити? - + %1 in use %1 використовується - + %1 as <i>%2</i> %1 як <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. - + Connected to %1. Підключено до %1. - + Server %1 is temporarily unavailable. Сервер %1 тимчасово недоступний. - + Server %1 is currently in maintenance mode. - + Signed out from %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... - + No connection to %1 at %2. - + Log in Увійти - + There are folders that were not synchronized because they are too big: - + There are folders that were not synchronized because they are external storages: - + There are folders that were not synchronized because they are too big or external storages: - + Confirm Account Removal Підтвердіть видалення облікового запису - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection - - + + Open folder Відкрити каталог - + Log out Вихід - + Resume sync Відновити синхронізацію - + Pause sync Призупинити синхронізацію - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. Використовується %1 (%3%) з %2. Деякі теки, включаючи мережеві змонтовані чи спільні, можуть мати інші обмеження. - + %1 of %2 in use Використовується %1 з %2 - + Currently there is no storage usage information available. На даний час немає відомостей про наповнення сховища. - + No %1 connection configured. Жодного %1 підключення не налаштовано. @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured Обліковий запис ownCloud не налаштовано - + The configured server for this client is too old Налаштований сервер застарий для цього клієнта - + Please update to the latest server and restart the client. Будь ласка, оновіть сервер до останньої версії та перезавантажте клієнт. - + Authentication error: Either username or password are wrong. Помилка автентифікації: ім'я користувача або пароль невірні. - + timeout час вичерпано - + The provided credentials are not correct Введені дані не вірні @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user Скасовано користувачем @@ -934,12 +934,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an - + Synchronizing with local folder Синхронізується з локальною текою - + File Файл @@ -1087,12 +1087,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizard - + Add Folder Sync Connection - + Add Sync Connection @@ -1100,17 +1100,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardLocalPath - + Click to select a local folder to sync. Натисніть, щоб обрати локальну теку для синхронізації. - + Enter the path to the local folder. Введіть шлях до локальної теки. - + Select the source folder Оберіть початкову теку @@ -1118,47 +1118,47 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardRemotePath - + Create Remote Folder Створити Віддалену Теку - + Enter the name of the new folder to be created below '%1': Введіть ім'я нової теки, яка буде створена тут '%1': - + Folder was successfully created on %1. Теку успішно створено на %1. - + Authentication failed accessing %1 Помилка аутентифікації при доступі до %1 - + Failed to create the folder on %1. Please check manually. Не вдалося створити теку на %1. Будь ласка, перевірте вручну. - + Failed to list a folder. Error: %1 - + Choose this to sync the entire account Оберіть це для синхронізації всього облікового запису - + This folder is already being synced. Тека вже синхронізується. - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. Тека <i>%1</i> вже синхронізується, та вона є батьківською для <i>%2</i>. @@ -1166,12 +1166,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>Попередження</b> %1 - + <b>Warning:</b> <b>Попередження</b> @@ -2699,33 +2699,33 @@ It is not advisable to use it. - + Delete Видалити - + Open link in browser - + Copy link to clipboard - + Copy link to clipboard (direct download) - + Send link by email Надіслати посилання по електронній пошті - + Send link by email (direct download) @@ -2859,12 +2859,12 @@ It is not advisable to use it. OCC::ShibbolethCredentials - + Login Error Помилка входу - + You must sign in as user %1 Ви маєте увійти як %1 @@ -3209,38 +3209,38 @@ It is not advisable to use it. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Доступно лише %1, для початку необхідно хоча б %2 - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder - + Not allowed because you don't have permission to add files in that folder - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3330,89 +3330,94 @@ It is not advisable to use it. Шлях до файлу занадто довгий. - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. - + Stat failed. - + Filename encoding is not valid Кодування файлу не припустиме - + Invalid characters, please rename "%1" - + Unable to read the blacklist from the local database - + Unable to read from the sync journal. - + Cannot open the sync journal Не вдається відкрити протокол синхронізації - + File name contains at least one invalid character Ім’я файлу містить принаймні один некоректний символ - - + + Ignored because of the "choose what to sync" blacklist Ігнорується через чорний список в "обрати що синхронізувати" - + Not allowed because you don't have permission to add subfolders to that folder Заборонено через відсутність прав додавання підкаталогів в цю теку. - + Not allowed to upload this file because it is read-only on the server, restoring Не дозволено завантажувати цей файл, оскільки він має дозвіл лише на перегляд, відновлюємо - - + + Not allowed to remove, restoring Не дозволено видаляти, відновлюємо - + Local files and share folder removed. Локальні файли та теки в загальному доступі було видалено. - + Move not allowed, item restored Переміщення не дозволено, елемент відновлено - + Move not allowed because %1 is read-only Переміщення не дозволено, оскільки %1 помічений тільки для перегляду - + the destination призначення - + the source джерело @@ -3454,17 +3459,17 @@ It is not advisable to use it. OCC::ValidateChecksumHeader - + The checksum header is malformed. Заголовок контрольної суми пошкоджено. - + The checksum header contained an unknown checksum type '%1' - + The downloaded file does not match the checksum, it will be resumed. Завантажений файл не відповідає контрольній сумі, його буде відновлено. diff --git a/translations/client_zh_CN.ts b/translations/client_zh_CN.ts index 6efa0885d..962e0b0a0 100644 --- a/translations/client_zh_CN.ts +++ b/translations/client_zh_CN.ts @@ -135,8 +135,8 @@ - - + + Cancel 取消 @@ -166,184 +166,184 @@ 账户 - + Choose what to sync 选择同步内容 - + Force sync now 强制同步 - + Restart sync 重新开始同步 - + Remove folder sync connection 断开文件夹同步 - + Folder creation failed 文件夹创建失败 - + <p>Could not create local folder <i>%1</i>. <p>无法创建文件夹 <i>%1</i>。 - + Confirm Folder Sync Connection Removal 确定断开文件夹同步 - + Remove Folder Sync Connection 断开文件夹同步 - + Sync Running 正在同步 - + The syncing operation is running.<br/>Do you want to terminate it? 正在执行同步。<br />您确定要关闭它吗? - + %1 in use %1 使用中 - + %1 as <i>%2</i> %1, <i>%2</i> - + The server version %1 is old and unsupported! Proceed at your own risk. 服务器版本 %1 很旧且不支持,继续操作将自行承担风险。 - + Connected to %1. 连接到 %1。 - + Server %1 is temporarily unavailable. 远程服务器%1暂时不可用。 - + Server %1 is currently in maintenance mode. - + Signed out from %1. 从 %1 退出 - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... 正在连接到 %1 - + No connection to %1 at %2. 没有到位于%2中的%1的连接 - + Log in 登录 - + There are folders that were not synchronized because they are too big: 以下目录由于太大而没有同步: - + There are folders that were not synchronized because they are external storages: 以下目录由于是外部存储而没有同步: - + There are folders that were not synchronized because they are too big or external storages: 以下目录由于太大或是外部存储而没有同步: - + Confirm Account Removal 确认删除账号 - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>你确定要删除账号的连接? <i>%1</i>?</p><p><b>Note:</b> 这 <b>不会</b> 删除任何文件</p> - + Remove connection 删除连接 - - + + Open folder 打开文件夹 - + Log out 注销 - + Resume sync 恢复同步 - + Pause sync 暂停同步 - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>你确定要停止文件夹同步? <i>%1</i>?</p><p><b>Note:</b> 这 <b>不会</b> 删除任何文件</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) of %2 使用中。一些文件夹,例如网络挂载的和共享的文件夹,可能有不同的限制。 - + %1 of %2 in use 使用量 %1 / %2 - + Currently there is no storage usage information available. 目前没有储存使用量信息可用。 - + No %1 connection configured. 没有 %1 连接配置。 @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured 没有已经配置的 ownCloud 帐号 - + The configured server for this client is too old 此客户端连接到的服务器版本过旧 - + Please update to the latest server and restart the client. 请更新到最新的服务器版本然后重启客户端。 - + Authentication error: Either username or password are wrong. 认证失败:用户名或密码错误 - + timeout 超时 - + The provided credentials are not correct 提供的证书不正确 @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user 用户撤销 @@ -943,12 +943,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an 添加同步文件夹 - + Synchronizing with local folder 与本地文件夹同步 - + File 文件 @@ -1096,12 +1096,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizard - + Add Folder Sync Connection 添加同步文件夹 - + Add Sync Connection 添加同步连接 @@ -1109,17 +1109,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardLocalPath - + Click to select a local folder to sync. 点击选择进行同步的本地文件夹。 - + Enter the path to the local folder. 输入本地文件夹的路径。 - + Select the source folder 选择源目录 @@ -1127,47 +1127,47 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardRemotePath - + Create Remote Folder 创建远程文件夹 - + Enter the name of the new folder to be created below '%1': 输入 %1 中的新文件夹的名称: - + Folder was successfully created on %1. 文件夹在 %1 上创建成功。 - + Authentication failed accessing %1 访问 %1 时认证失败 - + Failed to create the folder on %1. Please check manually. 无法在 %1 处创建文件夹。请自行检查。 - + Failed to list a folder. Error: %1 列表失败。错误: %1 - + Choose this to sync the entire account 选择此项以同步整个账户 - + This folder is already being synced. 文件夹已在同步中。 - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. 你已经在同步 <i>%1</i>,<i>%2</i> 是它的一个子文件夹。 @@ -1175,12 +1175,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>警告:</b>%1 - + <b>Warning:</b> <b>警告:</b> @@ -2710,33 +2710,33 @@ It is not advisable to use it. 创建公共分享链接 - + Delete 删除 - + Open link in browser 在浏览器中打来链接 - + Copy link to clipboard 复制链接到剪贴板 - + Copy link to clipboard (direct download) 复制链接到剪贴板 (直接下载) - + Send link by email 通过邮件发送链接 - + Send link by email (direct download) @@ -2870,12 +2870,12 @@ It is not advisable to use it. OCC::ShibbolethCredentials - + Login Error 登录错误 - + You must sign in as user %1 你必须以用户'%1'身份登录 @@ -3220,38 +3220,38 @@ It is not advisable to use it. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() 仅有 %1 有效,至少需要 %2 才能开始 - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder 你没有权限增加父目录 - + Not allowed because you don't have permission to add files in that folder 你没有权限增加文件 - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3341,89 +3341,94 @@ It is not advisable to use it. 文件名过长。 - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. - + Stat failed. 状态失败。 - + Filename encoding is not valid 文件名编码无效 - + Invalid characters, please rename "%1" 无效的字符,请更改为 “%1” - + Unable to read the blacklist from the local database 无法从本地数据库读取黑名单 - + Unable to read from the sync journal. 无法读取同步日志。 - + Cannot open the sync journal 无法打开同步日志 - + File name contains at least one invalid character 文件名中存在至少一个非法字符 - - + + Ignored because of the "choose what to sync" blacklist 已忽略(“选择同步内容”黑名单) - + Not allowed because you don't have permission to add subfolders to that folder 你没有权限增加子目录 - + Not allowed to upload this file because it is read-only on the server, restoring 无法上传文件,因为服务器端此文件为只读,正在回退 - - + + Not allowed to remove, restoring 无法删除,正在回退 - + Local files and share folder removed. 本地文件和共享文件夹已被删除。 - + Move not allowed, item restored 无法移动,正在回退 - + Move not allowed because %1 is read-only 无法移动,%1为是只读的 - + the destination 目标 - + the source @@ -3465,17 +3470,17 @@ It is not advisable to use it. OCC::ValidateChecksumHeader - + The checksum header is malformed. 校验异常 - + The checksum header contained an unknown checksum type '%1' 校验头包含未知的校验类型 '%1' - + The downloaded file does not match the checksum, it will be resumed. 下载的文件校验失败,将会回退。 diff --git a/translations/client_zh_TW.ts b/translations/client_zh_TW.ts index 03b6cc5ed..cdc167a94 100644 --- a/translations/client_zh_TW.ts +++ b/translations/client_zh_TW.ts @@ -135,8 +135,8 @@ - - + + Cancel 取消 @@ -166,184 +166,184 @@ 帳號 - + Choose what to sync 選擇要同步的項目 - + Force sync now 強制同步 - + Restart sync 重新啟動同步 - + Remove folder sync connection 移除資料夾同步連線 - + Folder creation failed 資料夾建立失敗 - + <p>Could not create local folder <i>%1</i>. <p>無法建立本地資料夾 <i>%1</i> - + Confirm Folder Sync Connection Removal 確認移除資料夾同步連線 - + Remove Folder Sync Connection 移除資料夾同步連線 - + Sync Running 正在同步中 - + The syncing operation is running.<br/>Do you want to terminate it? 正在同步中<br/>你真的想要中斷? - + %1 in use %1 正在使用 - + %1 as <i>%2</i> %1 如 <i>%2<i> - + The server version %1 is old and unsupported! Proceed at your own risk. 伺服器版本%1過舊,已不支援。繼續的風險請自負。 - + Connected to %1. 已連線到 %1 - + Server %1 is temporarily unavailable. 伺服器 %1 暫時無法使用。 - + Server %1 is currently in maintenance mode. 伺服器 %1 現正處於維護模式 - + Signed out from %1. 從 %1 登出 - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1... 正在連接到 %1 ... - + No connection to %1 at %2. 沒有從 %2 連線到 %1 - + Log in 登入 - + There are folders that were not synchronized because they are too big: 有部份的資料夾因為容量太大沒有辦法同步: - + There are folders that were not synchronized because they are external storages: 有部分資料夾因為是外部存儲沒有辦法同步: - + There are folders that were not synchronized because they are too big or external storages: 有部分資料夾因為容量太大或是外部存儲沒有辦法同步: - + Confirm Account Removal 確認移除帳號 - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>您確定要中斷此帳號 <i>%1</i> 的連線?</p><p><b>注意:</b>此操作 <b>不會</b> 刪除任何的檔案。</p> - + Remove connection 移除連線 - - + + Open folder 開啟資料夾 - + Log out 登出 - + Resume sync 繼續同步 - + Pause sync 暫停同步 - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>您確定要停止同步資料夾 <i>%1</i>?</p><p><b>注意:</b> 此操作 <b>不會</b> 刪除任何檔案</p> - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) 中的 %2 正在使用, 有些資料夾,包括網路掛載或分享資料夾,可能有不同的限制。 - + %1 of %2 in use 已使用 %2 中的 %1% - + Currently there is no storage usage information available. 目前無法查詢儲存空間使用資訊。 - + No %1 connection configured. 沒有 %1 連線設置。 @@ -604,32 +604,32 @@ OCC::ConnectionValidator - + No ownCloud account configured 沒有設置 ownCloud 帳號 - + The configured server for this client is too old 設置的伺服器對這個客戶端來說太舊了 - + Please update to the latest server and restart the client. 請將伺服器端更新到最新版並重新啟動客戶端 - + Authentication error: Either username or password are wrong. 驗證錯誤︰使用者名稱或是密碼錯誤 - + timeout 逾時 - + The provided credentials are not correct 提供的憑證不正確 @@ -637,7 +637,7 @@ OCC::DiscoveryMainThread - + Aborted by the user 使用者中斷 @@ -934,12 +934,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an 新增資料夾同步功能的連線 - + Synchronizing with local folder - + File 檔案 @@ -1087,12 +1087,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizard - + Add Folder Sync Connection 新增資料夾同步功能的連線 - + Add Sync Connection 新增同步連線 @@ -1100,17 +1100,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardLocalPath - + Click to select a local folder to sync. 請選擇要同步的本地資料夾 - + Enter the path to the local folder. 請輸入本地資料夾的路徑 - + Select the source folder 選擇來源資料夾 @@ -1118,47 +1118,47 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FolderWizardRemotePath - + Create Remote Folder 建立遠端資料夾 - + Enter the name of the new folder to be created below '%1': 請輸入欲創建在 '%1' 底下的新資料夾名稱: - + Folder was successfully created on %1. 資料夾成功建立在%1 - + Authentication failed accessing %1 存取 %1 認証失敗 - + Failed to create the folder on %1. Please check manually. 在 %1 建立資料夾失敗,請手動檢查 - + Failed to list a folder. Error: %1 取得資料夾清單失敗,錯誤: %1 - + Choose this to sync the entire account 請選擇這個功能用來同步整個帳號 - + This folder is already being synced. 這個資料夾已經被同步了。 - + You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>. 您已經同步了 <i>%1</i>, 這個資料夾是 <i>%2</i> 的母資料夾。 @@ -1166,12 +1166,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an OCC::FormatWarningsWizardPage - + <b>Warning:</b> %1 <b>警告:</b> %1 - + <b>Warning:</b> <b>警告:</b> @@ -2702,33 +2702,33 @@ It is not advisable to use it. - + Delete 刪除 - + Open link in browser - + Copy link to clipboard - + Copy link to clipboard (direct download) - + Send link by email 使用電子郵件傳送連結 - + Send link by email (direct download) @@ -2862,12 +2862,12 @@ It is not advisable to use it. OCC::ShibbolethCredentials - + Login Error 登入錯誤 - + You must sign in as user %1 您必須以 %1 使用者登入 @@ -3212,38 +3212,38 @@ It is not advisable to use it. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() 目前僅有 %1 可以使用,至少需要 %2 才能開始 - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Not allowed because you don't have permission to add parent folder 拒絕此操作,您沒有新增母資料夾的權限。 - + Not allowed because you don't have permission to add files in that folder 拒絕此操作,您沒有新增檔案在此資料夾的權限。 - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -3333,89 +3333,94 @@ It is not advisable to use it. 檔案名稱太長了。 - + + The filename cannot be encoded on your file system. + + + + Unresolved conflict. - + Stat failed. 狀態失敗。 - + Filename encoding is not valid 檔案名稱編碼是無效的 - + Invalid characters, please rename "%1" 無效的字元,請您重新命名 "%1" - + Unable to read the blacklist from the local database - + Unable to read from the sync journal. - + Cannot open the sync journal 同步處理日誌無法開啟 - + File name contains at least one invalid character 檔案名稱含有不合法的字元 - - + + Ignored because of the "choose what to sync" blacklist 已忽略。根據 "選擇要同步的項目"的黑名單 - + Not allowed because you don't have permission to add subfolders to that folder 拒絕此操作,您沒有在此新增子資料夾的權限。 - + Not allowed to upload this file because it is read-only on the server, restoring 拒絕上傳此檔案,此檔案在伺服器是唯讀檔,復原中 - - + + Not allowed to remove, restoring 不允許刪除,復原中 - + Local files and share folder removed. 本地端檔案和共享資料夾已被刪除。 - + Move not allowed, item restored 不允許移動,物件復原中 - + Move not allowed because %1 is read-only 不允許移動,因為 %1 是唯讀的 - + the destination 目標 - + the source 來源 @@ -3457,17 +3462,17 @@ It is not advisable to use it. OCC::ValidateChecksumHeader - + The checksum header is malformed. 校驗碼異常。 - + The checksum header contained an unknown checksum type '%1' 校正資料含有未知的型態 '%1' - + The downloaded file does not match the checksum, it will be resumed. 下載的檔案驗證失敗,將會被還原