diff --git a/.gitignore b/.gitignore index 19fe61e82..c180c90cb 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ *build*/ *flymake* CMakeLists.txt.user* -*.patch *~ *.autosave doc/_build/* diff --git a/CMakeLists.txt b/CMakeLists.txt index fcde73357..a0417c743 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,13 @@ if ( EXISTS ${OEM_THEME_DIR}/OEM.cmake ) else () include ( ${CMAKE_SOURCE_DIR}/OWNCLOUD.cmake ) endif() +# need this logic to not mess with re/uninstallations via macosx.pkgproj +if(${APPLICATION_REV_DOMAIN} STREQUAL "com.owncloud.desktopclient") + set(APPLICATION_REV_DOMAIN_INSTALLER "com.ownCloud.client") +else() + set(APPLICATION_REV_DOMAIN_INSTALLER ${APPLICATION_REV_DOMAIN}) +endif() + if (NOT DEFINED APPLICATION_SHORTNAME) set ( APPLICATION_SHORTNAME ${APPLICATION_NAME} ) @@ -166,9 +173,11 @@ set(TRANSLATIONS ${TRANS_FILES}) add_subdirectory(csync) add_subdirectory(src) +if(NOT BUILD_LIBRARIES_ONLY) add_subdirectory(shell_integration) add_subdirectory(doc) add_subdirectory(admin) +endif(NOT BUILD_LIBRARIES_ONLY) if(UNIT_TESTING) include(CTest) diff --git a/README.md b/README.md index c22cc81f9..21570f972 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,7 @@ https://github.com/owncloud/client. ## Building the source code -Please refer to doc/building.rst, or -[Building the Client](http://doc.owncloud.org/desktop/1.5/building.html) +[Building the Client](http://doc.owncloud.org/desktop/1.7/building.html) in the ownCloud Desktop Client manual. ## Maintainers and Contributors diff --git a/admin/osx/macosx.pkgproj b/admin/osx/macosx.pkgproj index 460b9d87a..516f0c39f 100644 --- a/admin/osx/macosx.pkgproj +++ b/admin/osx/macosx.pkgproj @@ -485,9 +485,9 @@ CONCLUSION_ACTION 0 IDENTIFIER - com.ownCloud.client + @APPLICATION_REV_DOMAIN_INSTALLER@ NAME - ownCloud Client + @APPLICATION_NAME@ OVERWRITE_PERMISSIONS VERSION @@ -1213,7 +1213,7 @@ LANGUAGE English VALUE - ownCloud Client + @APPLICATION_NAME@ Client @@ -1413,7 +1413,7 @@ NAME - ownCloud Installer + @APPLICATION_NAME@ Installer REFERENCE_FOLDER_PATH @CMAKE_INSTALL_DIR@ diff --git a/admin/win/nsi/l10n/Portuguese.nsh b/admin/win/nsi/l10n/Portuguese.nsh index c39c93d52..4c7dd69b9 100644 --- a/admin/win/nsi/l10n/Portuguese.nsh +++ b/admin/win/nsi/l10n/Portuguese.nsh @@ -1,14 +1,14 @@ # Auto-generated - do not modify -StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar notas de lançamento" -StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Encontrados processos ${APPLICATION_EXECUTABLE} que precisam de ser parados.$\nDeseja que o instalador os pare ?" +StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Ver notas de lançamento" +StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Processos(s) ${APPLICATION_EXECUTABLE} em execução. Estes processos precisam de ser interrompidos.$\\nDeseja que o instalador os termine automaticamente?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "A terminar processos ${APPLICATION_EXECUTABLE}." -StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Processo para terminar não foi encontrado!" -StrCpy $PageReinstall_NEW_Field_1 "Está instalada uma versão anterior de ${APPLICATION_NAME} no seu sistema. Recomenda-se que desinstale primeiro a versão atual antes de instalar. Selecione a operação que pretende fazer, e clique Seguinte para continuar." +StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Processo a terminar não encontrado!" +StrCpy $PageReinstall_NEW_Field_1 "Uma versão antiga de ${APPLICATION_NAME} está instalada no sistema. É recomendado que você desinstale a versão atual antes de instalar. Selecione a operação que deseja executar e clique em $\"Avançar$\" para continuar." StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar" -StrCpy $PageReinstall_NEW_Field_3 "Não desinstalar" +StrCpy $PageReinstall_NEW_Field_3 "Não desinstale" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Já instalado" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Escolha como pretende instalar ${APPLICATION_NAME}." -StrCpy $PageReinstall_OLD_Field_1 "Já esta instalada uma nova versão dfe ${APPLICATION_NAME}! Não se recomenda instalar uma versão anterior. Se quer mesmo instalar esta versão mais antiga, é melhor desinstalar primeiro a versão atual. Selecione a operação que pretende fazer e clique Seguinte para continuar." +StrCpy $PageReinstall_OLD_Field_1 "Uma versão mais recente do ${APPLICATION_NAME} já está instalada! Não é recomendada a instalação de uma versão mais antiga. Se realmente deseja instalar esta versão, aconselha-se a desinstalação da versão atual primeiro. Selecione a operação que deseja executar e clique em Avançar para continuar." StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} já está instalado.\nSelecione a operação que deseja fazer, e clique Seguinte para continuar." StrCpy $PageReinstall_SAME_Field_2 "Adicionar/Reinstalar Componentes" StrCpy $PageReinstall_SAME_Field_3 "Desinstalar ${APPLICATION_NAME}" @@ -40,7 +40,7 @@ StrCpy $INIT_NO_QUICK_LAUNCH "Atalho de Início Rápido (N/A)" StrCpy $INIT_NO_DESKTOP "Atalho do Ambiente de Trabalho (sobrepõe o existente)" StrCpy $UAC_ERROR_ELEVATE "Incapaz de elevar, erro:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Este instalador precisa de permissões de administrador, tente novamente" -StrCpy $INIT_INSTALLER_RUNNING "O instalador já está a correr." -StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Este desinstalador precisa de acesso de administrador; tente novamente" -StrCpy $INIT_UNINSTALLER_RUNNING "O desinstalador já está a correr." +StrCpy $INIT_INSTALLER_RUNNING "O instalador já está em execução." +StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Este desinstalador requer permissões de administrador, tente novamente" +StrCpy $INIT_UNINSTALLER_RUNNING "O desinstalador já está em execução." StrCpy $SectionGroup_Shortcuts "Atalhos" diff --git a/cmake/modules/AddAppIconMacro.cmake b/cmake/modules/AddAppIconMacro.cmake index 9a223e0ea..3106b1bfa 100644 --- a/cmake/modules/AddAppIconMacro.cmake +++ b/cmake/modules/AddAppIconMacro.cmake @@ -1,4 +1,4 @@ -SET(WINDRES_EXECUTABLE ${CMAKE_RC_COMPILER}) +SET(WINDRES_EXECUTABLE_BASE ${CMAKE_RC_COMPILER}) # This macro is taken from kdelibs/cmake/modules/KDE4Macros.cmake. # @@ -21,7 +21,7 @@ macro (KDE4_ADD_APP_ICON appsources pattern) else(NOT WINCE) find_program(PNG2ICO_EXECUTABLE NAMES png2ico PATHS ${HOST_BINDIR} NO_DEFAULT_PATH ) endif(NOT WINCE) - find_program(WINDRES_EXECUTABLE NAMES windres) + find_program(WINDRES_EXECUTABLE NAMES ${WINDRES_EXECUTABLE_BASE}) if(MSVC) set(WINDRES_EXECUTABLE TRUE) endif(MSVC) diff --git a/csync/src/csync_update.c b/csync/src/csync_update.c index 2934d71ab..b7eff2bac 100644 --- a/csync/src/csync_update.c +++ b/csync/src/csync_update.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "c_lib.h" #include "c_jhash.h" @@ -266,7 +267,10 @@ static int _csync_detect_update(CSYNC *ctx, const char *file, goto out; } if((ctx->current == REMOTE_REPLICA && !c_streq(fs->etag, tmp->etag )) - || (ctx->current == LOCAL_REPLICA && (fs->mtime != tmp->modtime + || (ctx->current == LOCAL_REPLICA && ((fs->mtime != tmp->modtime + /* Ignore when there is exactly one hour difference because of summer time switches */ + && (int64_t)difftime(fs->mtime, tmp->modtime) != 3600 + && (int64_t)difftime(fs->mtime, tmp->modtime) != -3600) // zero size in statedb can happen during migration || (tmp->size != 0 && fs->size != tmp->size) #if 0 diff --git a/csync/src/httpbf/src/httpbf.c b/csync/src/httpbf/src/httpbf.c index 40080240e..3c5f2107d 100644 --- a/csync/src/httpbf/src/httpbf.c +++ b/csync/src/httpbf/src/httpbf.c @@ -503,6 +503,8 @@ Hbf_State hbf_transfer( ne_session *session, hbf_transfer_t *transfer, const cha if( transfer->block_cnt > 1 ) { ne_add_request_header(req, "OC-Chunked", "1"); + snprintf(buf, sizeof(buf), "%"PRId64, transfer->threshold); + ne_add_request_header(req, "OC-Chunk-Size", buf); } ne_add_request_header( req, "Content-Type", "application/octet-stream"); diff --git a/csync/tests/ownCloud/t8.pl b/csync/tests/ownCloud/t8.pl index 4851f75d6..1a0557d7f 100755 --- a/csync/tests/ownCloud/t8.pl +++ b/csync/tests/ownCloud/t8.pl @@ -127,10 +127,9 @@ glob_put( "$tmpdir2/*", "parallel" ); csync(); -# We assume the smaller file finished first, blocking -# the second file from being saved. -assert( !-e localDir() . 'parallel/FILE.dat' ); -assert( -e localDir() . 'parallel/file.dat' ); +# only one file must exist +assert( (!-e localDir() . 'parallel/FILE.dat' ) or (!-e localDir() . 'parallel/file.dat') ); +assert( (-e localDir() . 'parallel/FILE.dat' ) or (-e localDir() . 'parallel/file.dat') ); cleanup(); system("rm -r " . $tmpdir); diff --git a/doc/images/icon-error.png b/doc/images/icon-error.png new file mode 100644 index 000000000..6eb5e3e40 Binary files /dev/null and b/doc/images/icon-error.png differ diff --git a/doc/images/icon-information.png b/doc/images/icon-information.png new file mode 100644 index 000000000..f1ce1eb62 Binary files /dev/null and b/doc/images/icon-information.png differ diff --git a/doc/images/icon-offline.png b/doc/images/icon-offline.png new file mode 100644 index 000000000..40a4c7882 Binary files /dev/null and b/doc/images/icon-offline.png differ diff --git a/doc/images/icon-paused.png b/doc/images/icon-paused.png new file mode 100644 index 000000000..eada780f9 Binary files /dev/null and b/doc/images/icon-paused.png differ diff --git a/doc/images/icon-syncing.png b/doc/images/icon-syncing.png new file mode 100644 index 000000000..4b0f2515d Binary files /dev/null and b/doc/images/icon-syncing.png differ diff --git a/doc/images/icon.png b/doc/images/icon.png index 28dee23cc..29888b6cf 100644 Binary files a/doc/images/icon.png and b/doc/images/icon.png differ diff --git a/doc/navigating.rst b/doc/navigating.rst index 9e6bfeca9..6fa12b225 100644 --- a/doc/navigating.rst +++ b/doc/navigating.rst @@ -9,7 +9,35 @@ system tray (Windows, KDE), status bar (MAC OS X), or notification area .. image:: images/icon.png -**ownCloud Desktop Client icon** +This is a status indicator which uses overlay icons to indicate the +current status of your synchronization. The green circle with the white checkmark +tells you that your synchronization is current and you are connected to your +ownCloud server. + +.. image:: images/icon-syncing.png + +The blue icon with the white semi-circles means synchronization is in progress. + +.. image:: images/icon-paused.png + +The yellow overlay icon with the parallel lines tells you your synchronization +has been paused. (Most likely by you, by opening the client and clicking +Account > Pause.) + +.. image:: images/icon-offline.png + +The gray icon with three white dots means your sync client has lost its +connection with your ownCloud server. + +.. image:: images/icon-information.png + +When you see a white circle with the letter "i" that is the informational icon, +so you should click it to see what it has to tell you. + +.. image:: images/icon-error.png + +The red circle with the white "x" indicates a configuration error, such as an +incorrect login or server URL. Using the Desktop Client Menu ----------------------------- @@ -24,10 +52,17 @@ following menu: The Desktop Client menu provides the following options: * ``Open ownCloud in browser``: Launches the ownCloud WEB interface. -* ``Open folder 'ownCloud'``: Opens the ownCloud local folder. If you have defined multiple synchronization targets, the window displays each local folder. -* **Disk space indicator**: Indicates the amount of space currently used on the server. -* Operation indicator: Displays the status of the current synchronization process or indicates ``Up to date`` if the server and client are in sync. -* **Recent Changes**: Displays the last six files modified by the synchronization operations and provides access to the current synchronization status listing all changes since the last restart of the ownCloud client. +* ``Open folder 'ownCloud'``: Opens the ownCloud local folder. If you have + defined multiple synchronization targets, the window displays each local + folder. +* **Disk space indicator**: Indicates the amount of space currently used on the + server. +* Operation indicator: Displays the status of the current synchronization + process or indicates ``Up to date`` if the server and client are in sync. +* **Recent Changes**: Displays the last six files modified by the + synchronization operations and provides access to the current + synchronization status listing all changes since the last restart of the + ownCloud client. * ``Settings...``: Provides access to the settings menu. * ``Help``: Opens a browser to display ownCloud Desktop Client Guide. * ``Sign out``: Disables the client from continued synchronizations. @@ -39,7 +74,9 @@ Using the Account Settings Window .. index:: account settings, user, password, Server URL -The ``Account`` window provides a summary for general settings associated with the ownCloud account. This window enalbes you to manage any synchronized folders in the account and enables you to modify them. +The ``Account`` window provides a summary for general settings associated with +the ownCloud account. This window enalbes you to manage any synchronized +folders in the account and enables you to modify them. To access and modify the account settings: @@ -48,25 +85,37 @@ To access and modify the account settings: The fields and options in this window include: -* ``Connected to as `` field: Indicates the ownCloud server to which the client is synchronizing and the user account on that server. +* ``Connected to as `` field: Indicates the ownCloud + server to which the client is synchronizing and the user account on that + server. -* ``Add Folder...`` button: Provides the ability to add another folder to the synchronization process (see ``Adding a Folder``). +* ``Add Folder...`` button: Provides the ability to add another folder to the + synchronization process (see ``Adding a Folder``). -* ``Pause/Resume`` button: Pauses the current sync (or prevents the client from starting a new sync) or resumes the sync process. +* ``Pause/Resume`` button: Pauses the current sync (or prevents the client from + starting a new sync) or resumes the sync process. -* ``Remove`` button: Removes the selected folder from the sync process. This button is used when you want to synchronize only a few folders and not the root folder. If only the root folder is available, you must first remove the root from the synchronization and then add individual folders that you want to synchronize as desired. +* ``Remove`` button: Removes the selected folder from the sync process. This + button is used when you want to synchronize only a few folders and not the + root folder. If only the root folder is available, you must first remove the + root from the synchronization and then add individual folders that you want + to synchronize as desired. -* ``Storage Usage`` field: Indicates the storage utilization on the ownCloud server. +* ``Storage Usage`` field: Indicates the storage utilization on the ownCloud + server. * ``Edit Ignored Files`` button: Launches the Ignored Files Editor. -* ``Modify Account`` button: Enables you to change the ownCloud server to which you are synchronizing. This option launches the ``Setting up an Account`` windows (See ??). +* ``Modify Account`` button: Enables you to change the ownCloud server to which + you are synchronizing. This option launches the ``Setting up an Account`` + dialog (see :doc:`accountsetup`). Adding a Folder ^^^^^^^^^^^^^^^ -The ``Add a Folder ...`` button enables you to add a new folder to the syncrhonization process. +The ``Add a Folder ...`` button enables you to add a new folder to the +syncrhonization process. To add a new folder: @@ -74,37 +123,35 @@ To add a new folder: The ``Add Folder...`` window opens - .. image:: images/folderwizard_local.png - :scale: 50 % +.. image:: images/folderwizard_local.png - **``Add Folder...`` window (local folder)** +2. Specify a *unique* path and alias name to the folder or use the ``Choose...`` + button to locate the new folder on your system to which you want to + synchronize. -2. Specify a *unique* path and alias name to the folder or use the ``Choose...`` button to locate the new folder on your system to which you want to synchronize. - - ..note:: Nested synchronizations are not supported. In other words, you +.. note:: Nested synchronizations are not supported. In other words, you cannot add a folder that is already contained within another synchronized folder. In addition, you cannot add a higher level (parent) folder that contains a folder to which you are already synchronizing. By default, the ownCloud Set Up Wizard syncrhonizes your entire ownCloud account to the root - folder of the ownCloud server. Due to this default setup, you must first remove - the top-level folder prior to specifying new synchronizations. + folder of the ownCloud server. Due to this default setup, you must first + remove the top-level folder prior to specifying new synchronizations. 3. Click 'Next' to continue. A window opens prompting you to select a remote destination folder on the ownCloud server to which you want to synchronize. - .. image:: images/folderwizard_remote.png - :scale: 50 % +.. image:: images/folderwizard_remote.png - **``Add Folder...`` window (remote destination)** +4. Select a folder on the ownCloud server to which you want to synchronize your +newly added folder. -4. Select a folder on the ownCloud server to which you want to synchronize your newly added folder. - - ..note:: A server folder can only be synchronized with a particular client once. - If you attempt to sync the root directory, you cannot sync with other folders - on the server. Similarly, if you sync with folder ``/a``, you cannot create - another sync with ``/a/b``, since ``b`` is already being synched. +..note:: A server folder can only be synchronized with a particular client + once. If you attempt to sync the root directory, you cannot sync with + other folders on the server. Similarly, if you sync with folder ``/a``, you + cannot create another sync with ``/a/b``, since ``b`` is already being + synched. Editing Ignored Files ^^^^^^^^^^^^^^^^^^^^^ @@ -117,7 +164,8 @@ In addition to using standard characters, the Ignored Files Editor enables you to use wild cards (for example, using an asterisk ‘*’ to indicate multiple characters or a question mark ‘?’ to incidate a single character). -For additional information about this editor, see `Using the Ignored Files Editor`_ +For additional information about this editor, see `Using the Ignored Files +Editor`_ Using the Activity Settings Window ---------------------------------- @@ -131,9 +179,6 @@ manner due to containing special characters that cannot be stored on certain file systems. .. image:: images/settings_activity.png - :scale: 50 % - - **Activity settings window** You can open the Activity window in one of the following ways: @@ -152,9 +197,6 @@ ownCloud Desktop Client and provides information about the software version, its creator, and the existance of any updates. .. image:: images/settings_general.png - :scale: 50 % - - **General settings window** The settings and information contained in this window are as follows: @@ -170,12 +212,13 @@ The settings and information contained in this window are as follows: * ``Use Monochrome Icons`` checkbox: Provides the option to check (enable) or uncheck (disable) the use of monochrome (visually less obtrusive) icons. - .. note:: This option can be useful on MAC OSX platforms. +.. note:: This option can be useful on MAC OSX platforms. * ``About`` field: Provides information about the software authors along with pertinent build conditions. - .. note:: Information in this field can be valuable when submitting a support request. +.. note:: Information in this field can be valuable when submitting a support + request. * ``Updates`` field: Provides information about any available updates for the ownCloud Desktop Client. @@ -190,9 +233,6 @@ well as limit the download and upload bandwidth utilization of file synchronizations. .. image:: images/settings_network.png - :scale: 50 % - - **Network settings window** Specifying Proxy Settings ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -202,20 +242,27 @@ that functions as an intermediary contact for requests from clients that are seeking resources from other servers. For the ownCloud Desktop Client, you can define the following proxy settings: -* ``No Proxy`` option: Specifies that the ownCloud Client circumvent the default proxy configured on the system. +* ``No Proxy`` option: Specifies that the ownCloud Client circumvent the default + proxy configured on the system. * ``Use system proxy`` option: Default setting. Follows the systems proxy settings. On Linux systems, this setting uses the value of the variable ``http_proxy``. * ``Specify proxy manually as`` option: Enables you to specify the following custom proxy settings: - - ``HTTP(S)``: Used when you are required to use an HTTP(S) proxy server (for example, Squid or Microsoft Forefront TMG). - - ``SOCKSv5``: Typically used in special company LAN setups, or in combination with the OpenSSH + - ``HTTP(S)``: Used when you are required to use an HTTP(S) proxy server (for + example, Squid or Microsoft Forefront TMG). + - ``SOCKSv5``: Typically used in special company LAN setups, or in combination + with the OpenSSH dynamic application level forwarding feature (see ``ssh -D``). - - ``Host``: Host name or IP address of the proxy server along with the port number. HTTP proxies - typically listen over Ports 8080 (default) or 3128. SOCKS servers typically listen over port 1080. -* ``Proxy Server requires authentication`` checkbox: Provides the option to check (enable/require) or - uncheck (disable/not require) proxy server authentication. When not checked, the proxy server must - be configured to allow anonymous usage. When checked, a proxy server username and password is required. + - ``Host``: Host name or IP address of the proxy server along with the port + number. HTTP proxies typically listen over Ports 8080 (default) or 3128. + SOCKS servers typically listen over port 1080. +* ``Proxy Server requires authentication`` checkbox: Provides the option to + check (enable/require) or + uncheck (disable/not require) proxy server authentication. When not checked, + the proxy server must + be configured to allow anonymous usage. When checked, a proxy server username + and password is required. Bandwidth Limiting ^^^^^^^^^^^^^^^^^^ @@ -265,13 +312,10 @@ can use the *Ignored Files Editor* that is embedded in the ownCloud Desktop Client. .. image:: images/ignored_files_editor.png - :scale: 50% - Ignored Files Editor window - -The :guilabel:`Ignored Files Editor` enables you to define customized patterns that the -ownCloud Client uses to identify files and directories that you want to exclude -from the synchronization process. For your convenience, the editor is +The ``Ignored Files Editor`` enables you to define customized patterns +that the ownCloud Client uses to identify files and directories that you want +to exclude from the synchronization process. For your convenience, the editor is pre-populated with a default list of typically ignore patterns. These patterns are contained in a system file (typically ``sync-exclude.lst``) located in the ownCloud Client application directory. You cannot modify these pre-populated diff --git a/issue_template.md b/issue_template.md index b11453867..c36b35bd1 100644 --- a/issue_template.md +++ b/issue_template.md @@ -39,6 +39,8 @@ logs. ```Template for output < 10 lines``` 1. Output of `owncloud --logwindow` or `owncloud --logfile log.txt` +(On Windows using `cmd.exe`, you might need to first `cd` into the ownCloud directory) +(See also http://doc.owncloud.org/desktop/1.5/troubleshooting.html#client-logfile ) 2. Web server error log: diff --git a/mirall.qrc b/mirall.qrc index afd9dce94..e4787ad2d 100644 --- a/mirall.qrc +++ b/mirall.qrc @@ -13,7 +13,8 @@ resources/settings.png resources/activity.png resources/network.png - resources/lock-http.png - resources/lock-https.png + resources/lock-http.png + resources/lock-https.png + resources/accounts.png diff --git a/resources/accounts.png b/resources/accounts.png new file mode 100644 index 000000000..ea983a2a4 Binary files /dev/null and b/resources/accounts.png differ diff --git a/shell_integration/dolphin/0001-KOverlayIconPlugin.patch b/shell_integration/dolphin/0001-KOverlayIconPlugin.patch new file mode 100644 index 000000000..25f9ceeea --- /dev/null +++ b/shell_integration/dolphin/0001-KOverlayIconPlugin.patch @@ -0,0 +1,256 @@ +From 3a26dc77f8e988ea99b23c4d5a2c831ecc31c920 Mon Sep 17 00:00:00 2001 +From: Olivier Goffart +Date: Thu, 17 Jul 2014 13:26:56 +0200 +Subject: [PATCH] WIP: add KOverlayIconPlugin + +--- + .../src/kitemviews/kfileitemmodelrolesupdater.cpp | 35 ++++++++++++- + .../src/kitemviews/kfileitemmodelrolesupdater.h | 9 ++++ + lib/konq/CMakeLists.txt | 4 +- + lib/konq/koverlayiconplugin.cpp | 30 ++++++++++++ + lib/konq/koverlayiconplugin.desktop | 4 ++ + lib/konq/koverlayiconplugin.h | 57 ++++++++++++++++++++++ + 6 files changed, 137 insertions(+), 2 deletions(-) + create mode 100644 lib/konq/koverlayiconplugin.cpp + create mode 100644 lib/konq/koverlayiconplugin.desktop + create mode 100644 lib/konq/koverlayiconplugin.h + +diff --git a/dolphin/src/kitemviews/kfileitemmodelrolesupdater.cpp b/dolphin/src/kitemviews/kfileitemmodelrolesupdater.cpp +index 0865d40..840a65d 100644 +--- a/dolphin/src/kitemviews/kfileitemmodelrolesupdater.cpp ++++ b/dolphin/src/kitemviews/kfileitemmodelrolesupdater.cpp +@@ -28,9 +28,11 @@ + #include + #include + #include ++#include + + #include "private/kpixmapmodifier.h" + #include "private/kdirectorycontentscounter.h" ++#include + + #include + #include +@@ -129,6 +131,17 @@ KFileItemModelRolesUpdater::KFileItemModelRolesUpdater(KFileItemModel* model, QO + m_directoryContentsCounter = new KDirectoryContentsCounter(m_model, this); + connect(m_directoryContentsCounter, SIGNAL(result(QString,int)), + this, SLOT(slotDirectoryContentsCountReceived(QString,int))); ++ ++ ++ const KService::List pluginServices = KServiceTypeTrader::self()->query("KOverlayIconPlugin"); ++ ++ for (KService::List::ConstIterator it = pluginServices.constBegin(); it != pluginServices.constEnd(); ++it) { ++ KOverlayIconPlugin* plugin = (*it)->createInstance(this); ++ if (plugin) { ++ m_overlayIconsPlugin.append(plugin); ++ connect(plugin, SIGNAL(overlaysChanged(KUrl,QStringList)), this, SLOT(slotOverlaysChanged(KUrl,QStringList))); ++ } ++ } + } + + KFileItemModelRolesUpdater::~KFileItemModelRolesUpdater() +@@ -1075,7 +1088,11 @@ QHash KFileItemModelRolesUpdater::rolesData(const KFileIte + data.insert("type", item.mimeComment()); + } + +- data.insert("iconOverlays", item.overlays()); ++ QStringList overlays = item.overlays(); ++ foreach(KOverlayIconPlugin *it, m_overlayIconsPlugin) { ++ overlays.append(it->getOverlays(item)); ++ } ++ data.insert("iconOverlays", overlays); + + #ifdef HAVE_BALOO + if (m_balooFileMonitor) { +@@ -1086,6 +1103,22 @@ QHash KFileItemModelRolesUpdater::rolesData(const KFileIte + return data; + } + ++void KFileItemModelRolesUpdater::slotOverlaysChanged(const KUrl& url, const QStringList &) ++{ ++ KFileItem item = m_model->fileItem(url); ++ if (item.isNull()) ++ return; ++ int index = m_model->index(item); ++ QHash data = m_model->data(index); ++ QStringList overlays = item.overlays(); ++ foreach(KOverlayIconPlugin *it, m_overlayIconsPlugin) { ++ overlays.append(it->getOverlays(item)); ++ } ++ data.insert("iconOverlays", overlays); ++ m_model->setData(index, data); ++} ++ ++ + void KFileItemModelRolesUpdater::updateAllPreviews() + { + if (m_state == Paused) { +diff --git a/dolphin/src/kitemviews/kfileitemmodelrolesupdater.h b/dolphin/src/kitemviews/kfileitemmodelrolesupdater.h +index a9e979a..6d3add0 100644 +--- a/dolphin/src/kitemviews/kfileitemmodelrolesupdater.h ++++ b/dolphin/src/kitemviews/kfileitemmodelrolesupdater.h +@@ -32,6 +32,7 @@ + #include + #include + ++class KOverlayIconPlugin; + class KDirectoryContentsCounter; + class KFileItemModel; + class KJob; +@@ -180,6 +181,12 @@ private slots: + void slotPreviewJobFinished(); + + /** ++ * Is invoked when one of the KOverlayIconPlugin emit the signal that an overlay has changed ++ */ ++ void slotOverlaysChanged(const KUrl&, const QStringList&); ++ ++ ++ /** + * Resolves the sort role of the next item in m_pendingSortRole, applies it + * to the model, and invokes itself if there are any pending items left. If + * that is not the case, \a startUpdating() is called. +@@ -331,6 +338,8 @@ private: + + KDirectoryContentsCounter* m_directoryContentsCounter; + ++ QList m_overlayIconsPlugin; ++ + #ifdef HAVE_BALOO + Baloo::FileMonitor* m_balooFileMonitor; + #endif +diff --git a/lib/konq/CMakeLists.txt b/lib/konq/CMakeLists.txt +index 8ecbfa9..7381caf 100644 +--- a/lib/konq/CMakeLists.txt ++++ b/lib/konq/CMakeLists.txt +@@ -22,6 +22,7 @@ set(konq_LIB_SRCS + konq_historyprovider.cpp + kversioncontrolplugin.cpp # used by dolphin and its version control plugins (deprecated) + kversioncontrolplugin2.cpp # used by dolphin and its version control plugins ++ koverlayiconplugin.cpp + + konq_nameandurlinputdialog.cpp # deprecated (functionality has moved to kdelibs) + knewmenu.cpp # deprecated (functionality has moved to kdelibs) +@@ -67,8 +68,9 @@ install( FILES + konq_fileitemcapabilities.h + kversioncontrolplugin.h + kversioncontrolplugin2.h ++ koverlayiconplugin.h + konq_historyprovider.h + konq_historyentry.h + DESTINATION ${INCLUDE_INSTALL_DIR} COMPONENT Devel + ) +-install( FILES konqpopupmenuplugin.desktop konqdndpopupmenuplugin.desktop DESTINATION ${SERVICETYPES_INSTALL_DIR} ) ++install( FILES konqpopupmenuplugin.desktop konqdndpopupmenuplugin.desktop koverlayiconplugin.desktop DESTINATION ${SERVICETYPES_INSTALL_DIR} ) +diff --git a/lib/konq/koverlayiconplugin.cpp b/lib/konq/koverlayiconplugin.cpp +new file mode 100644 +index 0000000..6125040 +--- /dev/null ++++ b/lib/konq/koverlayiconplugin.cpp +@@ -0,0 +1,30 @@ ++/***************************************************************************** ++ * Copyright (C) 2014 by Olivier Goffart * ++ * * ++ * This library is free software; you can redistribute it and/or * ++ * modify it under the terms of the GNU Library General Public * ++ * License version 2 as published by the Free Software Foundation. * ++ * * ++ * This library 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 * ++ * Library General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU Library General Public License * ++ * along with this library; see the file COPYING.LIB. If not, write to * ++ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * ++ * Boston, MA 02110-1301, USA. * ++ *****************************************************************************/ ++ ++#include "koverlayiconplugin.h" ++#include ++ ++KOverlayIconPlugin::KOverlayIconPlugin(QObject* parent) : QObject(parent) ++{ ++} ++ ++KOverlayIconPlugin::~KOverlayIconPlugin() ++{ ++} ++ ++#include "koverlayiconplugin.moc" +diff --git a/lib/konq/koverlayiconplugin.desktop b/lib/konq/koverlayiconplugin.desktop +new file mode 100644 +index 0000000..65a1170 +--- /dev/null ++++ b/lib/konq/koverlayiconplugin.desktop +@@ -0,0 +1,4 @@ ++[Desktop Entry] ++Type=ServiceType ++X-KDE-ServiceType=KOverlayIconPlugin ++Comment=Plugin to add overlay icons in Dolphin +diff --git a/lib/konq/koverlayiconplugin.h b/lib/konq/koverlayiconplugin.h +new file mode 100644 +index 0000000..bcdf31b +--- /dev/null ++++ b/lib/konq/koverlayiconplugin.h +@@ -0,0 +1,57 @@ ++/***************************************************************************** ++ * Copyright (C) 2014 by Olivier Goffart * ++ * * ++ * This library is free software; you can redistribute it and/or * ++ * modify it under the terms of the GNU Library General Public * ++ * License version 2 as published by the Free Software Foundation. * ++ * * ++ * This library 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 * ++ * Library General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU Library General Public License * ++ * along with this library; see the file COPYING.LIB. If not, write to * ++ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * ++ * Boston, MA 02110-1301, USA. * ++ *****************************************************************************/ ++ ++ ++#ifndef OverlayIconPlugin_H ++#define OverlayIconPlugin_H ++ ++#include ++#include ++ ++class KUrl; ++class KFileItem; ++ ++/** ++ * @brief Base class for overlay icon plugins. ++ * ++ * Enables the file manager to show custom overlay icons on files. ++ * ++ * To write a custom plugin you need to create a .desktop file for your plugin with ++ * KDE-ServiceTypes=KOverlayIconPlugin ++ */ ++class LIBKONQ_EXPORT KOverlayIconPlugin : public QObject { ++ Q_OBJECT ++ void *d; ++public: ++ explicit KOverlayIconPlugin(QObject *parent = 0); ++ ~KOverlayIconPlugin(); ++ ++ /** ++ * Returns a list of overlay pixmap to add to a file ++ * This can be a path to an icon, or the icon name ++ */ ++ virtual QStringList getOverlays(const KFileItem &item) = 0; ++signals: ++ ++ /** ++ * Emit this signal when the list of overlay icon changed for a given URL ++ */ ++ void overlaysChanged(const KUrl &url, const QStringList &overlays); ++}; ++ ++#endif +-- +2.1.3 + diff --git a/shell_integration/dolphin/CMakeLists.txt b/shell_integration/dolphin/CMakeLists.txt new file mode 100644 index 000000000..0d70854ab --- /dev/null +++ b/shell_integration/dolphin/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 2.6) +project(dolphin-owncloud) +find_package(KDE4 REQUIRED) +include(KDE4Defaults) +include(MacroLibrary) +find_package(LibKonq REQUIRED) + +add_definitions (${QT_DEFINITIONS} ${KDE4_DEFINITIONS}) +add_definitions(-DQT_USE_FAST_CONCATENATION -DQT_USE_FAST_OPERATOR_PLUS) +include_directories (${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${KDE4_INCLUDES} ) +include_directories( ${KDE4_INCLUDE_DIR} ${QT_INCLUDES} ${LIBKONQ_INCLUDE_DIR} ) + +kde4_add_plugin(ownclouddolphinplugin ownclouddolphinplugin.cpp) + +target_link_libraries(ownclouddolphinplugin ${KDE4_KIO_LIBS} ${LIBKONQ_LIBRARY}) +install(FILES ownclouddolphinplugin.desktop DESTINATION ${SERVICES_INSTALL_DIR}) +install(TARGETS ownclouddolphinplugin DESTINATION ${PLUGIN_INSTALL_DIR}) diff --git a/shell_integration/dolphin/README b/shell_integration/dolphin/README new file mode 100644 index 000000000..715adcbbf --- /dev/null +++ b/shell_integration/dolphin/README @@ -0,0 +1,18 @@ + + +- The patch 0001-KOverlayIconPlugin.patch should be applied to kde-baseapps git repository +(It should applies to both KDE/4.14 or Applications/14.12 branches) + +- Recompile and install dolphin + +- Build and install the plugin + +- After installing, run + kdeinit4 --noincremental + +- To test taht the plugin is well installed + ktraderclient --servicetype KOverlayIconPlugin + It should show the Owncloud plugin + +- restart dolphin (make sure to kill all instances) + diff --git a/shell_integration/dolphin/ownclouddolphinplugin.cpp b/shell_integration/dolphin/ownclouddolphinplugin.cpp new file mode 100644 index 000000000..def66573d --- /dev/null +++ b/shell_integration/dolphin/ownclouddolphinplugin.cpp @@ -0,0 +1,131 @@ +/****************************************************************************** + * Copyright (C) 2014 by Olivier Goffart +#include +#include +#include +#include +#include + + +class OwncloudDolphinPlugin : public KOverlayIconPlugin +{ + Q_OBJECT + QLocalSocket m_socket; + typedef QHash StatusMap; + StatusMap m_status; + QByteArray m_line; + +public: + explicit OwncloudDolphinPlugin(QObject* parent, const QList&) : KOverlayIconPlugin(parent) { + connect(&m_socket, SIGNAL(readyRead()), this, SLOT(readyRead())); + tryConnect(); + } + + virtual QStringList getOverlays(const KFileItem& item) { + KUrl url = item.url(); + if (!url.isLocalFile()) + return QStringList(); + const QByteArray localFile = url.toLocalFile().toUtf8(); + kDebug() << localFile; + + tryConnect(); + if (m_socket.state() == QLocalSocket::ConnectingState) { + if (!m_socket.waitForConnected(100)) { + kWarning() << "not connected" << m_socket.errorString(); + } + } + if (m_socket.state() == QLocalSocket::ConnectedState) { + m_socket.write("RETRIEVE_FILE_STATUS:"); + m_socket.write(localFile); + m_socket.write("\n"); + } + + StatusMap::iterator it = m_status.find(localFile); + if (it != m_status.constEnd()) { + return overlaysForString(*it); + } + return QStringList(); + } + + + +private: + void tryConnect() { + if (m_socket.state() != QLocalSocket::UnconnectedState) + return; + QString runtimeDir = QFile::decodeName(qgetenv("XDG_RUNTIME_DIR")); + QString socketPath = runtimeDir + "/" + "ownCloud" + "/socket"; + m_socket.connectToServer(socketPath); + } + + QStringList overlaysForString(const QByteArray status) { + QStringList r; + if (status.startsWith("NOP")) + return r; + + if (status.startsWith("OK")) + r << "dialog-ok"; + if (status.startsWith("SYNC") || status.startsWith("NEW")) + r << "view-refresh"; + + if (status.contains("+SWM")) + r << "document-share"; + + kDebug() << status << r; + return r; + } + +private slots: + void readyRead() { + while (m_socket.bytesAvailable()) { + m_line += m_socket.readLine(); + if (!m_line.endsWith("\n")) + continue; + QByteArray line; + qSwap(line, m_line); + line.chop(1); + kDebug() << "got line " << line; + if (line.isEmpty()) + continue; + QList tokens = line.split(':'); + if (tokens.count() != 3) + continue; + if (tokens[0] != "STATUS" && tokens[0] != "BROADCAST") + continue; + if (tokens[2].isEmpty()) + continue; + + const QByteArray name = tokens[2]; + QByteArray &status = m_status[name]; // reference to the item in the hash + if (status == tokens[1]) + continue; + status = tokens[1]; + + emit this->overlaysChanged(KUrl::fromLocalFile(QString::fromUtf8(name)), overlaysForString(status)); + } + } +}; + +K_PLUGIN_FACTORY(OwncloudDolphinPluginFactory, registerPlugin();) +K_EXPORT_PLUGIN(OwncloudDolphinPluginFactory("ownclouddolhpinplugin")) + + +#include "ownclouddolphinplugin.moc" diff --git a/shell_integration/dolphin/ownclouddolphinplugin.desktop b/shell_integration/dolphin/ownclouddolphinplugin.desktop new file mode 100644 index 000000000..07fc63f33 --- /dev/null +++ b/shell_integration/dolphin/ownclouddolphinplugin.desktop @@ -0,0 +1,6 @@ +[Desktop Entry] +Type=Service +Name=Owncloud +X-KDE-ServiceTypes=KOverlayIconPlugin +MimeType=text/plain; +X-KDE-Library=ownclouddolphinplugin diff --git a/shell_integration/nautilus/syncstate.py b/shell_integration/nautilus/syncstate.py index 3d0cc0488..ca8b2b1f4 100755 --- a/shell_integration/nautilus/syncstate.py +++ b/shell_integration/nautilus/syncstate.py @@ -18,6 +18,19 @@ import socket from gi.repository import GObject, Nautilus + +def get_runtime_dir(): + """Returns the value of $XDG_RUNTIME_DIR, a directory path. + + If the value is not set, returns the same default as in Qt5 + """ + try: + return os.environ['XDG_RUNTIME_DIR'] + except KeyError: + fallback = '/tmp/runtime-' + os.environ['USER'] + return fallback + + class syncStateExtension(GObject.GObject, Nautilus.ColumnProvider, Nautilus.InfoProvider): nautilusVFSFile_table = {} @@ -38,21 +51,21 @@ class syncStateExtension(GObject.GObject, Nautilus.ColumnProvider, Nautilus.Info try: self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) postfix = "/"+self.appname+"/socket" - sock_file = os.environ["XDG_RUNTIME_DIR"]+postfix + sock_file = get_runtime_dir()+postfix print ("XXXX " + sock_file + " <=> " + postfix) if sock_file != postfix: - try: - print("Socket File: "+sock_file) - self.sock.connect(sock_file) - self.connected = True - print("Setting connected to %r" % self.connected ) - self.watch_id = GObject.io_add_watch(self.sock, GObject.IO_IN, self.handle_notify) - do_reconnect = False - except Exception, e: - print("Could not connect to unix socket." + str(e)) - else: - print("Sock-File not valid: "+sock_file) - except Exception, e: + try: + print("Socket File: "+sock_file) + self.sock.connect(sock_file) + self.connected = True + print("Setting connected to %r" % self.connected ) + self.watch_id = GObject.io_add_watch(self.sock, GObject.IO_IN, self.handle_notify) + do_reconnect = False + except Exception as e: + print("Could not connect to unix socket." + str(e)) + else: + print("Sock-File not valid: "+sock_file) + except Exception as e: print("Connect could not be established, try again later " + str(e)) self.sock.close() # print("Returning %r" % do_reconnect) @@ -75,7 +88,7 @@ class syncStateExtension(GObject.GObject, Nautilus.ColumnProvider, Nautilus.Info return None def askForOverlay(self, file): - # print("Asking for overlay for "+file) + # print("Asking for overlay for "+file) if os.path.isdir(file): folderStatus = self.sendCommand("RETRIEVE_FOLDER_STATUS:"+file+"\n"); @@ -85,15 +98,15 @@ class syncStateExtension(GObject.GObject, Nautilus.ColumnProvider, Nautilus.Info def invalidate_items_underneath(self, path): update_items = [] if not self.nautilusVFSFile_table: - self.askForOverlay(path) - else: - for p in self.nautilusVFSFile_table: - if p == path or p.startswith(path): - item = self.nautilusVFSFile_table[p]['item'] - update_items.append(item) + self.askForOverlay(path) + else: + for p in self.nautilusVFSFile_table: + if p == path or p.startswith(path): + item = self.nautilusVFSFile_table[p]['item'] + update_items.append(item) - for item in update_items: - item.invalidate_extension_info() + for item in update_items: + item.invalidate_extension_info() # Handles a single line of server respoonse and sets the emblem def handle_server_response(self, l): @@ -118,16 +131,16 @@ class syncStateExtension(GObject.GObject, Nautilus.ColumnProvider, Nautilus.Info # file = parts[1] # print "Action for " + file + ": "+parts[0] if action == 'STATUS': - newState = parts[1] + newState = parts[1] emblem = Emblems[newState] if emblem: itemStore = self.find_item_for_file(parts[2]) if itemStore: - if( not itemStore['state'] or newState != itemStore['state'] ): - item = itemStore['item'] - item.add_emblem(emblem) - # print "Setting emblem on " + parts[2]+ "<>"+emblem+"<>" - self.nautilusVFSFile_table[parts[2]] = {'item': item, 'state':newState} + if( not itemStore['state'] or newState != itemStore['state'] ): + item = itemStore['item'] + item.add_emblem(emblem) + # print "Setting emblem on " + parts[2]+ "<>"+emblem+"<>" + self.nautilusVFSFile_table[parts[2]] = {'item': item, 'state':newState} elif action == 'UPDATE_VIEW': # Search all items underneath this path and invalidate them diff --git a/shell_integration/windows/OCShellExtensions/OCUtilTest/OCUtilTest.cpp b/shell_integration/windows/OCShellExtensions/OCUtilTest/OCUtilTest.cpp deleted file mode 100644 index 179f8334a..000000000 --- a/shell_integration/windows/OCShellExtensions/OCUtilTest/OCUtilTest.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// ConsoleApplication1.cpp : Defines the entry point for the console application. -// - -#include "stdafx.h" - -#include -#include -#include - -#include "RemotePathChecker.h" -#include "StringUtil.h" - -using namespace std; - -int _tmain(int argc, _TCHAR* argv[]) -{ - RemotePathChecker checker(33001); - - vector paths; - - wstring test1(L"C:\\Users\\owncloud\\ownCloud\\wizard2.png"); - wstring test2(L"C:\\Users\\owncloud\\ownCloud\\wizard3.png"); - wstring test3(L"C:\\Users\\owncloud\\ownCloud\\HAMMANET.png"); - paths.push_back(test1); - paths.push_back(test2); - paths.push_back(test3); - -// wstring test3 = StringUtil::toUtf16(StringUtil::toUtf8(test1.c_str())); - - vector::iterator it; - for (it = paths.begin(); it != paths.end(); ++it) { - bool monitored = checker.IsMonitoredPath(it->c_str(), false); - wcout << *it << " " << monitored << " with value " << checker.GetPathType() << endl; - } - return 0; -} - diff --git a/shell_integration/windows/OCShellExtensions/OCUtilTest/OCUtilTest.filters b/shell_integration/windows/OCShellExtensions/OCUtilTest/OCUtilTest.filters deleted file mode 100644 index 2507d8e20..000000000 --- a/shell_integration/windows/OCShellExtensions/OCUtilTest/OCUtilTest.filters +++ /dev/null @@ -1,33 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Header Files - - - Header Files - - - - - Source Files - - - Source Files - - - \ No newline at end of file diff --git a/shell_integration/windows/OCShellExtensions/OCUtilTest/OCUtilTest.vcxproj b/shell_integration/windows/OCShellExtensions/OCUtilTest/OCUtilTest.vcxproj deleted file mode 100644 index e4c35a3b2..000000000 --- a/shell_integration/windows/OCShellExtensions/OCUtilTest/OCUtilTest.vcxproj +++ /dev/null @@ -1,97 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {A81E3DAE-8FE7-4BD0-82F9-939B2D59D033} - Win32Proj - OCUtilTest - OCUtilTest - - - - Application - true - v120 - Unicode - - - Application - false - v120 - true - Unicode - - - - - - - - - - - - - true - $(SolutionDir)$(Configuration)\$(Platform)\ - - - false - - - - Use - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) - true - ..\OCUtil - - - Console - true - ..\$(Configuration)\$(Platform); - OCUtil_x86.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - Use - MaxSpeed - true - true - WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) - true - - - Console - true - true - true - - - - - - - - - - Create - Create - - - - - - \ No newline at end of file diff --git a/shell_integration/windows/OCShellExtensions/OCUtilTest/ReadMe.txt b/shell_integration/windows/OCShellExtensions/OCUtilTest/ReadMe.txt deleted file mode 100644 index 4cb8a2f4b..000000000 --- a/shell_integration/windows/OCShellExtensions/OCUtilTest/ReadMe.txt +++ /dev/null @@ -1,40 +0,0 @@ -======================================================================== - CONSOLE APPLICATION : ConsoleApplication1 Project Overview -======================================================================== - -AppWizard has created this ConsoleApplication1 application for you. - -This file contains a summary of what you will find in each of the files that -make up your ConsoleApplication1 application. - - -ConsoleApplication1.vcxproj - This is the main project file for VC++ projects generated using an Application Wizard. - It contains information about the version of Visual C++ that generated the file, and - information about the platforms, configurations, and project features selected with the - Application Wizard. - -ConsoleApplication1.vcxproj.filters - This is the filters file for VC++ projects generated using an Application Wizard. - It contains information about the association between the files in your project - and the filters. This association is used in the IDE to show grouping of files with - similar extensions under a specific node (for e.g. ".cpp" files are associated with the - "Source Files" filter). - -ConsoleApplication1.cpp - This is the main application source file. - -///////////////////////////////////////////////////////////////////////////// -Other standard files: - -StdAfx.h, StdAfx.cpp - These files are used to build a precompiled header (PCH) file - named ConsoleApplication1.pch and a precompiled types file named StdAfx.obj. - -///////////////////////////////////////////////////////////////////////////// -Other notes: - -AppWizard uses "TODO:" comments to indicate parts of the source code you -should add to or customize. - -///////////////////////////////////////////////////////////////////////////// diff --git a/shell_integration/windows/OCShellExtensions/OCUtilTest/stdafx.cpp b/shell_integration/windows/OCShellExtensions/OCUtilTest/stdafx.cpp deleted file mode 100644 index f1d63e0b4..000000000 --- a/shell_integration/windows/OCShellExtensions/OCUtilTest/stdafx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// ConsoleApplication1.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file diff --git a/shell_integration/windows/OCShellExtensions/OCUtilTest/stdafx.h b/shell_integration/windows/OCShellExtensions/OCUtilTest/stdafx.h deleted file mode 100644 index b005a839d..000000000 --- a/shell_integration/windows/OCShellExtensions/OCUtilTest/stdafx.h +++ /dev/null @@ -1,15 +0,0 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#pragma once - -#include "targetver.h" - -#include -#include - - - -// TODO: reference additional headers your program requires here diff --git a/shell_integration/windows/OCShellExtensions/OCUtilTest/targetver.h b/shell_integration/windows/OCShellExtensions/OCUtilTest/targetver.h deleted file mode 100644 index 87c0086de..000000000 --- a/shell_integration/windows/OCShellExtensions/OCUtilTest/targetver.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -// Including SDKDDKVer.h defines the highest available Windows platform. - -// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and -// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. - -#include diff --git a/src/gui/folder.cpp b/src/gui/folder.cpp index ca0c696f0..b86334dd9 100644 --- a/src/gui/folder.cpp +++ b/src/gui/folder.cpp @@ -540,6 +540,37 @@ int Folder::slotWipeBlacklist() return _journal.wipeBlacklist(); } +void Folder::slotWatchedPathChanged(const QString& path) +{ + // When no sync is running or it's in the prepare phase, we can + // always schedule a new sync. + if (! _engine || _syncResult.status() == SyncResult::SyncPrepare) { + emit scheduleToSync(alias()); + return; + } + + // The folder watcher fires a lot of bogus notifications during + // a sync operation, both for actual user files and the database + // and log. Therefore we check notifications against operations + // the sync is doing to filter out our own changes. + bool ownChange = false; +#ifdef Q_OS_MAC + // On OSX the folder watcher does not report changes done by our + // own process. Therefore nothing needs to be done here! +#else + // Use the path to figure out whether it was our own change + const auto maxNotificationDelay = 15*1000; + qint64 time = _engine->timeSinceFileTouched(path); + if (time != -1 && time < maxNotificationDelay) { + ownChange = true; + } +#endif + + if (! ownChange) { + emit scheduleToSync(alias()); + } +} + void Folder::setConfigFile( const QString& file ) { _configFile = file; diff --git a/src/gui/folder.h b/src/gui/folder.h index 51f7b005c..6d255031c 100644 --- a/src/gui/folder.h +++ b/src/gui/folder.h @@ -154,6 +154,13 @@ public slots: int slotWipeBlacklist(); int blackListEntryCount(); + /** + * Triggered by the folder watcher when a file/dir in this folder + * changes. Needs to check whether this change should trigger a new + * sync run to be scheduled. + */ + void slotWatchedPathChanged(const QString& path); + private slots: void slotSyncStarted(); void slotSyncError(const QString& ); diff --git a/src/gui/folderman.cpp b/src/gui/folderman.cpp index f2dce11c8..def2dfc0b 100644 --- a/src/gui/folderman.cpp +++ b/src/gui/folderman.cpp @@ -55,10 +55,6 @@ FolderMan::FolderMan(QObject *parent) : connect(_folderChangeSignalMapper, SIGNAL(mapped(const QString &)), this, SIGNAL(folderSyncStateChange(const QString &))); - _folderWatcherSignalMapper = new QSignalMapper(this); - connect(_folderWatcherSignalMapper, SIGNAL(mapped(const QString&)), - this, SLOT(slotScheduleSync(const QString&))); - ne_sock_init(); Q_ASSERT(!_instance); _instance = this; @@ -100,8 +96,6 @@ void FolderMan::unloadFolder( const QString& alias ) _folderChangeSignalMapper->removeMappings(f); if( _folderWatchers.contains(alias)) { - FolderWatcher *fw = _folderWatchers[alias]; - _folderWatcherSignalMapper->removeMappings(fw); _folderWatchers.remove(alias); } _folderMap.remove( alias ); @@ -135,20 +129,19 @@ void FolderMan::registerFolderMonitor( Folder *folder ) if( !folder ) return; if( !_folderWatchers.contains(folder->alias() ) ) { - FolderWatcher *fw = new FolderWatcher(folder->path(), this); + FolderWatcher *fw = new FolderWatcher(folder->path(), folder); ConfigFile cfg; fw->addIgnoreListFile( cfg.excludeFile(ConfigFile::SystemScope) ); fw->addIgnoreListFile( cfg.excludeFile(ConfigFile::UserScope) ); - // Connect the folderChanged signal, which comes with the changed path, + // Connect the pathChanged signal, which comes with the changed path, // to the signal mapper which maps to the folder alias. The changed path // is lost this way, but we do not need it for the current implementation. - connect(fw, SIGNAL(folderChanged(QString)), _folderWatcherSignalMapper, SLOT(map())); - _folderWatcherSignalMapper->setMapping(fw, folder->alias()); + connect(fw, SIGNAL(pathChanged(QString)), folder, SLOT(slotWatchedPathChanged(QString))); _folderWatchers.insert(folder->alias(), fw); // This is at the moment only for the behaviour of the SocketApi. - connect(fw, SIGNAL(folderChanged(QString)), folder, SLOT(watcherSlot(QString))); + connect(fw, SIGNAL(pathChanged(QString)), folder, SLOT(watcherSlot(QString))); } // register the folder with the socket API @@ -444,17 +437,6 @@ void FolderMan::slotScheduleSync( const QString& alias ) return; } - // The folder watcher fires a lot of bogus notifications during - // a sync operation, both for actual user files and the database - // and log. Never enqueue a folder for sync while it is syncing. - // We lose some genuine sync requests that way, but that can't be - // helped. - // ^^ FIXME: Note that this is not the case on OS X - if( _currentSyncFolder == alias ) { - qDebug() << "folder " << alias << " is currently syncing. NOT scheduling."; - return; - } - if( _socketApi ) { // We want the SocketAPI to already now update so that it can show the EVAL icon // for files/folders. Only do this when not syncing, else we might get a lot diff --git a/src/gui/folderman.h b/src/gui/folderman.h index 74646b3de..21fabfee0 100644 --- a/src/gui/folderman.h +++ b/src/gui/folderman.h @@ -150,7 +150,6 @@ private: Folder::Map _folderMap; QString _folderConfigPath; QSignalMapper *_folderChangeSignalMapper; - QSignalMapper *_folderWatcherSignalMapper; QString _currentSyncFolder; bool _syncEnabled; QMap _folderWatchers; diff --git a/src/gui/folderwatcher.cpp b/src/gui/folderwatcher.cpp index 486d0589e..d01566363 100644 --- a/src/gui/folderwatcher.cpp +++ b/src/gui/folderwatcher.cpp @@ -130,7 +130,7 @@ void FolderWatcher::changeDetected( const QStringList& paths ) _lastPaths = pathsSet; _timer.restart(); - QSet changedFolders; + QSet changedPaths; // ------- handle ignores: for (int i = 0; i < paths.size(); ++i) { @@ -139,20 +139,15 @@ void FolderWatcher::changeDetected( const QStringList& paths ) continue; } - QFileInfo fi(path); - if (fi.isDir()) { - changedFolders.insert(path); - } else { - changedFolders.insert(fi.dir().path()); - } + changedPaths.insert(path); } - if (changedFolders.isEmpty()) { + if (changedPaths.isEmpty()) { return; } - qDebug() << "detected changes in folders:" << changedFolders; - foreach (const QString &path, changedFolders) { - emit folderChanged(path); + qDebug() << "detected changes in paths:" << changedPaths; + foreach (const QString &path, changedPaths) { + emit pathChanged(path); } } diff --git a/src/gui/folderwatcher.h b/src/gui/folderwatcher.h index e4945ea70..27b131886 100644 --- a/src/gui/folderwatcher.h +++ b/src/gui/folderwatcher.h @@ -34,7 +34,7 @@ class FolderWatcherPrivate; /* * Folder Watcher monitors a directory and its sub directories * for changes in the local file system. Changes are signalled - * through the folderChanged() signal. + * through the pathChanged() signal. * * Note that if new folders are created, this folderwatcher class * does not automatically adds them to the list of monitored @@ -74,8 +74,9 @@ public: bool pathIsIgnored( const QString& path ); signals: - /** Emitted when one of the paths is changed */ - void folderChanged(const QString &path); + /** Emitted when one of the watched directories or one + * of the contained files is changed. */ + void pathChanged(const QString &path); /** Emitted if an error occurs */ void error(const QString& error); diff --git a/src/gui/folderwatcher_linux.cpp b/src/gui/folderwatcher_linux.cpp index 0bb0e18cf..e8f280b34 100644 --- a/src/gui/folderwatcher_linux.cpp +++ b/src/gui/folderwatcher_linux.cpp @@ -159,23 +159,22 @@ void FolderWatcherPrivate::slotReceivedNotification(int fd) while(i + sizeof(struct inotify_event) < static_cast(len)) { // cast an inotify_event event = (struct inotify_event*)&buffer[i]; - // with the help of watch descriptor, retrieve, corresponding INotify if (event == NULL) { qDebug() << "NULL event"; i += sizeof(struct inotify_event); continue; } - // fire event - // Note: The name of the changed file and stuff could be taken from - // the event data structure. That does not happen yet. + // Fire event for the path that was changed. if (event->len > 0 && event->wd > -1) { + QByteArray fileName(event->name); // qDebug() << Q_FUNC_INFO << event->name; - if (QByteArray(event->name).startsWith(".csync") || - QByteArray(event->name).startsWith(".owncloudsync.log")) { + if (fileName.startsWith(".csync_journal.db") || + fileName.startsWith(".owncloudsync.log")) { // qDebug() << "ignore journal"; } else { - const QString p = _watches[event->wd]; + const QString p = _watches[event->wd] + '/' + fileName; + //qDebug() << "found a change in " << p; _parent->changeDetected(p); } } diff --git a/src/gui/folderwatcher_win.cpp b/src/gui/folderwatcher_win.cpp index 1e0bf2884..29b7f5d25 100644 --- a/src/gui/folderwatcher_win.cpp +++ b/src/gui/folderwatcher_win.cpp @@ -13,6 +13,7 @@ #include #include +#include #include "folderwatcher.h" #include "folderwatcher_win.h" @@ -23,52 +24,123 @@ namespace OCC { -void WatcherThread::run() +void WatcherThread::watchChanges(size_t fileNotifyBufferSize, + bool* increaseBufferSize) { - _handle = FindFirstChangeNotification((wchar_t*)_path.utf16(), - true, // recursive watch - FILE_NOTIFY_CHANGE_FILE_NAME | - FILE_NOTIFY_CHANGE_DIR_NAME | - FILE_NOTIFY_CHANGE_LAST_WRITE); + *increaseBufferSize = false; + + _handle = CreateFileW( + (wchar_t*)_path.utf16(), + FILE_LIST_DIRECTORY, + FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, + NULL + ); if (_handle == INVALID_HANDLE_VALUE) { - qDebug() << Q_FUNC_INFO << "FindFirstChangeNotification function failed, stopping watcher!"; - FindCloseChangeNotification(_handle); + DWORD errorCode = GetLastError(); + qDebug() << Q_FUNC_INFO << "Failed to create handle for" << _path << ", error:" << errorCode; _handle = 0; return; } - if (_handle == NULL) - { - qDebug() << Q_FUNC_INFO << "FindFirstChangeNotification returned null, stopping watcher!"; - FindCloseChangeNotification(_handle); - _handle = 0; - return; - } + // QVarLengthArray ensures the stack-buffer is aligned like double and qint64. + QVarLengthArray fileNotifyBuffer; + fileNotifyBuffer.resize(fileNotifyBufferSize); - while(true) { - switch(WaitForSingleObject(_handle, /*wait*/ INFINITE)) { - case WAIT_OBJECT_0: - if (FindNextChangeNotification(_handle) == false) { - qDebug() << Q_FUNC_INFO << "FindFirstChangeNotification returned FALSE, stopping watcher!"; - FindCloseChangeNotification(_handle); - _handle = 0; - return; + const size_t fileNameBufferSize = 4096; + TCHAR fileNameBuffer[fileNameBufferSize]; + + forever { + FILE_NOTIFY_INFORMATION *pFileNotifyBuffer = + (FILE_NOTIFY_INFORMATION*)fileNotifyBuffer.data(); + DWORD dwBytesReturned = 0; + SecureZeroMemory(pFileNotifyBuffer, fileNotifyBufferSize); + if(ReadDirectoryChangesW( _handle, (LPVOID)pFileNotifyBuffer, + fileNotifyBufferSize, true, + FILE_NOTIFY_CHANGE_FILE_NAME | + FILE_NOTIFY_CHANGE_DIR_NAME | + FILE_NOTIFY_CHANGE_LAST_WRITE, + &dwBytesReturned, NULL, NULL)) + { + FILE_NOTIFY_INFORMATION *curEntry = pFileNotifyBuffer; + forever { + size_t len = curEntry->FileNameLength / 2; + QString file = _path + "\\" + QString::fromWCharArray(curEntry->FileName, len); + + // Unless the file was removed or renamed, get its full long name + // TODO: We could still try expanding the path in the tricky cases... + QString longfile = file; + if (curEntry->Action != FILE_ACTION_REMOVED + && curEntry->Action != FILE_ACTION_RENAMED_OLD_NAME) { + size_t longNameSize = GetLongPathNameW(reinterpret_cast(file.utf16()), fileNameBuffer, fileNameBufferSize); + if (longNameSize > 0) { + longfile = QString::fromUtf16(reinterpret_cast(fileNameBuffer), longNameSize); + } else { + qDebug() << Q_FUNC_INFO << "Error converting file name to full length, keeping original name."; + } + } + longfile = QDir::cleanPath(longfile); + + qDebug() << Q_FUNC_INFO << "Found change in" << longfile << "action:" << curEntry->Action; + emit changed(longfile); + + if (curEntry->NextEntryOffset == 0) { + break; + } + curEntry = (FILE_NOTIFY_INFORMATION*)( + (char*)curEntry + curEntry->NextEntryOffset); } - // qDebug() << Q_FUNC_INFO << "Change detected in" << _path << "from" << QThread::currentThread (); - emit changed(_path); - break; - default: - qDebug() << Q_FUNC_INFO << "Error while watching"; + } else { + DWORD errorCode = GetLastError(); + switch(errorCode) { + case ERROR_NOTIFY_ENUM_DIR: + qDebug() << Q_FUNC_INFO << "The buffer for changes overflowed! Triggering a generic change and resizing"; + emit changed(_path); + *increaseBufferSize = true; + break; + default: + qDebug() << Q_FUNC_INFO << "General error" << errorCode << "while watching. Exiting."; + break; + } + CloseHandle(_handle); + _handle = NULL; + return; + } + } +} + +void WatcherThread::run() +{ + // If this buffer fills up before we've extracted its data we will lose + // change information. Therefore start big. + size_t bufferSize = 4096*10; + size_t maxBuffer = 64*1024; + + forever { + bool increaseBufferSize = false; + watchChanges(bufferSize, &increaseBufferSize); + + if (increaseBufferSize) { + bufferSize = qMin(bufferSize*2, maxBuffer); + } else { + // Other errors shouldn't actually happen, + // so sleep a bit to avoid running into the same error case in a + // tight loop. + sleep(2); } } } WatcherThread::~WatcherThread() { - if (_handle) - FindCloseChangeNotification(_handle); + if (_handle) { + CloseHandle(_handle); + _handle = NULL; + } } FolderWatcherPrivate::FolderWatcherPrivate(FolderWatcher *p, const QString& path) diff --git a/src/gui/folderwatcher_win.h b/src/gui/folderwatcher_win.h index 7dff7541b..08c766076 100644 --- a/src/gui/folderwatcher_win.h +++ b/src/gui/folderwatcher_win.h @@ -33,6 +33,8 @@ public: protected: void run(); + void watchChanges(size_t fileNotifyBufferSize, + bool* increaseBufferSize); signals: void changed(const QString &path); diff --git a/src/gui/owncloudgui.cpp b/src/gui/owncloudgui.cpp index 25a9f057c..cd6527caa 100644 --- a/src/gui/owncloudgui.cpp +++ b/src/gui/owncloudgui.cpp @@ -278,11 +278,6 @@ void ownCloudGui::slotComputeOverallSyncStatus() QIcon icon = Theme::instance()->syncStateIcon(SyncResult::Problem); _tray->setIcon( icon ); _tray->setToolTip(tr("There are no sync folders configured.")); -#if !defined Q_OS_MAC - if( _settingsDialog ) { - _settingsDialog->slotUpdateAccountIcon(icon); - } -#endif } } } diff --git a/src/gui/settingsdialog.cpp b/src/gui/settingsdialog.cpp index d83bbd48d..99f3614d3 100644 --- a/src/gui/settingsdialog.cpp +++ b/src/gui/settingsdialog.cpp @@ -26,26 +26,37 @@ #include #include +#include #include #include #include +#include +#include + +namespace { + const char TOOLBAR_CSS[] = + "QToolBar { background: white; margin: 0; padding: 0; border: none; border-bottom: 1px solid grey; spacing: 0; } " + "QToolBar QToolButton { background: white; border: none; border-bottom: 1px solid grey; margin: 0; padding: 0; } " + "QToolBar QToolButton:checked { background: %1; color: %2; }"; +} namespace OCC { -QIcon createDummy() { - QIcon icon; - QPixmap p(32,32); - p.fill(Qt::transparent); - icon.addPixmap(p); - return icon; -} - SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent) : - QDialog(parent), - _ui(new Ui::SettingsDialog) + QDialog(parent) + , _ui(new Ui::SettingsDialog) + , _accountSettings(new AccountSettings) + { setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); _ui->setupUi(this); + QToolBar *toolBar = new QToolBar; + toolBar->setIconSize(QSize(32,32)); + QString highlightColor(palette().highlight().color().name()); + QString altBase(palette().alternateBase().color().name()); + toolBar->setStyleSheet(QString::fromAscii(TOOLBAR_CSS).arg(highlightColor).arg(altBase)); + toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); + layout()->setMenuBar(toolBar); // People perceive this as a Window, so also make Ctrl+W work QAction *closeWindowAction = new QAction(this); @@ -55,32 +66,44 @@ SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent) : setObjectName("Settings"); // required as group for saveGeometry call - setWindowTitle(tr("%1").arg(Theme::instance()->appNameGUI())); + setWindowTitle(Theme::instance()->appNameGUI()); - _accountSettings = new AccountSettings(this); - addAccount(tr("Account"), _accountSettings); + QIcon accountIcon(QLatin1String(":/mirall/resources/accounts.png")); + QAction *accountAction = toolBar->addAction(accountIcon, tr("Account")); + accountAction->setCheckable(true); + _ui->stack->addWidget(_accountSettings); QIcon protocolIcon(QLatin1String(":/mirall/resources/activity.png")); - QListWidgetItem *protocol= new QListWidgetItem(protocolIcon, tr("Activity"), _ui->labelWidget); - protocol->setSizeHint(QSize(0, 32)); - _ui->labelWidget->addItem(protocol); - _protocolWidget = new ProtocolWidget; - _protocolIdx = _ui->stack->addWidget(_protocolWidget); + _protocolAction = toolBar->addAction(protocolIcon, tr("Activity")); + _protocolAction->setCheckable(true); + ProtocolWidget *protocolWidget = new ProtocolWidget; + _ui->stack->addWidget(protocolWidget); QIcon generalIcon(QLatin1String(":/mirall/resources/settings.png")); - QListWidgetItem *general = new QListWidgetItem(generalIcon, tr("General"), _ui->labelWidget); - general->setSizeHint(QSize(0, 32)); - _ui->labelWidget->addItem(general); + QAction *generalAction = toolBar->addAction(generalIcon, tr("General")); + generalAction->setCheckable(true); GeneralSettings *generalSettings = new GeneralSettings; _ui->stack->addWidget(generalSettings); QIcon networkIcon(QLatin1String(":/mirall/resources/network.png")); - QListWidgetItem *network = new QListWidgetItem(networkIcon, tr("Network"), _ui->labelWidget); - network->setSizeHint(QSize(0, 32)); - _ui->labelWidget->addItem(network); + QAction *networkAction = toolBar->addAction(networkIcon, tr("Network")); + networkAction->setCheckable(true); NetworkSettings *networkSettings = new NetworkSettings; _ui->stack->addWidget(networkSettings); + _actions.insert(accountAction, _accountSettings); + _actions.insert(_protocolAction, protocolWidget); + _actions.insert(generalAction, generalSettings); + _actions.insert(networkAction, networkSettings); + + QActionGroup *group = new QActionGroup(this); + group->addAction(accountAction); + group->addAction(_protocolAction); + group->addAction(generalAction); + group->addAction(networkAction); + group->setExclusive(true); + connect(group, SIGNAL(triggered(QAction*)), SLOT(slotSwitchPage(QAction*))); + connect( _accountSettings, SIGNAL(folderChanged()), gui, SLOT(slotFoldersChanged())); connect( _accountSettings, SIGNAL(accountIconChanged(QIcon)), SLOT(slotUpdateAccountIcon(QIcon))); connect( _accountSettings, SIGNAL(openFolderAlias(const QString&)), @@ -89,10 +112,9 @@ SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent) : connect( ProgressDispatcher::instance(), SIGNAL(progressInfo(QString, Progress::Info)), _accountSettings, SLOT(slotSetProgress(QString, Progress::Info)) ); - _ui->labelWidget->setCurrentRow(_ui->labelWidget->row(_accountItem)); - connect(_ui->labelWidget, SIGNAL(currentRowChanged(int)), - _ui->stack, SLOT(setCurrentIndex(int))); + // default to Account + accountAction->setChecked(true); QPushButton *closeButton = _ui->buttonBox->button(QDialogButtonBox::Close); connect(closeButton, SIGNAL(clicked()), SLOT(accept())); @@ -102,23 +124,6 @@ SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent) : connect(showLogWindow, SIGNAL(triggered()), gui, SLOT(slotToggleLogBrowser())); addAction(showLogWindow); - int iconSize = 32; - QListWidget *listWidget = _ui->labelWidget; - int spacing = 20; - // reverse at least ~8 characters - int effectiveWidth = fontMetrics().averageCharWidth() * 8 + iconSize + spacing; - // less than ~16 characters, elide otherwise - int maxWidth = fontMetrics().averageCharWidth() * 16 + iconSize + spacing; - for (int i = 0; i < listWidget->count(); i++) { - QListWidgetItem *item = listWidget->item(i); - QFontMetrics fm(item->font()); - int curWidth = fm.width(item->text()) + iconSize + spacing; - effectiveWidth = qMax(curWidth, effectiveWidth); - if (curWidth > maxWidth) item->setToolTip(item->text()); - } - effectiveWidth = qMin(effectiveWidth, maxWidth); - listWidget->setFixedWidth(effectiveWidth); - ConfigFile cfg; cfg.restoreGeometry(this); } @@ -128,20 +133,9 @@ SettingsDialog::~SettingsDialog() delete _ui; } -void SettingsDialog::addAccount(const QString &title, QWidget *widget) -{ - _accountItem = new QListWidgetItem(title); - _accountItem->setSizeHint(QSize(0, 32)); - _ui->labelWidget->addItem(_accountItem); - _ui->stack->addWidget(widget); - _accountSettings->slotSyncStateChange(); -} - void SettingsDialog::setGeneralErrors(const QStringList &errors) { - if( _accountSettings ) { - _accountSettings->setGeneralErrors(errors); - } + _accountSettings->setGeneralErrors(errors); } // close event is not being called here @@ -157,14 +151,16 @@ void SettingsDialog::accept() { QDialog::accept(); } -void SettingsDialog::slotUpdateAccountIcon(const QIcon &icon) +void SettingsDialog::slotSwitchPage(QAction *action) { - _accountItem->setIcon(icon); + _ui->stack->setCurrentWidget(_actions.value(action)); } void SettingsDialog::showActivityPage() { - _ui->labelWidget->setCurrentRow(_protocolIdx); + if (_protocolAction) { + slotSwitchPage(_protocolAction); + } } diff --git a/src/gui/settingsdialog.cpp.Rbt431 b/src/gui/settingsdialog.cpp.Rbt431 new file mode 100644 index 000000000..e69de29bb diff --git a/src/gui/settingsdialog.h b/src/gui/settingsdialog.h index a9d898cbf..002e4a204 100644 --- a/src/gui/settingsdialog.h +++ b/src/gui/settingsdialog.h @@ -19,8 +19,8 @@ #include "progressdispatcher.h" +class QAction; class QStandardItemModel; -class QListWidgetItem; namespace OCC { @@ -28,7 +28,6 @@ namespace Ui { class SettingsDialog; } class AccountSettings; -class ProtocolWidget; class Application; class FolderMan; class ownCloudGui; @@ -46,7 +45,7 @@ public: public slots: void showActivityPage(); - void slotUpdateAccountIcon(const QIcon& icon); + void slotSwitchPage(QAction *action); protected: void reject() Q_DECL_OVERRIDE; @@ -55,12 +54,10 @@ protected: private slots: private: - Ui::SettingsDialog *_ui; - AccountSettings *_accountSettings; - QListWidgetItem *_accountItem; - ProtocolWidget *_protocolWidget; - - int _protocolIdx; + Ui::SettingsDialog * const _ui; + QHash _actions; + AccountSettings * const _accountSettings; + QAction * _protocolAction; }; } diff --git a/src/gui/settingsdialog.ui b/src/gui/settingsdialog.ui index 4acc77fb2..cdabf661f 100644 --- a/src/gui/settingsdialog.ui +++ b/src/gui/settingsdialog.ui @@ -14,26 +14,22 @@ Settings - + + 0 + + + 0 + + + 0 + + 0 0 - - - - - 0 - 0 - - - - - - - - + @@ -55,6 +51,9 @@ + + + diff --git a/src/gui/settingsdialogmac.cpp b/src/gui/settingsdialogmac.cpp index cbc6e7584..bb455bbae 100644 --- a/src/gui/settingsdialogmac.cpp +++ b/src/gui/settingsdialogmac.cpp @@ -63,8 +63,8 @@ SettingsDialogMac::SettingsDialogMac(ownCloudGui *gui, QWidget *parent) setWindowTitle(tr("%1").arg(Theme::instance()->appNameGUI())); _accountSettings = new AccountSettings; - QIcon icon = Theme::instance()->syncStateIcon(SyncResult::Undefined, true); - _accountIdx = addPreferencesPanel(icon, tr("Account"), _accountSettings); + QIcon accountIcon = (QLatin1String(":/mirall/resources/accounts.png")); + addPreferencesPanel(accountIcon, tr("Account"), _accountSettings); QIcon protocolIcon(QLatin1String(":/mirall/resources/activity.png")); _protocolWidget = new ProtocolWidget; @@ -97,9 +97,6 @@ SettingsDialogMac::SettingsDialogMac(ownCloudGui *gui, QWidget *parent) void SettingsDialogMac::slotSyncStateChange(const QString& alias) { FolderMan *folderMan = FolderMan::instance(); - SyncResult state = folderMan->accountStatus(folderMan->map().values()); - QIcon accountIcon = Theme::instance()->syncStateIcon(state.status()); - setPreferencesPanelIcon(_accountIdx, accountIcon); Folder *folder = folderMan->folder(alias); if( folder ) { @@ -109,9 +106,7 @@ void SettingsDialogMac::slotSyncStateChange(const QString& alias) void SettingsDialogMac::setGeneralErrors(const QStringList &errors) { - if( _accountSettings ) { - _accountSettings->setGeneralErrors(errors); - } + _accountSettings->setGeneralErrors(errors); } void SettingsDialogMac::closeEvent(QCloseEvent *event) diff --git a/src/gui/settingsdialogmac.h b/src/gui/settingsdialogmac.h index 90681628b..c4876e153 100644 --- a/src/gui/settingsdialogmac.h +++ b/src/gui/settingsdialogmac.h @@ -49,7 +49,6 @@ private: QListWidgetItem *_accountItem; ProtocolWidget *_protocolWidget; - int _accountIdx; int _protocolIdx; }; diff --git a/src/gui/socketapi.cpp b/src/gui/socketapi.cpp index 1cbf6a624..aba0a29e8 100644 --- a/src/gui/socketapi.cpp +++ b/src/gui/socketapi.cpp @@ -94,6 +94,11 @@ SocketApi::SocketApi(QObject* parent) runtimeDir = QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation); #else runtimeDir = QFile::decodeName(qgetenv("XDG_RUNTIME_DIR")); + if (runtimeDir.isEmpty()) { + runtimeDir = QDir::tempPath() + QLatin1String("/runtime-") + + QString::fromLocal8Bit(qgetenv("USER")); + QDir().mkdir(runtimeDir); + } #endif socketPath = runtimeDir + "/" + Theme::instance()->appName() + "/socket"; } else { diff --git a/src/gui/wizard/owncloudsetuppage.cpp b/src/gui/wizard/owncloudsetuppage.cpp index c6f5d84bf..5eddacf7d 100644 --- a/src/gui/wizard/owncloudsetuppage.cpp +++ b/src/gui/wizard/owncloudsetuppage.cpp @@ -224,7 +224,7 @@ void OwncloudSetupPage::setErrorString( const QString& err ) _ui.errorLabel->setVisible(false); } else { if (_ui.leUrl->text().startsWith("https://")) { - QString msg = tr("Could not connect securely. Do you want to connect unencrypted instead (not recommended)?").arg(err); + QString msg = tr("Could not connect securely:\n\n%1\n\nDo you want to connect unencrypted instead (not recommended)?").arg(err); QString title = tr("Connection failed"); if (QMessageBox::question(this, title, msg, QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) { QUrl url(_ui.leUrl->text()); diff --git a/src/libsync/CMakeLists.txt b/src/libsync/CMakeLists.txt index b9840c017..47d83b926 100644 --- a/src/libsync/CMakeLists.txt +++ b/src/libsync/CMakeLists.txt @@ -33,7 +33,6 @@ endif() set(libsync_SRCS account.cpp - authenticationdialog.cpp bandwidthmanager.cpp clientproxy.cpp connectionvalidator.cpp @@ -53,6 +52,7 @@ set(libsync_SRCS propagateupload.cpp propagateremotedelete.cpp propagateremotemove.cpp + propagateremotemkdir.cpp quotainfo.cpp syncengine.cpp syncfilestatus.cpp @@ -82,6 +82,7 @@ else() creds/shibboleth/shibbolethwebview.cpp creds/shibboleth/shibbolethrefresher.cpp creds/shibboleth/shibbolethuserjob.cpp + authenticationdialog.cpp ) endif() diff --git a/src/libsync/accessmanager.cpp b/src/libsync/accessmanager.cpp index c8a21faba..2b9fc77f1 100644 --- a/src/libsync/accessmanager.cpp +++ b/src/libsync/accessmanager.cpp @@ -19,7 +19,10 @@ #include #include +#ifndef TOKEN_AUTH_ONLY #include "authenticationdialog.h" +#endif + #include "cookiejar.h" #include "accessmanager.h" #include "utility.h" @@ -87,6 +90,7 @@ void AccessManager::slotProxyAuthenticationRequired(const QNetworkProxy &proxy, } void AccessManager::slotAuthenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator) { +#ifndef TOKEN_AUTH_ONLY // do not handle 401 created by the networkjobs. We may want // to eventually exempt some, but for now we need // it only for other things, e.g. the browser. Would we handle @@ -106,6 +110,10 @@ void AccessManager::slotAuthenticationRequired(QNetworkReply *reply, QAuthentica authenticator->setUser(dialog.user()); authenticator->setPassword(dialog.password()); } +#else + Q_UNUSED(reply) Q_UNUSED(authenticator) + Q_ASSERT(!"MirallAccessManager::slotAuthenticationRequired called"); +#endif } } // namespace OCC diff --git a/src/libsync/configfile.cpp b/src/libsync/configfile.cpp index 23df4db76..3b4f96a66 100644 --- a/src/libsync/configfile.cpp +++ b/src/libsync/configfile.cpp @@ -365,7 +365,8 @@ quint64 ConfigFile::forceSyncInterval(const QString& connection) const QSettings settings(configFile(), QSettings::IniFormat); settings.beginGroup( con ); - quint64 interval = settings.value( QLatin1String(forceSyncIntervalC), 10 * pollInterval ).toULongLong(); + quint64 defaultInterval = 2 * 60 * 60 * 1000ull; // 2h + quint64 interval = settings.value( QLatin1String(forceSyncIntervalC), defaultInterval ).toULongLong(); if( interval < pollInterval) { qDebug() << "Force sync interval is less than the remote poll inteval, reverting to" << pollInterval; interval = pollInterval; diff --git a/src/libsync/cookiejar.cpp b/src/libsync/cookiejar.cpp index 865ea0844..cf0ff5c56 100644 --- a/src/libsync/cookiejar.cpp +++ b/src/libsync/cookiejar.cpp @@ -91,27 +91,11 @@ QList CookieJar::cookiesForUrl(const QUrl &url) const return cookies; } -bool CookieJar::deleteCookie(const QNetworkCookie &delCookie) -{ - QList cookies = allCookies(); - bool removeSucceeded = false; - foreach(const QNetworkCookie &cookie, cookies) { - // ### cookies are not identical in attriutes, why? - if (cookie.name() == delCookie.name()) { - cookies.removeOne(cookie); - removeSucceeded = true; - } - } - setAllCookies(cookies); - return removeSucceeded; -} - void CookieJar::clearSessionCookies() { setAllCookies(removeExpired(allCookies())); } - void CookieJar::save() { QFile file; diff --git a/src/libsync/cookiejar.h b/src/libsync/cookiejar.h index a336d5c80..a7c8c671c 100644 --- a/src/libsync/cookiejar.h +++ b/src/libsync/cookiejar.h @@ -29,13 +29,11 @@ public: bool setCookiesFromUrl(const QList &cookieList, const QUrl &url) Q_DECL_OVERRIDE; QList cookiesForUrl(const QUrl &url) const Q_DECL_OVERRIDE; - bool deleteCookie(const QNetworkCookie & cookie) -#if QT_VERSION > QT_VERSION_CHECK(5, 0, 0) - Q_DECL_OVERRIDE //that function is not virtual in Qt4 -#endif - ; void clearSessionCookies(); + using QNetworkCookieJar::setAllCookies; + using QNetworkCookieJar::allCookies; + signals: void newCookiesForUrl(const QList& cookieList, const QUrl& url); private: diff --git a/src/libsync/creds/shibbolethcredentials.cpp b/src/libsync/creds/shibbolethcredentials.cpp index 7194ec106..4ee518803 100644 --- a/src/libsync/creds/shibbolethcredentials.cpp +++ b/src/libsync/creds/shibbolethcredentials.cpp @@ -241,7 +241,19 @@ void ShibbolethCredentials::persist(Account* account) void ShibbolethCredentials::invalidateToken(Account *account) { CookieJar *jar = static_cast(account->networkAccessManager()->cookieJar()); - jar->deleteCookie(_shibCookie); + + // Remove the _shibCookie + auto cookies = jar->allCookies(); + for (auto it = cookies.begin(); it != cookies.end(); ) { + if (it->name() == _shibCookie.name()) { + it = cookies.erase(it); + } else { + ++it; + } + } + jar->setAllCookies(cookies); + + // Clear all other temporary cookies jar->clearSessionCookies(); removeShibCookie(account); _shibCookie = QNetworkCookie(); diff --git a/src/libsync/networkjobs.cpp b/src/libsync/networkjobs.cpp index fa87b4475..a619034cd 100644 --- a/src/libsync/networkjobs.cpp +++ b/src/libsync/networkjobs.cpp @@ -497,7 +497,12 @@ void PropfindJob::start() req.setRawHeader("Depth", "0"); QByteArray propStr; foreach (const QByteArray &prop, properties) { - propStr += " \n"; + if (prop.contains(':')) { + int colIdx = prop.lastIndexOf(":"); + propStr += " <" + prop.mid(colIdx+1) + " xmlns=\"" + prop.left(colIdx) + "\" />\n"; + } else { + propStr += " \n"; + } } QByteArray xml = "\n" "\n" @@ -540,25 +545,23 @@ bool PropfindJob::finished() while (!reader.atEnd()) { QXmlStreamReader::TokenType type = reader.readNext(); - if (type == QXmlStreamReader::StartElement && - reader.namespaceUri() == QLatin1String("DAV:")) { - if (curElement.isEmpty()) { - curElement.push(reader.name().toString()); - items.insert(reader.name().toString(), reader.text().toString()); + if (type == QXmlStreamReader::StartElement) { + if (!curElement.isEmpty() && curElement.top() == QLatin1String("prop")) { + items.insert(reader.name().toString(), reader.readElementText()); } + curElement.push(reader.name().toString()); } - if (type == QXmlStreamReader::EndElement && - reader.namespaceUri() == QLatin1String("DAV:")) { + if (type == QXmlStreamReader::EndElement) { if(curElement.top() == reader.name()) { curElement.pop(); } } - } emit result(items); } else { qDebug() << "Quota request *not* successful, http result code is" << http_result_code << (http_result_code == 302 ? reply()->header(QNetworkRequest::LocationHeader).toString() : QLatin1String("")); + emit finishedWithError(); } return true; } diff --git a/src/libsync/networkjobs.h b/src/libsync/networkjobs.h index fdd750014..8ba01dd9e 100644 --- a/src/libsync/networkjobs.h +++ b/src/libsync/networkjobs.h @@ -158,6 +158,7 @@ public: signals: void result(const QVariantMap &values); + void finishedWithError(); private slots: virtual bool finished() Q_DECL_OVERRIDE; diff --git a/src/libsync/owncloudpropagator.cpp b/src/libsync/owncloudpropagator.cpp index 474c9d3dd..7d86dcec0 100644 --- a/src/libsync/owncloudpropagator.cpp +++ b/src/libsync/owncloudpropagator.cpp @@ -20,6 +20,7 @@ #include "propagateupload.h" #include "propagateremotedelete.h" #include "propagateremotemove.h" +#include "propagateremotemkdir.h" #include "propagatorjobs.h" #include "propagator_legacy.h" #include "configfile.h" @@ -70,6 +71,7 @@ static bool blacklist(SyncJournalDb* journal, const SyncFileItem& item) void PropagateItemJob::done(SyncFileItem::Status status, const QString &errorString) { + _state = Finished; if (_item._isRestoration) { if( status == SyncFileItem::Success || status == SyncFileItem::Conflict) { status = SyncFileItem::Restoration; @@ -308,10 +310,11 @@ void OwncloudPropagator::start(const SyncFileItemVector& items) connect(_rootJob.data(), SIGNAL(completed(SyncFileItem)), this, SIGNAL(completed(SyncFileItem))); connect(_rootJob.data(), SIGNAL(progress(SyncFileItem,quint64)), this, SIGNAL(progress(SyncFileItem,quint64))); connect(_rootJob.data(), SIGNAL(finished(SyncFileItem::Status)), this, SLOT(emitFinished())); + connect(_rootJob.data(), SIGNAL(ready()), this, SLOT(scheduleNextJob()), Qt::QueuedConnection); qDebug() << (useLegacyJobs() ? "Using legacy libneon/HTTP sequential code path" : "Using QNAM/HTTP parallel code path"); - QMetaObject::invokeMethod(_rootJob.data(), "start", Qt::QueuedConnection); + QTimer::singleShot(0, this, SLOT(scheduleNextJob())); } bool OwncloudPropagator::isInSharedDirectory(const QString& file) @@ -343,21 +346,31 @@ bool OwncloudPropagator::useLegacyJobs() return true; } - env = qgetenv("OWNCLOUD_NEW_BANDWIDTH_LIMITING"); - if (env=="true" || env =="1") { - qDebug() << "New Bandwidth Limiting Code ACTIVATED"; - // Only certain Qt versions support this at the moment. - // They need those Change-Ids: Idb1c2d5a382a704d8cc08fe03c55c883bfc95aa7 Iefbcb1a21d8aedef1eb11761232dd16a049018dc - // FIXME We need to check the Qt version and then also return false here as soon - // as mirall ships with those Qt versions on Windows and OS X - return false; - } - if (_downloadLimit.fetchAndAddAcquire(0) != 0 || _uploadLimit.fetchAndAddAcquire(0) != 0) { - qDebug() << "Switching To Legacy Propagator Because Of Bandwidth Limit ACTIVATED"; - // QNAM does not support bandwith limiting - // in most Qt versions. + // QNAM bandwith limiting only work with version of Qt greater or equal to 5.3.3 + // (It needs Qt commits 097b641 and b99fa32) +#if QT_VERSION >= QT_VERSION_CHECK(5,3,3) + return false; +#elif QT_VERSION >= QT_VERSION_CHECK(5,0,0) + env = qgetenv("OWNCLOUD_NEW_BANDWIDTH_LIMITING"); + if (env=="true" || env =="1") { + qDebug() << "New Bandwidth Limiting Code ACTIVATED"; + return false; + } + + // Do a runtime check. + // (Poor man's version comparison) + const char *v = qVersion(); // "x.y.z"; + if (QLatin1String(v) >= QLatin1String("5.3.3")) { + return false; + } else { + qDebug() << "Use legacy jobs because qt version is only" << v << "while 5.3.3 is needed"; + return true; + } +#else + qDebug() << "Use legacy jobs because of Qt4"; return true; +#endif } return false; @@ -435,52 +448,133 @@ QString OwncloudPropagator::getFilePath(const QString& tmp_file_name) const return _localDir + tmp_file_name; } +void OwncloudPropagator::scheduleNextJob() +{ + if (this->_activeJobs < maximumActiveJob()) { + if (_rootJob->scheduleNextJob()) { + QTimer::singleShot(100, this, SLOT(scheduleNextJob())); + } + } +} + +void OwncloudPropagator::addTouchedFile(const QString& fn) +{ + QString file = QDir::cleanPath(fn); + + QElapsedTimer timer; + timer.start(); + + QMutexLocker lock(&_touchedFilesMutex); + _touchedFiles.insert(file, timer); +} + +qint64 OwncloudPropagator::timeSinceFileTouched(const QString& fn) const +{ + QMutexLocker lock(&_touchedFilesMutex); + if (! _touchedFiles.contains(fn)) { + return -1; + } + + return _touchedFiles[fn].elapsed(); +} + // ================================================================================ -void PropagateDirectory::start() +PropagatorJob::JobParallelism PropagateDirectory::parallelism() { - _current = -1; - _hasError = SyncFileItem::NoStatus; - if (!_firstJob) { - slotSubJobReady(); - } else { - startJob(_firstJob.data()); + // If any of the non-finished sub jobs is not parallel, we have to wait + + // FIXME! we should probably cache this result + + if (_firstJob && _firstJob->_state != Finished) { + if (_firstJob->parallelism() != FullParallelism) + return WaitForFinished; } + + // FIXME: use the cached value of finished job + for (int i = 0; i < _subJobs.count(); ++i) { + if (_subJobs.at(i)->_state != Finished && _subJobs.at(i)->parallelism() != FullParallelism) { + return WaitForFinished; + } + } + return FullParallelism; +} + + +bool PropagateDirectory::scheduleNextJob() +{ + if (_state == Finished) { + return false; + } + + if (_state == NotYetStarted) { + _state = Running; + + if (!_firstJob && _subJobs.isEmpty()) { + slotSubJobFinished(SyncFileItem::Success); + return true; + } + } + + if (_firstJob && _firstJob->_state == NotYetStarted) { + return possiblyRunNextJob(_firstJob.data()); + } + + if (_firstJob && _firstJob->_state == Running) { + return false; + } + + bool stopAtDirectory = false; + // FIXME: use the cached value of finished job + for (int i = 0; i < _subJobs.count(); ++i) { + if (_subJobs.at(i)->_state == Finished) { + continue; + } + + if (stopAtDirectory && qobject_cast(_subJobs.at(i))) { + return false; + } + + if (possiblyRunNextJob(_subJobs.at(i))) { + return true; + } + + Q_ASSERT(_subJobs.at(i)->_state == Running); + + auto paral = _subJobs.at(i)->parallelism(); + if (paral == WaitForFinished) { + return false; + } + if (paral == WaitForFinishedInParentDirectory) { + stopAtDirectory = true; + } + } + return false; } void PropagateDirectory::slotSubJobFinished(SyncFileItem::Status status) { if (status == SyncFileItem::FatalError || - (_current == -1 && status != SyncFileItem::Success && status != SyncFileItem::Restoration)) { + (sender() == _firstJob.data() && status != SyncFileItem::Success && status != SyncFileItem::Restoration)) { abort(); + _state = Finished; emit finished(status); return; } else if (status == SyncFileItem::NormalError || status == SyncFileItem::SoftError) { _hasError = status; } _runningNow--; - slotSubJobReady(); -} -void PropagateDirectory::slotSubJobReady() -{ - if (_runningNow && _current == -1) - return; // Ignore the case when the _fistJob is ready and not yet finished - if (_runningNow && _current >= 0 && _current < _subJobs.count()) { - // there is a job running and the current one is not ready yet, we can't start new job - if (!_subJobs[_current]->_readySent || _propagator->_activeJobs >= _propagator->maximumActiveJob()) - return; + int total = _subJobs.count(); + if (!_firstJob) { + total--; } _current++; - if (_current < _subJobs.size() && !_propagator->_abortRequested.fetchAndAddRelaxed(0)) { - PropagatorJob *next = _subJobs.at(_current); - startJob(next); - return; - } + // We finished to processing all the jobs - emitReady(); - if (!_runningNow) { + // check if we finished + if (_current >= total) { if (!_item.isEmpty() && _hasError == SyncFileItem::NoStatus) { if( !_item._renameTarget.isEmpty() ) { _item._file = _item._renameTarget; @@ -497,7 +591,10 @@ void PropagateDirectory::slotSubJobReady() _propagator->_journal->setFileRecord(record); } } + _state = Finished; emit finished(_hasError == SyncFileItem::NoStatus ? SyncFileItem::Success : _hasError); + } else { + emit ready(); } } diff --git a/src/libsync/owncloudpropagator.h b/src/libsync/owncloudpropagator.h index a5aaae5bd..bd38363cf 100644 --- a/src/libsync/owncloudpropagator.h +++ b/src/libsync/owncloudpropagator.h @@ -24,6 +24,7 @@ #include #include #include +#include #include "syncfileitem.h" #include "syncjournaldb.h" @@ -41,23 +42,53 @@ class Account; class SyncJournalDb; class OwncloudPropagator; +/** + * @class PropagatorJob + * @brief the base class of propagator jobs + * + * This can either be a job, or a container for jobs. + * If it is a composite jobs, it then inherits from PropagateDirectory + * + * + */ + class PropagatorJob : public QObject { Q_OBJECT protected: OwncloudPropagator *_propagator; - void emitReady() { - bool wasReady = _readySent; - _readySent = true; - if (!wasReady) - emit ready(); - }; + public: - bool _readySent; - explicit PropagatorJob(OwncloudPropagator* propagator) : _propagator(propagator), _readySent(false) {} + explicit PropagatorJob(OwncloudPropagator* propagator) : _propagator(propagator), _state(NotYetStarted) {} + + enum JobState { + NotYetStarted, + Running, + Finished + }; + JobState _state; + + enum JobParallelism { + + /** Jobs can be run in parallel to this job */ + FullParallelism, + /** This job do not support parallelism, and no other job shall + be started until this one has finished */ + WaitForFinished, + + /** This job support paralelism with other jobs in the same directory, but it should + not be paralelized with jobs in other directories (typically a move operation) */ + WaitForFinishedInParentDirectory + }; + + virtual JobParallelism parallelism() { return FullParallelism; } public slots: - virtual void start() = 0; virtual void abort() {} + + /** Starts this job, or a new subjob + * returns true if a job was started. + */ + virtual bool scheduleNextJob() = 0; signals: /** * Emitted when the job is fully finished @@ -70,9 +101,8 @@ signals: void completed(const SyncFileItem &); /** - * Emitted when all the sub-jobs have been scheduled and - * we are ready and more jobs might be started - * This signal is not always emitted. + * Emitted when all the sub-jobs have been finished and + * more jobs might be started (so scheduleNextJob can/must be called again) */ void ready(); @@ -111,7 +141,8 @@ public: _subJobs.append(subJob); } - virtual void start() Q_DECL_OVERRIDE; + virtual bool scheduleNextJob() Q_DECL_OVERRIDE; + virtual JobParallelism parallelism() Q_DECL_OVERRIDE; virtual void abort() Q_DECL_OVERRIDE { if (_firstJob) _firstJob->abort(); @@ -120,23 +151,23 @@ public: } private slots: - void startJob(PropagatorJob *next) { - connect(next, SIGNAL(finished(SyncFileItem::Status)), this, SLOT(slotSubJobFinished(SyncFileItem::Status)), Qt::QueuedConnection); - connect(next, SIGNAL(completed(SyncFileItem)), this, SIGNAL(completed(SyncFileItem))); - connect(next, SIGNAL(progress(SyncFileItem,quint64)), this, SIGNAL(progress(SyncFileItem,quint64))); - connect(next, SIGNAL(ready()), this, SLOT(slotSubJobReady())); - _runningNow++; - QMetaObject::invokeMethod(next, "start", Qt::QueuedConnection); + bool possiblyRunNextJob(PropagatorJob *next) { + if (next->_state == NotYetStarted) { + connect(next, SIGNAL(finished(SyncFileItem::Status)), this, SLOT(slotSubJobFinished(SyncFileItem::Status)), Qt::QueuedConnection); + connect(next, SIGNAL(completed(SyncFileItem)), this, SIGNAL(completed(SyncFileItem))); + connect(next, SIGNAL(progress(SyncFileItem,quint64)), this, SIGNAL(progress(SyncFileItem,quint64))); + connect(next, SIGNAL(ready()), this, SIGNAL(ready())); + _runningNow++; + } + return next->scheduleNextJob(); } void slotSubJobFinished(SyncFileItem::Status status); - void slotSubJobReady(); }; /* * Abstract class to propagate a single item - * (Only used for neon job) */ class PropagateItemJob : public PropagatorJob { Q_OBJECT @@ -169,6 +200,17 @@ public: PropagateItemJob(OwncloudPropagator* propagator, const SyncFileItem &item) : PropagatorJob(propagator), _item(item) {} + bool scheduleNextJob() Q_DECL_OVERRIDE { + if (_state != NotYetStarted) { + return false; + } + _state = Running; + QMetaObject::invokeMethod(this, "start"); // We could be in a different thread (neon jobs) + return true; + } +public slots: + virtual void start() = 0; + }; // Dummy job that just mark it as completed and ignored. @@ -183,44 +225,6 @@ public: } }; -class BandwidthManager; // fwd -class UploadDevice : public QIODevice { - Q_OBJECT -public: - QPointer _file; - qint64 _read; - qint64 _size; - qint64 _start; - BandwidthManager* _bandwidthManager; - - qint64 _bandwidthQuota; - qint64 _readWithProgress; - - UploadDevice(QIODevice *file, qint64 start, qint64 size, BandwidthManager *bwm); - ~UploadDevice(); - virtual qint64 writeData(const char* , qint64 ); - virtual qint64 readData(char* data, qint64 maxlen); - virtual bool atEnd() const; - virtual qint64 size() const; - qint64 bytesAvailable() const; - virtual bool isSequential() const; - virtual bool seek ( qint64 pos ); - - void setBandwidthLimited(bool); - bool isBandwidthLimited() { return _bandwidthLimited; } - void setChoked(bool); - bool isChoked() { return _choked; } - void giveBandwidthQuota(qint64 bwq); -private: - bool _bandwidthLimited; // if _bandwidthQuota will be used - bool _choked; // if upload is paused (readData() will return 0) -protected slots: - void slotJobUploadProgress(qint64 sent, qint64 t); -}; -//Q_DECLARE_METATYPE(UploadDevice); -//Q_DECLARE_METATYPE(QPointer); - - class OwncloudPropagator : public QObject { Q_OBJECT @@ -241,7 +245,6 @@ public: SyncJournalDb * const _journal; bool _finishedEmited; // used to ensure that finished is only emit once - BandwidthManager _bandwidthManager; public: OwncloudPropagator(ne_session_s *session, const QString &localDir, const QString &remoteDir, const QString &remoteFolder, @@ -262,6 +265,7 @@ public: QAtomicInt _downloadLimit; QAtomicInt _uploadLimit; + BandwidthManager _bandwidthManager; QAtomicInt _abortRequested; // boolean set by the main thread to abort. @@ -289,6 +293,19 @@ public: // timeout in seconds static int httpTimeout(); + /** Records that a file was touched by a job. + * + * Thread-safe. + */ + void addTouchedFile(const QString& fn); + + /** Get the ms since a file was touched, or -1 if it wasn't. + * + * Thread-safe. + */ + qint64 timeSinceFileTouched(const QString& fn) const; + + private slots: /** Emit the finished signal and make sure it is only emit once */ @@ -298,6 +315,8 @@ private slots: _finishedEmited = true; } + void scheduleNextJob(); + signals: void completed(const SyncFileItem &); void progress(const SyncFileItem&, quint64 bytes); @@ -308,6 +327,11 @@ signals: */ void adjustTotalTransmissionSize( qint64 adjust ); +private: + + /** Stores the time since a job touched a file. */ + QHash _touchedFiles; + mutable QMutex _touchedFilesMutex; }; // Job that wait for all the poll jobs to be completed diff --git a/src/libsync/owncloudtheme.cpp b/src/libsync/owncloudtheme.cpp index 382001a65..d2711cb17 100644 --- a/src/libsync/owncloudtheme.cpp +++ b/src/libsync/owncloudtheme.cpp @@ -74,7 +74,6 @@ QIcon ownCloudTheme::applicationIcon( ) const return themeIcon( QLatin1String("owncloud-icon") ); } -#endif QVariant ownCloudTheme::customMedia(Theme::CustomMediaType type) { @@ -89,6 +88,8 @@ QVariant ownCloudTheme::customMedia(Theme::CustomMediaType type) } } +#endif + QString ownCloudTheme::helpUrl() const { return QString::fromLatin1("http://doc.owncloud.org/desktop/%1.%2/").arg(MIRALL_VERSION_MAJOR).arg(MIRALL_VERSION_MINOR); diff --git a/src/libsync/owncloudtheme.h b/src/libsync/owncloudtheme.h index 733754b9b..abe9261d1 100644 --- a/src/libsync/owncloudtheme.h +++ b/src/libsync/owncloudtheme.h @@ -27,20 +27,22 @@ public: QString configFileName() const Q_DECL_OVERRIDE; QString about() const Q_DECL_OVERRIDE; - QPixmap splashScreen() const; - QIcon folderIcon( const QString& ) const; +#ifndef TOKEN_AUTH_ONLY QIcon trayFolderIcon( const QString& ) const Q_DECL_OVERRIDE; QIcon applicationIcon() const Q_DECL_OVERRIDE; +#endif QString appName() const Q_DECL_OVERRIDE; QString appNameGUI() const Q_DECL_OVERRIDE; - QVariant customMedia(CustomMediaType type) Q_DECL_OVERRIDE; QString helpUrl() const Q_DECL_OVERRIDE; +#ifndef TOKEN_AUTH_ONLY + QVariant customMedia(CustomMediaType type) Q_DECL_OVERRIDE; QColor wizardHeaderBackgroundColor() const Q_DECL_OVERRIDE; QColor wizardHeaderTitleColor() const Q_DECL_OVERRIDE; QPixmap wizardHeaderLogo() const Q_DECL_OVERRIDE; +#endif private: diff --git a/src/libsync/propagatedownload.cpp b/src/libsync/propagatedownload.cpp index ea3c67102..fdd8ef758 100644 --- a/src/libsync/propagatedownload.cpp +++ b/src/libsync/propagatedownload.cpp @@ -361,7 +361,6 @@ void PropagateDownloadFileQNAM::start() connect(_job, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(slotDownloadProgress(qint64,qint64))); _propagator->_activeJobs ++; _job->start(); - emitReady(); } void PropagateDownloadFileQNAM::slotGetFinished() @@ -418,6 +417,21 @@ void PropagateDownloadFileQNAM::slotGetFinished() _tmpFile.close(); _tmpFile.flush(); + + /* Check that the size of the GET reply matches the file size. There have been cases + * reported that if a server breaks behind a proxy, the GET is still a 200 but is + * truncated, as described here: https://github.com/owncloud/mirall/issues/2528 + */ + const QByteArray sizeHeader("Content-Length"); + quint64 bodySize = job->reply()->rawHeader(sizeHeader).toULongLong(); + + if(bodySize > 0 && bodySize != _tmpFile.size() - job->resumeStart() ) { + qDebug() << bodySize << _tmpFile.size() << job->resumeStart(); + _propagator->_anotherSyncNeeded = true; + done(SyncFileItem::SoftError, tr("The file could not be downloaded completely.")); + return; + } + downloadFinished(); } @@ -477,6 +491,7 @@ void PropagateDownloadFileQNAM::downloadFinished() FileSystem::setFileHidden(_tmpFile.fileName(), false); QString error; + _propagator->addTouchedFile(fn); if (!FileSystem::renameReplace(_tmpFile.fileName(), fn, &error)) { // If we moved away the original file due to a conflict but can't // put the downloaded file in its place, we are in a bad spot: diff --git a/src/libsync/propagatedownload.h b/src/libsync/propagatedownload.h index a74ba68f7..e98be4b40 100644 --- a/src/libsync/propagatedownload.h +++ b/src/libsync/propagatedownload.h @@ -54,9 +54,9 @@ public: virtual void start() Q_DECL_OVERRIDE; virtual bool finished() Q_DECL_OVERRIDE { - qDebug() << Q_FUNC_INFO << reply()->bytesAvailable() << _hasEmittedFinishedSignal; +// qDebug() << Q_FUNC_INFO << reply()->bytesAvailable() << _hasEmittedFinishedSignal; if (reply()->bytesAvailable()) { - qDebug() << Q_FUNC_INFO << "Not all read yet because of bandwidth limits"; +// qDebug() << Q_FUNC_INFO << "Not all read yet because of bandwidth limits"; return false; } else { if (_bandwidthManager) { diff --git a/src/libsync/propagateremotedelete.cpp b/src/libsync/propagateremotedelete.cpp index 654328bc1..503daf307 100644 --- a/src/libsync/propagateremotedelete.cpp +++ b/src/libsync/propagateremotedelete.cpp @@ -60,7 +60,6 @@ void PropagateRemoteDelete::start() connect(_job, SIGNAL(finishedSignal()), this, SLOT(slotDeleteJobFinished())); _propagator->_activeJobs ++; _job->start(); - emitReady(); } void PropagateRemoteDelete::abort() diff --git a/src/libsync/propagateremotemkdir.cpp b/src/libsync/propagateremotemkdir.cpp new file mode 100644 index 000000000..ce51a054f --- /dev/null +++ b/src/libsync/propagateremotemkdir.cpp @@ -0,0 +1,116 @@ +/* + * 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. + */ + +#include "propagateremotemkdir.h" +#include "owncloudpropagator_p.h" +#include "account.h" +#include "syncjournalfilerecord.h" +#include + +namespace Mirall { + +void PropagateRemoteMkdir::start() +{ + if (_propagator->_abortRequested.fetchAndAddRelaxed(0)) + return; + + qDebug() << Q_FUNC_INFO << _item._file; + + _job = new MkColJob(AccountManager::instance()->account(), + _propagator->_remoteFolder + _item._file, + this); + connect(_job, SIGNAL(finished(QNetworkReply::NetworkError)), this, SLOT(slotMkcolJobFinished())); + _propagator->_activeJobs++; + _job->start(); +} + +void PropagateRemoteMkdir::abort() +{ + if (_job && _job->reply()) + _job->reply()->abort(); +} + +void PropagateRemoteMkdir::slotMkcolJobFinished() +{ + _propagator->_activeJobs--; + + Q_ASSERT(_job); + + qDebug() << Q_FUNC_INFO << _job->reply()->request().url() << "FINISHED WITH STATUS" + << _job->reply()->error() + << (_job->reply()->error() == QNetworkReply::NoError ? QLatin1String("") : _job->reply()->errorString()); + + QNetworkReply::NetworkError err = _job->reply()->error(); + _item._httpErrorCode = _job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + + if (_item._httpErrorCode == 405) { + // This happens when the directory already exist. Nothing to do. + } else if (err != QNetworkReply::NoError) { + SyncFileItem::Status status = classifyError(err, _item._httpErrorCode); + done(status, _job->reply()->errorString()); + return; + } else if (_item._httpErrorCode != 201) { + // Normaly we expect "201 Created" + // If it is not the case, it might be because of a proxy or gateway intercepting the request, so we must + // throw an error. + done(SyncFileItem::NormalError, tr("Wrong HTTP code returned by server. Expected 201, but recieved \"%1 %2\".") + .arg(_item._httpErrorCode).arg(_job->reply()->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString())); + return; + } + + _item._requestDuration = _job->duration(); + _item._responseTimeStamp = _job->responseTimestamp(); + _item._fileId = _job->reply()->rawHeader("OC-FileId"); + + if (_item._fileId.isEmpty()) { + // Owncloud 7.0.0 and before did not have a header with the file id. + // (https://github.com/owncloud/core/issues/9000) + // So we must get the file id using a PROPFIND + // This is required so that we can detect moves even if the folder is renamed on the server + // while files are still uploading + _propagator->_activeJobs++; + auto propfindJob = new PropfindJob(_job->account(), _job->path(), this); + propfindJob->setProperties(QList() << "getetag" << "http://owncloud.org/ns:id"); + QObject::connect(propfindJob, SIGNAL(result(QVariantMap)), this, SLOT(propfindResult(QVariantMap))); + QObject::connect(propfindJob, SIGNAL(finishedWithError()), this, SLOT(propfindError())); + propfindJob->start(); + _job = propfindJob; + return; + } + + done(SyncFileItem::Success); +} + +void PropagateRemoteMkdir::propfindResult(const QVariantMap &result) +{ + _propagator->_activeJobs--; + if (result.contains("getetag")) { + _item._etag = result["getetag"].toByteArray(); + } + if (result.contains("id")) { + _item._fileId = result["id"].toByteArray(); + } + done(SyncFileItem::Success); +} + +void PropagateRemoteMkdir::propfindError() +{ + // ignore the PROPFIND error + _propagator->_activeJobs--; + done(SyncFileItem::Success); +} + + +} + diff --git a/src/libsync/propagateremotemkdir.h b/src/libsync/propagateremotemkdir.h new file mode 100644 index 000000000..fae8db28b --- /dev/null +++ b/src/libsync/propagateremotemkdir.h @@ -0,0 +1,36 @@ +/* + * 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 "owncloudpropagator.h" +#include "networkjobs.h" + +namespace Mirall { + +class PropagateRemoteMkdir : public PropagateItemJob { + Q_OBJECT + QPointer _job; + friend class PropagateDirectory; // So it can access the _item; +public: + PropagateRemoteMkdir (OwncloudPropagator* propagator,const SyncFileItem& item) + : PropagateItemJob(propagator, item) {} + void start() Q_DECL_OVERRIDE; + void abort() Q_DECL_OVERRIDE; +private slots: + void slotMkcolJobFinished(); + void propfindResult(const QVariantMap &); + void propfindError(); +}; + +} \ No newline at end of file diff --git a/src/libsync/propagateremotemove.cpp b/src/libsync/propagateremotemove.cpp index 06084cb02..d7888029e 100644 --- a/src/libsync/propagateremotemove.cpp +++ b/src/libsync/propagateremotemove.cpp @@ -58,13 +58,18 @@ void PropagateRemoteMove::start() qDebug() << Q_FUNC_INFO << _item._file << _item._renameTarget; + QString targetFile(_propagator->getFilePath(_item._renameTarget)); + if (_item._file == _item._renameTarget) { // The parents has been renamed already so there is nothing more to do. finalize(); return; } else if (AbstractNetworkJob::preOc7WasDetected && _item._file == QLatin1String("Shared") ) { // Check if it is the toplevel Shared folder and do not propagate it. - if( QFile::rename( _propagator->_localDir + _item._renameTarget, _propagator->_localDir + QLatin1String("Shared")) ) { + QString originalFile(_propagator->getFilePath(QLatin1String("Shared"))); + _propagator->addTouchedFile(originalFile); + _propagator->addTouchedFile(targetFile); + if( QFile::rename( targetFile, originalFile) ) { done(SyncFileItem::NormalError, tr("This folder must not be renamed. It is renamed back to its original name.")); } else { done(SyncFileItem::NormalError, tr("This folder must not be renamed. Please name it back to Shared.")); @@ -78,7 +83,6 @@ void PropagateRemoteMove::start() connect(_job, SIGNAL(finishedSignal()), this, SLOT(slotMoveJobFinished())); _propagator->_activeJobs++; _job->start(); - emitReady(); } } @@ -132,7 +136,7 @@ void PropagateRemoteMove::slotMoveJobFinished() void PropagateRemoteMove::finalize() { _propagator->_journal->deleteFileRecord(_item._originalFile); - SyncJournalFileRecord record(_item, _propagator->_localDir + _item._renameTarget); + SyncJournalFileRecord record(_item, _propagator->getFilePath(_item._renameTarget)); record._path = _item._renameTarget; _propagator->_journal->setFileRecord(record); diff --git a/src/libsync/propagateremotemove.h b/src/libsync/propagateremotemove.h index 97cf5c0f0..540fff9f6 100644 --- a/src/libsync/propagateremotemove.h +++ b/src/libsync/propagateremotemove.h @@ -43,6 +43,7 @@ public: : PropagateItemJob(propagator, item) {} void start() Q_DECL_OVERRIDE; void abort() Q_DECL_OVERRIDE; + JobParallelism parallelism() Q_DECL_OVERRIDE { return Mirall::PropagatorJob::WaitForFinishedInParentDirectory; } private slots: void slotMoveJobFinished(); void finalize(); diff --git a/src/libsync/propagateupload.cpp b/src/libsync/propagateupload.cpp index d5ac518da..654de66c9 100644 --- a/src/libsync/propagateupload.cpp +++ b/src/libsync/propagateupload.cpp @@ -14,6 +14,7 @@ #include "propagateupload.h" #include "owncloudpropagator_p.h" +#include "propagator_legacy.h" #include "networkjobs.h" #include "account.h" #include "syncjournaldb.h" @@ -152,7 +153,8 @@ void PropagateUploadFileQNAM::start() _file = new QFile(_propagator->getFilePath(_item._file), this); if (!_file->open(QIODevice::ReadOnly)) { - done(SyncFileItem::NormalError, _file->errorString()); + // Soft error because this is likely caused by the user modifying his files while syncing + done(SyncFileItem::SoftError, _file->errorString()); delete _file; return; } @@ -199,7 +201,6 @@ UploadDevice::UploadDevice(QIODevice *file, qint64 start, qint64 size, Bandwidt _readWithProgress(0), _bandwidthLimited(false), _choked(false) { - qDebug() << Q_FUNC_INFO << start << size << chunkSize(); _bandwidthManager->registerUploadDevice(this); _file = QPointer(file); } @@ -216,7 +217,7 @@ qint64 UploadDevice::writeData(const char* , qint64 ) { qint64 UploadDevice::readData(char* data, qint64 maxlen) { if (_file.isNull()) { - qDebug() << Q_FUNC_INFO << "Upload file object deleted during upload"; + qDebug() << "Upload file object deleted during upload"; close(); return -1; } @@ -224,7 +225,6 @@ qint64 UploadDevice::readData(char* data, qint64 maxlen) { //qDebug() << Q_FUNC_INFO << maxlen << _read << _size << _bandwidthQuota; if (_size - _read <= 0) { // at end - qDebug() << Q_FUNC_INFO << _read << _size << _bandwidthQuota << "at end"; _bandwidthManager->unregisterUploadDevice(this); return -1; } @@ -233,28 +233,21 @@ qint64 UploadDevice::readData(char* data, qint64 maxlen) { return 0; } if (isChoked()) { - qDebug() << Q_FUNC_INFO << this << "Upload Choked"; return 0; } if (isBandwidthLimited()) { - qDebug() << Q_FUNC_INFO << "BW LIMITED" << maxlen << _bandwidthQuota - << qMin(maxlen, _bandwidthQuota); maxlen = qMin(maxlen, _bandwidthQuota); if (maxlen <= 0) { // no quota - qDebug() << Q_FUNC_INFO << "no quota"; + qDebug() << "no quota"; return 0; } _bandwidthQuota -= maxlen; } - qDebug() << Q_FUNC_INFO << "reading limited=" << isBandwidthLimited() - << "maxlen=" << maxlen << "quota=" << _bandwidthQuota; qint64 ret = _file.data()->read(data, maxlen); - //qDebug() << Q_FUNC_INFO << "returning " << ret; if (ret < 0) return -1; _read += ret; - //qDebug() << Q_FUNC_INFO << "returning2 " << ret << _read; return ret; } @@ -270,7 +263,7 @@ void UploadDevice::slotJobUploadProgress(qint64 sent, qint64 t) bool UploadDevice::atEnd() const { if (_file.isNull()) { - qDebug() << Q_FUNC_INFO << "Upload file object deleted during upload"; + qDebug() << "Upload file object deleted during upload"; return true; } // qDebug() << this << Q_FUNC_INFO << _read << chunkSize() @@ -298,20 +291,17 @@ bool UploadDevice::isSequential() const{ bool UploadDevice::seek ( qint64 pos ) { if (_file.isNull()) { - qDebug() << Q_FUNC_INFO << "Upload file object deleted during upload"; + qDebug() << "Upload file object deleted during upload"; close(); return false; } - qDebug() << this << Q_FUNC_INFO << pos << _read; _read = pos; return _file.data()->seek(pos + _start); } void UploadDevice::giveBandwidthQuota(qint64 bwq) { -// qDebug() << Q_FUNC_INFO << bwq; if (!atEnd()) { _bandwidthQuota = bwq; -// qDebug() << Q_FUNC_INFO << bwq << "emitting readyRead()" << _read << _readWithProgress; QMetaObject::invokeMethod(this, "readyRead", Qt::QueuedConnection); // tell QNAM that we have quota } } @@ -343,6 +333,7 @@ void PropagateUploadFileQNAM::startNextChunk() QMap headers; headers["OC-Total-Length"] = QByteArray::number(fileSize); headers["OC-Async"] = "1"; + headers["OC-Chunk-Size"]= QByteArray::number(quint64(chunkSize())); headers["Content-Type"] = "application/octet-stream"; headers["X-OC-Mtime"] = QByteArray::number(qint64(_item._modtime)); if (!_item._etag.isEmpty() && _item._etag != "empty_etag" && @@ -403,7 +394,7 @@ void PropagateUploadFileQNAM::startNextChunk() startNextChunk(); } if (!parallelChunkUpload || _chunkCount - _currentChunk <= 0) { - emitReady(); + emit ready(); } } else { qDebug() << "ERR: Could not open upload file: " << device->errorString(); @@ -456,6 +447,13 @@ void PropagateUploadFileQNAM::slotPutFinished() _propagator->_anotherSyncNeeded = true; } + foreach (auto job, _jobs) { + if (job->reply()) { + job->reply()->abort(); + } + } + + _finished = true; done(classifyError(err, _item._httpErrorCode), errorString); return; } @@ -466,6 +464,7 @@ void PropagateUploadFileQNAM::slotPutFinished() _finished = true; QString path = QString::fromUtf8(job->reply()->rawHeader("OC-Finish-Poll")); if (path.isEmpty()) { + _finished = true; done(SyncFileItem::NormalError, tr("Poll URL missing")); return; } @@ -587,7 +586,7 @@ void PropagateUploadFileQNAM::finalize(const SyncFileItem ©) _propagator->_journal->setUploadInfo(_item._file, SyncJournalDb::UploadInfo()); _propagator->_journal->commit("upload file start"); - qDebug() << Q_FUNC_INFO << "msec=" <<_duration.elapsed(); + _finished = true; done(SyncFileItem::Success); } @@ -620,6 +619,7 @@ void PropagateUploadFileQNAM::startPollJob(const QString& path) info._modtime = _item._modtime; _propagator->_journal->setPollInfo(info); _propagator->_journal->commit("add poll info"); + _propagator->_activeJobs++; job->start(); } @@ -628,7 +628,10 @@ void PropagateUploadFileQNAM::slotPollFinished() PollJob *job = qobject_cast(sender()); Q_ASSERT(job); + _propagator->_activeJobs--; + if (job->_item._status != SyncFileItem::Success) { + _finished = true; done(job->_item._status, job->_item._errorString); return; } diff --git a/src/libsync/propagateupload.h b/src/libsync/propagateupload.h index c6a250cbc..7b1c01966 100644 --- a/src/libsync/propagateupload.h +++ b/src/libsync/propagateupload.h @@ -21,30 +21,40 @@ #include namespace OCC { +class BandwidthManager; -class ChunkBlock { - +class UploadDevice : public QIODevice { + Q_OBJECT public: - explicit ChunkBlock() : _state(NotTransfered) { } - enum State { - CHUNK_SUCCESS, - NotTransfered, /* never tried to transfer */ - Transfered, /* transfer currently running */ - TransferFailed, /* transfer tried but failed */ - TransferSuccess, /* block transfer succeeded. */ - Fail - }; + QPointer _file; + qint64 _read; + qint64 _size; + qint64 _start; + BandwidthManager* _bandwidthManager; - int _sequenceNo; - int64_t _start; - int64_t _size; + qint64 _bandwidthQuota; + qint64 _readWithProgress; - State _state; - int _httpResultCode; - QString _httpErrorMsg; - QString _etag; - QBuffer *_buffer; + UploadDevice(QIODevice *file, qint64 start, qint64 size, BandwidthManager *bwm); + ~UploadDevice(); + virtual qint64 writeData(const char* , qint64 ); + virtual qint64 readData(char* data, qint64 maxlen); + virtual bool atEnd() const; + virtual qint64 size() const; + qint64 bytesAvailable() const; + virtual bool isSequential() const; + virtual bool seek ( qint64 pos ); + void setBandwidthLimited(bool); + bool isBandwidthLimited() { return _bandwidthLimited; } + void setChoked(bool); + bool isChoked() { return _choked; } + void giveBandwidthQuota(qint64 bwq); +private: + bool _bandwidthLimited; // if _bandwidthQuota will be used + bool _choked; // if upload is paused (readData() will return 0) +protected slots: + void slotJobUploadProgress(qint64 sent, qint64 t); }; class PUTFileJob : public AbstractNetworkJob { diff --git a/src/libsync/propagator_legacy.cpp b/src/libsync/propagator_legacy.cpp index 8d9dda1d0..0e8561d45 100644 --- a/src/libsync/propagator_legacy.cpp +++ b/src/libsync/propagator_legacy.cpp @@ -56,6 +56,78 @@ static QByteArray get_etag_from_reply(ne_request *req) return ret; } +bool PropagateNeonJob::updateErrorFromSession(int neon_code, ne_request* req, int ignoreHttpCode) +{ + if( neon_code != NE_OK ) { + qDebug("Neon error code was %d", neon_code); + } + + QString errorString; + int httpStatusCode = 0; + + switch(neon_code) { + case NE_OK: /* Success, but still the possiblity of problems */ + if( req ) { + const ne_status *status = ne_get_status(req); + + if (status) { + if ( status->klass == 2 || status->code == ignoreHttpCode) { + // Everything is ok, no error. + return false; + } + errorString = QString::fromUtf8( status->reason_phrase ); + httpStatusCode = status->code; + _item._httpErrorCode = httpStatusCode; + } + } else { + errorString = QString::fromUtf8(ne_get_error(_propagator->_session)); + httpStatusCode = errorString.mid(0, errorString.indexOf(QChar(' '))).toInt(); + _item._httpErrorCode = httpStatusCode; + if ((httpStatusCode >= 200 && httpStatusCode < 300) + || (httpStatusCode != 0 && httpStatusCode == ignoreHttpCode)) { + // No error + return false; + } + } + // FIXME: classify the error + done (SyncFileItem::NormalError, errorString); + return true; + case NE_ERROR: /* Generic error; use ne_get_error(session) for message */ + errorString = QString::fromUtf8(ne_get_error(_propagator->_session)); + // Check if we don't need to ignore that error. + httpStatusCode = errorString.mid(0, errorString.indexOf(QChar(' '))).toInt(); + _item._httpErrorCode = httpStatusCode; + qDebug() << Q_FUNC_INFO << "NE_ERROR" << errorString << httpStatusCode << ignoreHttpCode; + if (ignoreHttpCode && httpStatusCode == ignoreHttpCode) + return false; + + done(SyncFileItem::NormalError, errorString); + return true; + case NE_LOOKUP: /* Server or proxy hostname lookup failed */ + case NE_AUTH: /* User authentication failed on server */ + case NE_PROXYAUTH: /* User authentication failed on proxy */ + case NE_CONNECT: /* Could not connect to server */ + case NE_TIMEOUT: /* Connection timed out */ + done(SyncFileItem::FatalError, QString::fromUtf8(ne_get_error(_propagator->_session))); + return true; + case NE_FAILED: /* The precondition failed */ + case NE_RETRY: /* Retry request (ne_end_request ONLY) */ + case NE_REDIRECT: /* See ne_redirect.h */ + default: + done(SyncFileItem::SoftError, QString::fromUtf8(ne_get_error(_propagator->_session))); + return true; + } + return false; +} + +void UpdateMTimeAndETagJob::start() +{ + QScopedPointer uri( + ne_path_escape((_propagator->_remoteDir + _item._file).toUtf8())); + if (!updateMTimeAndETag(uri.data(), _item._modtime)) + return; + done(SyncFileItem::Success); +} void PropagateUploadFileLegacy::start() { @@ -640,6 +712,7 @@ void PropagateDownloadFileLegacy::start() FileSystem::setFileHidden(tmpFile.fileName(), false); QString error; + _propagator->addTouchedFile(fn); if (!FileSystem::renameReplace(tmpFile.fileName(), fn, &error)) { done(SyncFileItem::NormalError, error); return; diff --git a/src/libsync/propagator_legacy.h b/src/libsync/propagator_legacy.h index 083230ef3..f162ad239 100644 --- a/src/libsync/propagator_legacy.h +++ b/src/libsync/propagator_legacy.h @@ -16,9 +16,73 @@ #pragma once #include "propagatorjobs.h" +#include +#include +struct hbf_transfer_s; +struct ne_session_s; +typedef struct ne_prop_result_set_s ne_prop_result_set; + namespace OCC { + + +/* Helper for QScopedPointer<>, to be used as the deleter. + * QScopePointer will call the right overload of cleanup for the pointer it holds + */ +struct ScopedPointerHelpers { + static inline void cleanup(hbf_transfer_t *pointer) { if (pointer) hbf_free_transfer(pointer); } + static inline void cleanup(ne_request *pointer) { if (pointer) ne_request_destroy(pointer); } + static inline void cleanup(ne_decompress *pointer) { if (pointer) ne_decompress_destroy(pointer); } + // static inline void cleanup(ne_propfind_handler *pointer) { if (pointer) ne_propfind_destroy(pointer); } +}; + + +/* + * Abstract class for neon job. Lives in the neon thread + */ +class PropagateNeonJob : public PropagateItemJob { + Q_OBJECT +protected: + + /* Issue a PROPPATCH and PROPFIND to update the mtime, and fetch the etag + * Return true in case of success, and false if the PROPFIND failed and the + * error has been reported + */ + bool updateMTimeAndETag(const char *uri, time_t); + + /* fetch the error code and string from the session + in case of error, calls done with the error and returns true. + + If the HTTP error code is ignoreHTTPError, the error is ignored + */ + bool updateErrorFromSession(int neon_code = 0, ne_request *req = 0, int ignoreHTTPError = 0); + + /* + * to be called by the progress callback and will wait the amount of time needed. + */ + void limitBandwidth(qint64 progress, qint64 limit); + + QElapsedTimer _lastTime; + qint64 _lastProgress; + int _httpStatusCode; + +public: + PropagateNeonJob(OwncloudPropagator* propagator, const SyncFileItem &item) + : PropagateItemJob(propagator, item), _lastProgress(0), _httpStatusCode(0) { + moveToThread(propagator->_neonThread); + } + + JobParallelism parallelism() Q_DECL_OVERRIDE { return WaitForFinished; } +}; + +class UpdateMTimeAndETagJob : public PropagateNeonJob { + Q_OBJECT +public: + UpdateMTimeAndETagJob (OwncloudPropagator* propagator, const SyncFileItem& item) : PropagateNeonJob(propagator, item) {} + void start() Q_DECL_OVERRIDE; +}; + class PropagateUploadFileLegacy: public PropagateNeonJob { Q_OBJECT public: diff --git a/src/libsync/propagatorjobs.cpp b/src/libsync/propagatorjobs.cpp index d284d66fe..7778a89be 100644 --- a/src/libsync/propagatorjobs.cpp +++ b/src/libsync/propagatorjobs.cpp @@ -35,15 +35,6 @@ #include #include -#include -#include -#include -#include -#include -#include -#include -#include - #include @@ -135,99 +126,19 @@ void PropagateLocalMkdir::start() done(SyncFileItem::Success); } -/* The list of properties that is fetched in PropFind after a MKCOL */ -static const ne_propname ls_props[] = { - { "DAV:", "getetag"}, - { "http://owncloud.org/ns", "id"}, - { NULL, NULL } -}; - -/* - * Parse the PROPFIND result after a MKCOL - */ -void PropagateRemoteMkdir::propfind_results(void *userdata, - const ne_uri *uri, - const ne_prop_result_set *set) -{ - PropagateRemoteMkdir *job = static_cast(userdata); - - job->_item._etag = parseEtag(ne_propset_value( set, &ls_props[0] )); - - const char* fileId = ne_propset_value( set, &ls_props[1] ); - if (fileId) { - job->_item._fileId = fileId; - qDebug() << "MKCOL: " << uri << " FileID set it to " << fileId; - - // save the file id already so we can detect rename - SyncJournalFileRecord record(job->_item, job->_propagator->_localDir + job->_item._renameTarget); - job->_propagator->_journal->setFileRecord(record); - } -} - -/* - * Called after the headers have been recieved, try to extract the fileId - */ -void PropagateRemoteMkdir::post_headers(ne_request* req, void* userdata, const ne_status* ) -{ - const char *header = ne_get_response_header(req, "OC-FileId"); - if( header ) { - qDebug() << "MKCOL: " << static_cast(userdata)->_item._file << " FileID from header:" << header; - static_cast(userdata)->_item._fileId = header; - } -} - - -void PropagateRemoteMkdir::start() -{ - if (_propagator->_abortRequested.fetchAndAddRelaxed(0)) - return; - - QScopedPointer uri( - ne_path_escape((_propagator->_remoteDir + _item._file).toUtf8())); - - ne_hook_post_headers(_propagator->_session, post_headers, this); - - int rc = ne_mkcol(_propagator->_session, uri.data()); - - ne_unhook_post_headers(_propagator->_session, post_headers, this); - - - /* Special for mkcol: it returns 405 if the directory already exists. - * Ignore that error */ - // Wed, 15 Nov 1995 06:25:24 GMT - QDateTime dt = QDateTime::currentDateTimeUtc(); - _item._responseTimeStamp = dt.toString("hh:mm:ss"); - - if( updateErrorFromSession( rc , 0, 405 ) ) { - return; - } - - if (_item._fileId.isEmpty()) { - // Owncloud 7.0.0 and before did not have a header with the file id. - // (https://github.com/owncloud/core/issues/9000) - // So we must get the file id using a PROPFIND - // This is required so that wa can detect moves even if the folder is renamed on the server - // while files are still uploading - ne_propfind_handler *hdl = ne_propfind_create(_propagator->_session, uri.data(), 0); - ne_propfind_named(hdl, ls_props, propfind_results, this); - ne_propfind_destroy(hdl); - } - - done(SyncFileItem::Success); -} - - void PropagateLocalRename::start() { if (_propagator->_abortRequested.fetchAndAddRelaxed(0)) return; + QString existingFile = _propagator->getFilePath(_item._file); + QString targetFile = _propagator->getFilePath(_item._renameTarget); + // if the file is a file underneath a moved dir, the _item.file is equal // to _item.renameTarget and the file is not moved as a result. if (_item._file != _item._renameTarget) { emit progress(_item, 0); - qDebug() << "MOVE " << _propagator->_localDir + _item._file << " => " << _propagator->_localDir + _item._renameTarget; - QFile file(_propagator->_localDir + _item._file); + qDebug() << "MOVE " << existingFile << " => " << targetFile; if (QString::compare(_item._file, _item._renameTarget, Qt::CaseInsensitive) != 0 && _propagator->localFileNameClash(_item._renameTarget)) { @@ -240,7 +151,11 @@ void PropagateLocalRename::start() .arg(QDir::toNativeSeparators(_item._file)).arg(QDir::toNativeSeparators(_item._renameTarget)) ); return; } - if (!file.rename(_propagator->_localDir + _item._file, _propagator->_localDir + _item._renameTarget)) { + + _propagator->addTouchedFile(existingFile); + _propagator->addTouchedFile(targetFile); + QFile file(existingFile); + if (!file.rename(targetFile)) { done(SyncFileItem::NormalError, file.errorString()); return; } @@ -251,7 +166,7 @@ void PropagateLocalRename::start() // store the rename file name in the item. _item._file = _item._renameTarget; - SyncJournalFileRecord record(_item, _propagator->_localDir + _item._renameTarget); + SyncJournalFileRecord record(_item, targetFile); record._path = _item._renameTarget; if (!_item._isDirectory) { // Directory are saved at the end @@ -263,79 +178,4 @@ void PropagateLocalRename::start() done(SyncFileItem::Success); } -bool PropagateNeonJob::updateErrorFromSession(int neon_code, ne_request* req, int ignoreHttpCode) -{ - if( neon_code != NE_OK ) { - qDebug("Neon error code was %d", neon_code); - } - - QString errorString; - int httpStatusCode = 0; - - switch(neon_code) { - case NE_OK: /* Success, but still the possiblity of problems */ - if( req ) { - const ne_status *status = ne_get_status(req); - - if (status) { - if ( status->klass == 2 || status->code == ignoreHttpCode) { - // Everything is ok, no error. - return false; - } - errorString = QString::fromUtf8( status->reason_phrase ); - httpStatusCode = status->code; - _item._httpErrorCode = httpStatusCode; - } - } else { - errorString = QString::fromUtf8(ne_get_error(_propagator->_session)); - httpStatusCode = errorString.mid(0, errorString.indexOf(QChar(' '))).toInt(); - _item._httpErrorCode = httpStatusCode; - if ((httpStatusCode >= 200 && httpStatusCode < 300) - || (httpStatusCode != 0 && httpStatusCode == ignoreHttpCode)) { - // No error - return false; - } - } - // FIXME: classify the error - done (SyncFileItem::NormalError, errorString); - return true; - case NE_ERROR: /* Generic error; use ne_get_error(session) for message */ - errorString = QString::fromUtf8(ne_get_error(_propagator->_session)); - // Check if we don't need to ignore that error. - httpStatusCode = errorString.mid(0, errorString.indexOf(QChar(' '))).toInt(); - _item._httpErrorCode = httpStatusCode; - qDebug() << Q_FUNC_INFO << "NE_ERROR" << errorString << httpStatusCode << ignoreHttpCode; - if (ignoreHttpCode && httpStatusCode == ignoreHttpCode) - return false; - - done(SyncFileItem::NormalError, errorString); - return true; - case NE_LOOKUP: /* Server or proxy hostname lookup failed */ - case NE_AUTH: /* User authentication failed on server */ - case NE_PROXYAUTH: /* User authentication failed on proxy */ - case NE_CONNECT: /* Could not connect to server */ - case NE_TIMEOUT: /* Connection timed out */ - done(SyncFileItem::FatalError, QString::fromUtf8(ne_get_error(_propagator->_session))); - return true; - case NE_FAILED: /* The precondition failed */ - case NE_RETRY: /* Retry request (ne_end_request ONLY) */ - case NE_REDIRECT: /* See ne_redirect.h */ - default: - done(SyncFileItem::SoftError, QString::fromUtf8(ne_get_error(_propagator->_session))); - return true; - } - return false; -} - -void UpdateMTimeAndETagJob::start() -{ - QScopedPointer uri( - ne_path_escape((_propagator->_remoteDir + _item._file).toUtf8())); - if (!updateMTimeAndETag(uri.data(), _item._modtime)) - return; - done(SyncFileItem::Success); -} - - - } diff --git a/src/libsync/propagatorjobs.h b/src/libsync/propagatorjobs.h index d321cd663..3abe6dcc7 100644 --- a/src/libsync/propagatorjobs.h +++ b/src/libsync/propagatorjobs.h @@ -17,59 +17,11 @@ #include "owncloudpropagator.h" #include -#include #include #include namespace OCC { -/* Helper for QScopedPointer<>, to be used as the deleter. - * QScopePointer will call the right overload of cleanup for the pointer it holds - */ -struct ScopedPointerHelpers { - static inline void cleanup(hbf_transfer_t *pointer) { if (pointer) hbf_free_transfer(pointer); } - static inline void cleanup(ne_request *pointer) { if (pointer) ne_request_destroy(pointer); } - static inline void cleanup(ne_decompress *pointer) { if (pointer) ne_decompress_destroy(pointer); } -// static inline void cleanup(ne_propfind_handler *pointer) { if (pointer) ne_propfind_destroy(pointer); } -}; - -/* - * Abstract class for neon job. Lives in the neon thread - */ -class PropagateNeonJob : public PropagateItemJob { - Q_OBJECT -protected: - - /* Issue a PROPPATCH and PROPFIND to update the mtime, and fetch the etag - * Return true in case of success, and false if the PROPFIND failed and the - * error has been reported - */ - bool updateMTimeAndETag(const char *uri, time_t); - - /* fetch the error code and string from the session - in case of error, calls done with the error and returns true. - - If the HTTP error code is ignoreHTTPError, the error is ignored - */ - bool updateErrorFromSession(int neon_code = 0, ne_request *req = 0, int ignoreHTTPError = 0); - - /* - * to be called by the progress callback and will wait the amount of time needed. - */ - void limitBandwidth(qint64 progress, qint64 limit); - - QElapsedTimer _lastTime; - qint64 _lastProgress; - int _httpStatusCode; - -public: - PropagateNeonJob(OwncloudPropagator* propagator, const SyncFileItem &item) - : PropagateItemJob(propagator, item), _lastProgress(0), _httpStatusCode(0) { - moveToThread(propagator->_neonThread); - } - -}; - class PropagateLocalRemove : public PropagateItemJob { Q_OBJECT public: @@ -83,29 +35,12 @@ public: void start() Q_DECL_OVERRIDE; }; -class PropagateRemoteMkdir : public PropagateNeonJob { - Q_OBJECT -public: - PropagateRemoteMkdir (OwncloudPropagator* propagator,const SyncFileItem& item) : PropagateNeonJob(propagator, item) {} - void start() Q_DECL_OVERRIDE; -private: - static void propfind_results(void *userdata, const ne_uri *uri, const ne_prop_result_set *set); - static void post_headers(ne_request *req, void *userdata, const ne_status *status); - friend class PropagateDirectory; // So it can access the _item; -}; class PropagateLocalRename : public PropagateItemJob { Q_OBJECT public: PropagateLocalRename (OwncloudPropagator* propagator,const SyncFileItem& item) : PropagateItemJob(propagator, item) {} void start() Q_DECL_OVERRIDE; -}; - -// To support older owncloud in the -class UpdateMTimeAndETagJob : public PropagateNeonJob{ - Q_OBJECT -public: - UpdateMTimeAndETagJob (OwncloudPropagator* propagator, const SyncFileItem& item) : PropagateNeonJob(propagator, item) {} - void start() Q_DECL_OVERRIDE; + JobParallelism parallelism() Q_DECL_OVERRIDE { return WaitForFinishedInParentDirectory; } }; diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp index 76f0ca916..abb8172bb 100644 --- a/src/libsync/syncengine.cpp +++ b/src/libsync/syncengine.cpp @@ -181,7 +181,7 @@ QString SyncEngine::csyncErrorToString(CSYNC_STATUS err) errStr = tr("Aborted by the user"); break; case CSYNC_STATUS_SERVICE_UNAVAILABLE: - errStr = tr("The mounted directory is temporary not available on the server"); + errStr = tr("The mounted directory is temporarily not available on the server"); break; default: errStr = tr("An internal error number %1 happened.").arg( (int) err ); @@ -559,6 +559,14 @@ void SyncEngine::startSync() qDebug() << "=====sync with existing DB"; } + qDebug() << "=====Using Qt" << qVersion(); +#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) + qDebug() << "=====Using SSL library version" + << QSslSocket::sslLibraryVersionString().toUtf8().data(); +#endif + // Note that this seems to output the OpenSSL build version not runtime version: + qDebug() << "=====Using" << ne_version_string(); + fileRecordCount = _journal->getFileRecordCount(); // this creates the DB if it does not exist yet bool isUpdateFrom_1_5 = _journal->isUpdateFrom_1_5(); @@ -712,9 +720,6 @@ void SyncEngine::slotDiscoveryJobFinished(int discoveryResult) } } - if (_needsUpdate) - emit(started()); - ne_session_s *session = 0; // that call to set property actually is a get which will return the session csync_set_module_property(_csync_ctx, "get_dav_session", &session); @@ -735,8 +740,8 @@ void SyncEngine::slotDiscoveryJobFinished(int discoveryResult) // do a database commit _journal->commit("post treewalk"); - _propagator.reset(new OwncloudPropagator (session, _localPath, _remoteUrl, _remotePath, - _journal, &_thread)); + _propagator = QSharedPointer( + new OwncloudPropagator (session, _localPath, _remoteUrl, _remotePath, _journal, &_thread)); connect(_propagator.data(), SIGNAL(completed(SyncFileItem)), this, SLOT(slotJobCompleted(SyncFileItem))); connect(_propagator.data(), SIGNAL(progress(SyncFileItem,quint64)), @@ -752,6 +757,10 @@ void SyncEngine::slotDiscoveryJobFinished(int discoveryResult) deleteStaleBlacklistEntries(); _journal->commit("post stale entry removal"); + // Emit the started signal only after the propagator has been set up. + if (_needsUpdate) + emit(started()); + _propagator->start(_syncedItems); } @@ -838,9 +847,11 @@ void SyncEngine::finalize() qDebug() << "CSync run took " << _stopWatch.addLapTime(QLatin1String("Sync Finished")); _stopWatch.stop(); - _propagator.reset(0); _syncRunning = false; emit finished(); + + // Delete the propagator only after emitting the signal. + _propagator.clear(); } void SyncEngine::slotProgress(const SyncFileItem& item, quint64 current) @@ -1126,6 +1137,16 @@ bool SyncEngine::estimateState(QString fn, csync_ftw_type_e t, SyncFileStatus* s return false; } +qint64 SyncEngine::timeSinceFileTouched(const QString& fn) const +{ + // This copy is essential for thread safety. + QSharedPointer prop = _propagator; + if (prop) { + return prop->timeSinceFileTouched(fn); + } + return -1; +} + void SyncEngine::abort() { csync_request_abort(_csync_ctx); diff --git a/src/libsync/syncengine.h b/src/libsync/syncengine.h index 848a1a6d1..fc01eb549 100644 --- a/src/libsync/syncengine.h +++ b/src/libsync/syncengine.h @@ -69,6 +69,12 @@ public: bool estimateState(QString fn, csync_ftw_type_e t, SyncFileStatus* s); + /** Get the ms since a file was touched, or -1 if it wasn't. + * + * Thread-safe. + */ + qint64 timeSinceFileTouched(const QString& fn) const; + signals: void csyncError( const QString& ); void csyncUnavailable(); @@ -140,7 +146,7 @@ private: QString _remoteUrl; QString _remotePath; SyncJournalDb *_journal; - QScopedPointer _propagator; + QSharedPointer _propagator; QString _lastDeleted; // if the last item was a path and it has been deleted QSet _seenFiles; QThread _thread; diff --git a/src/libsync/syncjournaldb.cpp b/src/libsync/syncjournaldb.cpp index d006816e6..78fc2e3cf 100644 --- a/src/libsync/syncjournaldb.cpp +++ b/src/libsync/syncjournaldb.cpp @@ -158,11 +158,6 @@ bool SyncJournalDb::checkConnect() return sqlFail("Set PRAGMA case_sensitivity", pragma1); } - // Hide 'em all! - FileSystem::setFileHidden(databaseFilePath(), true); - FileSystem::setFileHidden(databaseFilePath() + "-wal", true); - FileSystem::setFileHidden(databaseFilePath() + "-shm", true); - /* Because insert are so slow, e do everything in a transaction, and one need to call commit */ startTransaction(); @@ -349,6 +344,11 @@ bool SyncJournalDb::checkConnect() // don't start a new transaction now commitInternal(QString("checkConnect End"), false); + // Hide 'em all! + FileSystem::setFileHidden(databaseFilePath(), true); + FileSystem::setFileHidden(databaseFilePath() + "-wal", true); + FileSystem::setFileHidden(databaseFilePath() + "-shm", true); + return rc; } @@ -1164,8 +1164,9 @@ void SyncJournalDb::setPollInfo(const SyncJournalDb::PollInfo& info) } if (info._url.isEmpty()) { + qDebug() << "Deleting Poll job" << info._file; SqlQuery query("DELETE FROM poll WHERE path=?", _db); - query.bindValue(0, info._file); + query.bindValue(1, info._file); if( !query.exec() ) { qDebug() << "SQL error in setPollInfo: "<< query.error(); } else { @@ -1173,9 +1174,9 @@ void SyncJournalDb::setPollInfo(const SyncJournalDb::PollInfo& info) } } else { SqlQuery query("INSERT OR REPLACE INTO poll (path, modtime, pollpath) VALUES( ? , ? , ? )", _db); - query.bindValue(0, info._file); - query.bindValue(1, QString::number(info._modtime)); - query.bindValue(2, info._url); + query.bindValue(1, info._file); + query.bindValue(2, QString::number(info._modtime)); + query.bindValue(3, info._url); if( !query.exec() ) { qDebug() << "SQL error in setPollInfo: "<< query.error(); } else { diff --git a/src/libsync/syncjournaldb.h b/src/libsync/syncjournaldb.h index c174ff6cb..2f82f4b4e 100644 --- a/src/libsync/syncjournaldb.h +++ b/src/libsync/syncjournaldb.h @@ -154,10 +154,12 @@ private: QList _avoidReadFromDbOnNextSyncFilter; }; -bool operator==(const SyncJournalDb::DownloadInfo & lhs, - const SyncJournalDb::DownloadInfo & rhs); -bool operator==(const SyncJournalDb::UploadInfo & lhs, - const SyncJournalDb::UploadInfo & rhs); +bool OWNCLOUDSYNC_EXPORT +operator==(const SyncJournalDb::DownloadInfo & lhs, + const SyncJournalDb::DownloadInfo & rhs); +bool OWNCLOUDSYNC_EXPORT +operator==(const SyncJournalDb::UploadInfo & lhs, + const SyncJournalDb::UploadInfo & rhs); } // namespace OCC #endif // SYNCJOURNALDB_H diff --git a/src/libsync/syncjournalfilerecord.h b/src/libsync/syncjournalfilerecord.h index 3c8e1599e..aac9ce0fb 100644 --- a/src/libsync/syncjournalfilerecord.h +++ b/src/libsync/syncjournalfilerecord.h @@ -44,8 +44,9 @@ public: int _mode; }; -bool operator==(const SyncJournalFileRecord & lhs, - const SyncJournalFileRecord & rhs); +bool OWNCLOUDSYNC_EXPORT +operator==(const SyncJournalFileRecord & lhs, + const SyncJournalFileRecord & rhs); class SyncJournalBlacklistRecord { diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 9075449f4..40a076a28 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -27,8 +27,8 @@ endif(UNIX AND NOT APPLE) owncloud_add_test(CSyncSqlite "") owncloud_add_test(NetrcParser ../src/cmd/netrcparser.cpp) -owncloud_add_test(OwnSql ../src/libsync/ownsql.cpp) -owncloud_add_test(SyncJournalDB ../src/libsync/syncjournaldb.cpp) +owncloud_add_test(OwnSql "") +owncloud_add_test(SyncJournalDB "") diff --git a/test/testfolderwatcher.h b/test/testfolderwatcher.h index 4fbf77326..c8f9834d3 100644 --- a/test/testfolderwatcher.h +++ b/test/testfolderwatcher.h @@ -10,7 +10,7 @@ #include -#include "folderwatcher_linux.h" +#include "folderwatcher.h" #include "utility.h" using namespace OCC; @@ -21,9 +21,12 @@ class TestFolderWatcher : public QObject public slots: void slotFolderChanged( const QString& path ) { - qDebug() << "COMPARE: " << path << _checkMark; - QVERIFY(_checkMark == path); - _checkMark.clear(); + if (_skipNotifications.contains(path)) { + return; + } + if (_requiredNotifications.contains(path)) { + _receivedNotifications.insert(path); + } } void slotEnd() { // in case something goes wrong... @@ -36,7 +39,16 @@ private: FolderWatcher *_watcher; QEventLoop _loop; QTimer _timer; - QString _checkMark; + QSet _requiredNotifications; + QSet _receivedNotifications; + QSet _skipNotifications; + + void processAndWait() + { + _loop.processEvents(); + Utility::usleep(200000); + _loop.processEvents(); + } private slots: void initTestCase() { @@ -52,68 +64,105 @@ private slots: rootDir.mkpath(_root + "/a2/b3/c3"); Utility::writeRandomFile( _root+"/a1/random.bin"); Utility::writeRandomFile( _root+"/a1/b2/todelete.bin"); - Utility::writeRandomFile( _root+"/a2/movefile"); + Utility::writeRandomFile( _root+"/a2/renamefile"); + Utility::writeRandomFile( _root+"/a1/movefile"); _watcher = new FolderWatcher(_root); - QObject::connect(_watcher, SIGNAL(folderChanged(QString)), this, SLOT(slotFolderChanged(QString))); - _timer.singleShot(3000, this, SLOT(slotEnd())); + QObject::connect(_watcher, SIGNAL(pathChanged(QString)), this, SLOT(slotFolderChanged(QString))); + _timer.singleShot(5000, this, SLOT(slotEnd())); + } + + void init() + { + _receivedNotifications.clear(); + _requiredNotifications.clear(); + _skipNotifications.clear(); + } + + void checkNotifications() + { + processAndWait(); + QCOMPARE(_receivedNotifications, _requiredNotifications); } void testACreate() { // create a new file + QString file(_root + "/foo.txt"); QString cmd; - _checkMark = _root; - cmd = QString("echo \"xyz\" > %1/foo.txt").arg(_root); + _requiredNotifications.insert(file); + cmd = QString("echo \"xyz\" > %1").arg(file); qDebug() << "Command: " << cmd; system(cmd.toLocal8Bit()); - _loop.processEvents(); - QVERIFY(_checkMark.isEmpty()); // the slot clears the checkmark. + checkNotifications(); } void testATouch() { // touch an existing file. + QString file(_root + "/a1/random.bin"); + _requiredNotifications.insert(file); +#ifdef Q_OS_WIN + Utility::writeRandomFile(QString("%1/a1/random.bin").arg(_root)); +#else QString cmd; - cmd = QString("/usr/bin/touch %1/a1/random.bin").arg(_root); - _checkMark = _root+"/a1"; + cmd = QString("/usr/bin/touch %1").arg(file); qDebug() << "Command: " << cmd; system(cmd.toLocal8Bit()); +#endif - _loop.processEvents(); - QVERIFY(_checkMark.isEmpty()); // the slot clears the checkmark. + checkNotifications(); } void testCreateADir() { - _checkMark = _root+"/a1/b1"; + QString file(_root+"/a1/b1/new_dir"); + _requiredNotifications.insert(file); + //_skipNotifications.insert(_root + "/a1/b1/new_dir"); QDir dir; - dir.mkdir( _root + "/a1/b1/new_dir"); - QVERIFY(QFile::exists(_root + "/a1/b1/new_dir")); - _loop.processEvents(); - QVERIFY(_checkMark.isEmpty()); // the slot clears the checkmark. + dir.mkdir(file); + QVERIFY(QFile::exists(file)); + + checkNotifications(); } void testRemoveADir() { - _checkMark = _root+"/a1/b3"; + QString file(_root+"/a1/b3/c3"); + _requiredNotifications.insert(file); QDir dir; - QVERIFY(dir.rmdir(_root+"/a1/b3/c3")); - _loop.processEvents(); - QVERIFY(_checkMark.isEmpty()); // the slot clears the checkmark. + QVERIFY(dir.rmdir(file)); + + checkNotifications(); } void testRemoveAFile() { - _checkMark = _root+"/a1/b2"; - QVERIFY(QFile::exists(_root+"/a1/b2/todelete.bin")); - QFile::remove(_root+"/a1/b2/todelete.bin"); - QVERIFY(!QFile::exists(_root+"/a1/b2/todelete.bin")); - _loop.processEvents(); - QVERIFY(_checkMark.isEmpty()); // the slot clears the checkmark. + QString file(_root+"/a1/b2/todelete.bin"); + _requiredNotifications.insert(file); + QVERIFY(QFile::exists(file)); + QFile::remove(file); + QVERIFY(!QFile::exists(file)); + + checkNotifications(); + } + + void testRenameAFile() { + QString file1(_root+"/a2/renamefile"); + QString file2(_root+"/a2/renamefile.renamed"); + _requiredNotifications.insert(file1); + _requiredNotifications.insert(file2); + QVERIFY(QFile::exists(file1)); + QFile::rename(file1, file2); + QVERIFY(QFile::exists(file2)); + + checkNotifications(); } void testMoveAFile() { - _checkMark = _root+"/a2"; - QVERIFY(QFile::exists(_root+"/a2/movefile")); - QFile::rename(_root+"/a2/movefile", _root+"/a2/movefile.renamed" ); - QVERIFY(QFile::exists(_root+"/a2/movefile.renamed")); - _loop.processEvents(); - QVERIFY(_checkMark.isEmpty()); // the slot clears the checkmark. + QString old_file(_root+"/a1/movefile"); + QString new_file(_root+"/a2/movefile.renamed"); + _requiredNotifications.insert(old_file); + _requiredNotifications.insert(new_file); + QVERIFY(QFile::exists(old_file)); + QFile::rename(old_file, new_file); + QVERIFY(QFile::exists(new_file)); + + checkNotifications(); } void cleanupTestCase() { diff --git a/translations/mirall_ca.ts b/translations/mirall_ca.ts index fff6dd6cf..915f77fab 100644 --- a/translations/mirall_ca.ts +++ b/translations/mirall_ca.ts @@ -386,12 +386,12 @@ Temps restant total %5 Activitat de sincronització - + Could not read system exclude file - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -400,17 +400,17 @@ Això podria ser perquè la carpeta ha estat reconfigurada silenciosament, o que Esteu segur que voleu executar aquesta operació? - + Remove All Files? Esborra tots els fitxers? - + Remove all files Esborra tots els fitxers - + Keep files Mantén els fitxers @@ -637,22 +637,22 @@ Esteu segur que voleu executar aquesta operació? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway No s'ha rebut cap E-Tag del servidor, comproveu el Proxy/Gateway - + We received a different E-Tag for resuming. Retrying next time. Hem rebut un E-Tag diferent en la represa. Es comprovarà la pròxima vegada. - + Server returned wrong content-range - + Connection Timeout Temps de connexió excedit @@ -1113,8 +1113,12 @@ No és aconsellada usar-la. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - No s'ha pogut connectar de forma segura. Voleu connectar sense encriptació (no recomanat)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + @@ -1306,27 +1310,27 @@ No és aconsellada usar-la. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. L'usuari ha aturat la sincronització. - + No E-Tag received from server, check Proxy/Gateway No s'ha rebut cap E-Tag del servidor, comproveu el Proxy/Gateway - + We received a different E-Tag for resuming. Retrying next time. hem rebut un E-Tag diferent en la represa. Es comprovarà la pròxima vegada. - + Server returned wrong content-range - + File %1 can not be downloaded because of a local file name clash! El fitxer %1 no es pot baixar perquè hi ha un xoc amb el nom d'un fitxer local! @@ -1334,12 +1338,17 @@ No és aconsellada usar-la. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! El fitxer %1 no es pot baixar perquè hi ha un xoc amb el nom d'un fitxer local! - + + The file could not be downloaded completely. + + + + File %1 cannot be saved because of a local file name clash! @@ -1425,18 +1434,18 @@ No és aconsellada usar-la. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely El fitxer local ha canviat durant la sincronització, es sincronitzarà quan arribi complet - + Sync was aborted by user. L'usuari ha aturat la sincronització. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. El fitxer s'ha editat localment però és part d'una compartició només de lectura. S'ha restaurat i la vostra edició és en el fitxer conflictiu. @@ -1444,23 +1453,23 @@ No és aconsellada usar-la. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. El fitxer s'ha editat localment però és part d'una compartició només de lectura. S'ha restaurat i la vostra edició és en el fitxer en conflicte. - + The local file was removed during sync. El fitxer local s'ha eliminat durant la sincronització. - + Local file changed during sync. El fitxer local ha canviat durant la sincronització. - + The server did not acknowledge the last chunk. (No e-tag were present) El servidor no ha reconegut l'últim fragment. (No hi havia e-Tag) @@ -1538,16 +1547,27 @@ No és aconsellada usar-la. L'estat de sincronització s'ha copiat al porta-retalls. - - Currently no files are ignored because of previous errors. - Actualment no s'ha ignorat cap fitxer a causa d'errors anteriors. + + Currently no files are ignored because of previous errors and no downloads are in progress. + - + %n files are ignored because of previous errors. - Try to sync these again. + + + + %n files are partially downloaded. + + + + + + Try to sync these again. + + Mirall::SelectiveSyncDialog @@ -1634,12 +1654,12 @@ No és aconsellada usar-la. Mirall::ShibbolethCredentials - + Login Error Error d'accés - + You must sign in as user %1 Cal identificar-se com a usuari %1 @@ -2047,69 +2067,69 @@ No és aconsellada usar-la. El fitxer conté caràcters no vàlids que no es poden sincronitzar entre plataformes. - + Unable to initialize a sync journal. No es pot inicialitzar un periòdic de sincronització - + Cannot open the sync journal No es pot obrir el diari de sincronització - - + + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add sub-directories in that directory No es permet perquè no teniu permisos per afegir subcarpetes en aquesta carpeta - + Not allowed because you don't have permission to add parent directory No es permet perquè no teniu permisos per afegir una carpeta inferior - + Not allowed because you don't have permission to add files in that directory No es permet perquè no teniu permisos per afegir fitxers en aquesta carpeta - + 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 diff --git a/translations/mirall_cs.ts b/translations/mirall_cs.ts index f331fea6e..7b85addc6 100644 --- a/translations/mirall_cs.ts +++ b/translations/mirall_cs.ts @@ -198,7 +198,7 @@ Discovering '%1' - Hledám '%1' + Prohledávám '%1' @@ -386,12 +386,12 @@ Celkový zbývající čas %5 Průběh synchronizace - + Could not read system exclude file Nezdařilo se přečtení systémového exclude souboru - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -400,17 +400,17 @@ Toto může být způsobeno změnou v nastavení synchronizace složky nebo tím Opravdu chcete provést tuto akci? - + Remove All Files? Odstranit všechny soubory? - + Remove all files Odstranit všechny soubory - + Keep files Ponechat soubory @@ -637,22 +637,22 @@ Opravdu chcete provést tuto akci? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway Ze serveru nebyl obdržen E-Tag, zkontrolujte proxy/bránu - + We received a different E-Tag for resuming. Retrying next time. Obdrželi jsme jiný E-Tag pro pokračování. Zkusím znovu příště. - + Server returned wrong content-range Server odpověděl chybným rozsahem obsahu - + Connection Timeout Vypršel čas spojení @@ -1113,8 +1113,16 @@ Nedoporučuje se jí používat. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - Nemohu se připojit zabezpečeně. Přejete si místo toho připojit nezabezpečeně (nedoporučuje se)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + Nelze se připojit zabezpečeně: + +%1 + +Chcete se místo toho připojit nezabezpečeně (nedoporučuje se)? @@ -1306,27 +1314,27 @@ Nedoporučuje se jí používat. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. Synchronizace zrušena uživatelem. - + No E-Tag received from server, check Proxy/Gateway Ze serveru nebyl obdržen E-Tag, zkontrolujte proxy/bránu - + We received a different E-Tag for resuming. Retrying next time. Obdrželi jsme jiný E-Tag pro pokračování. Zkusím znovu příště. - + Server returned wrong content-range Server odpověděl chybným rozsahem obsahu - + File %1 can not be downloaded because of a local file name clash! Soubor %1 nemohl být stažen z důvodu kolize názvu se souborem v místním systému! @@ -1334,12 +1342,17 @@ Nedoporučuje se jí používat. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! Soubor %1 nemohl být stažen z důvodu kolize názvu se souborem v místním systému! - + + The file could not be downloaded completely. + Soubor nemohl být kompletně stažen. + + + File %1 cannot be saved because of a local file name clash! Soubor %1 nemohl být uložen z důvodu kolize názvu se souborem v místním systému! @@ -1380,7 +1393,7 @@ Nedoporučuje se jí používat. Could not remove directory '%1'; - Nezdařilo se odstranění adresáře '%1'; + Nepodařilo se odstranit adresář '%1'; @@ -1425,18 +1438,18 @@ Nedoporučuje se jí používat. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely Místní soubor byl změněn během synchronizace, bude sesynchronizován, jakmile bude kompletní - + Sync was aborted by user. Synchronizace zrušena uživatelem. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Soubor zde byl editován, ale je součástí sdílení pouze pro čtení. Původní soubor byl obnoven a editovaná verze je uložena v konfliktním souboru. @@ -1444,23 +1457,23 @@ Nedoporučuje se jí používat. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Soubor zde byl editován, ale je součástí sdílení pouze pro čtení. Původní soubor byl obnoven a editovaná verze je uložena v konfliktním souboru. - + The local file was removed during sync. Místní soubor byl odstraněn během synchronizace. - + Local file changed during sync. Místní soubor byl změněn během synchronizace. - + The server did not acknowledge the last chunk. (No e-tag were present) Server nepotvrdil poslední část dat. (Nebyl nalezen e-tag) @@ -1538,18 +1551,32 @@ Nedoporučuje se jí používat. Stav synchronizace byl zkopírován do schránky. - - Currently no files are ignored because of previous errors. - Nyní nejsou v seznamu ignorovaných žádné soubory kvůli předchozím chybám. + + Currently no files are ignored because of previous errors and no downloads are in progress. + V současné době nejsou na černé listině žádné soubory kvůli předchozím chybovým stavům a neprobíhá žádné stahování. - + %n files are ignored because of previous errors. - Try to sync these again. - %n soubor je ignorován kvůli předchozím chybovým hlášením. -Zkuste ho znovu synchronizovat.%n soubory jsou ignorovány kvůli předchozím chybovým hlášením. -Zkuste je znovu synchronizovat.%n souborů je ignorováno kvůli předchozím chybovým hlášením. -Zkuste je znovu synchronizovat. + + %n soubor je ignorován kvůli předchozím chybovým hlášením. +%n soubory jsou ignorovány kvůli předchozím chybovým hlášením. +%n souborů je ignorováno kvůli předchozím chybovým hlášením. + + + + + %n files are partially downloaded. + + %n soubor je částečně stažený. +%n soubory jsou částečně stažené. +%n souborů je částečně staženo. + + + + + Try to sync these again. + Zkuste je znovu synchronizovat. @@ -1562,7 +1589,7 @@ Zkuste je znovu synchronizovat. Unchecked folders will be <b>removed</b> from your local file system and will not be synchronized to this computer anymore - Neoznačené adresáře budou <b>odstraněny</b> z lokálního souborového systému a nebudou již synchronizovány na tento počítač + Neoznačené adresáře budou <b>odstraněny</b> z místního souborového systému a nebudou již synchronizovány na tento počítač @@ -1637,12 +1664,12 @@ Zkuste je znovu synchronizovat. Mirall::ShibbolethCredentials - + Login Error Chyba přihlášení - + You must sign in as user %1 Musíte se přihlásit jako uživatel %1 @@ -2050,69 +2077,69 @@ Zkuste je znovu synchronizovat. Soubor obsahuje alespoň jeden neplatný znak, který narušuje synchronizaci v prostředí více platforem. - + Unable to initialize a sync journal. Nemohu inicializovat synchronizační žurnál. - + Cannot open the sync journal Nelze otevřít synchronizační žurnál - - + + 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 sub-directories in that directory Není povoleno, protože nemáte oprávnění vytvářet podadresáře v tomto adresáři. - + Not allowed because you don't have permission to add parent directory Není povoleno, protože nemáte oprávnění vytvořit rodičovský adresář - + Not allowed because you don't have permission to add files in that directory Není povoleno, protože nemáte oprávnění přidávat soubory 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 @@ -2248,7 +2275,7 @@ Zkuste je znovu synchronizovat. Discovering '%1' - Hledám '%1' + Prohledávám '%1' diff --git a/translations/mirall_de.ts b/translations/mirall_de.ts index b6572315e..f94a87abe 100644 --- a/translations/mirall_de.ts +++ b/translations/mirall_de.ts @@ -387,12 +387,12 @@ Gesamtzeit übrig %5 Synchronisierungsaktivität - + Could not read system exclude file Systemeigene Ausschlussdatei kann nicht gelesen werden - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -401,17 +401,17 @@ Vielleicht wurde der Ordner neu konfiguriert, oder alle Dateien wurden händisch Sind Sie sicher, dass sie diese Operation durchführen wollen? - + Remove All Files? Alle Dateien löschen? - + Remove all files Lösche alle Dateien - + Keep files Dateien behalten @@ -461,7 +461,7 @@ Sind Sie sicher, dass sie diese Operation durchführen wollen? Setup Error. - Setup-Fehler. + Installationsfehler. @@ -638,22 +638,22 @@ Sind Sie sicher, dass sie diese Operation durchführen wollen? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway Kein E-Tag vom Server empfangen, bitte Proxy / Gateway überprüfen - + We received a different E-Tag for resuming. Retrying next time. Es wurde ein unterschiedlicher E-Tag zum Fortfahren empfangen. Bitte beim nächsten mal nochmal versuchen. - + Server returned wrong content-range Server hat falschen Bereich für den Inhalt zurück gegeben - + Connection Timeout Zeitüberschreitung der Verbindung @@ -744,7 +744,7 @@ Aktivierte Elemente werden ebenfalls gelöscht, wenn diese das Löschen eines Ve Could not open file - Konnte Datei nicht öffnen + Datei konnte nicht geöffnet werden @@ -840,7 +840,7 @@ Aktivierte Elemente werden ebenfalls gelöscht, wenn diese das Löschen eines Ve <nobr>File '%1'<br/>cannot be opened for writing.<br/><br/>The log output can <b>not</b> be saved!</nobr> - <nobr>Datei '%1'<br/>kann nicht zum Schreiben geöffnet werden.<br/><br/>Die Protokolldatei kann <b>nicht</b> gespeichert werden!</nobr> + <nobr>Datei »%1«<br/>kann nicht zum Schreiben geöffnet werden.<br/><br/>Die Protokolldatei kann <b>nicht</b> gespeichert werden!</nobr> @@ -1114,8 +1114,16 @@ Es ist nicht ratsam, diese zu benutzen. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - Die Verbindung kann nicht sicher hergestellt werden. Möchten Sie stattdessen unverschlüsselt verbinden (nicht empfohlen)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + Die Verbindung kann nicht sicher hergestellt werden: + +%1 + +Möchten Sie stattdessen unverschlüsselt verbinden (nicht empfohlen)? @@ -1252,7 +1260,7 @@ Es ist nicht ratsam, diese zu benutzen. Can't remove and back up the folder because the folder or a file in it is open in another program. Please close the folder or file and hit retry or cancel the setup. - Kann den Ordner nicht entfernen und sichern, da der Ordner oder einer seiner Dateien in einem anderen Programm geöffnet ist. Bitte schließen Sie den Ordner ode die Datei oder beenden Sie das Setup. + Der Ordner kann nicht entfernt und gesichert werden, da der Ordner oder einer seiner Dateien in einem anderen Programm geöffnet ist. Bitte schließen Sie den Ordner oder die Datei oder beenden Sie die Installation. @@ -1307,27 +1315,27 @@ Es ist nicht ratsam, diese zu benutzen. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. Synchronisation wurde durch den Nutzer abgebrochen. - + No E-Tag received from server, check Proxy/Gateway Kein E-Tag vom Server empfangen, bitte Proxy / Gateway überprüfen - + We received a different E-Tag for resuming. Retrying next time. Es wurde ein unterschiedlicher E-Tag zum Fortfahren empfangen. Bitte beim nächsten mal nochmal versuchen. - + Server returned wrong content-range Server hat falschen Bereich für den Inhalt zurück gegeben - + File %1 can not be downloaded because of a local file name clash! Die Datei %1 kann aufgrund eines Konfliktes mit dem lokalen Dateinamen nicht herunter geladen werden! @@ -1335,12 +1343,17 @@ Es ist nicht ratsam, diese zu benutzen. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! Die Datei %1 kann aufgrund eines Konfliktes mit dem lokalen Dateinamen nicht herunter geladen werden! - + + The file could not be downloaded completely. + Die Datei konnte nicht vollständig herunter geladen werden. + + + File %1 cannot be saved because of a local file name clash! Die Datei %1 kann aufgrund eines Konfliktes mit dem lokalen Dateinamen nicht gespeichert geladen werden! @@ -1426,18 +1439,18 @@ Es ist nicht ratsam, diese zu benutzen. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely Eine lokale Datei wurde während der Synchronisation geändert, synchronisieren Sie nochmals sobald die aktuelle Datei vollständig angekommen ist - + Sync was aborted by user. Synchronisation wurde durch den Nutzer abgebrochen. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Die Datei wurde von einer Nur-Lese-Freigabe lokal bearbeitet. Die Datei wurde wiederhergestellt und Ihre Bearbeitung ist in der Konflikte-Datei. @@ -1445,23 +1458,23 @@ Es ist nicht ratsam, diese zu benutzen. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Die Datei wurde von einer Nur-Lese-Freigabe lokal bearbeitet. Die Datei wurde wiederhergestellt und Ihre Bearbeitung ist in der Konflikte-Datei. - + The local file was removed during sync. Die lokale Datei wurde während der Synchronisation gelöscht. - + Local file changed during sync. Eine lokale Datei wurde während der Synchronisation geändert. - + The server did not acknowledge the last chunk. (No e-tag were present) Der Server hat den letzten Block nicht bestätigt. (Der E-Tag war nicht vorhanden) @@ -1539,17 +1552,28 @@ Es ist nicht ratsam, diese zu benutzen. Der Synchronisationsstatus wurde in die Zwischenablage kopiert. - - Currently no files are ignored because of previous errors. - Aktuell werden keine Dateien, aufgrund vorheriger Fehler, ignoriert. + + Currently no files are ignored because of previous errors and no downloads are in progress. + Aktuell werden keine Dateien, aufgrund vorheriger Fehler und keine laufenden Downloads, ignoriert. - + %n files are ignored because of previous errors. - Try to sync these again. - %n Datei wurde aufgrund eines vorherigen Fehlers ignoriert. -Versuchen Sie diese nochmals zu synchronisieren.%n Dateien werden aufgrund vorheriger Fehler ignoriert. -Versuchen Sie diese nochmals zu synchronisieren. + + %n Datei wird aufgrund vorheriger Fehler ignoriert.%n Dateien werden aufgrund vorheriger Fehler ignoriert. + + + + + %n files are partially downloaded. + + %n Datei ist teilweise heruntergeladen.%n Dateien sind teilweise heruntergeladen. + + + + + Try to sync these again. + Versuchen, diese nochmals zu synchronisieren. @@ -1637,12 +1661,12 @@ Versuchen Sie diese nochmals zu synchronisieren. Mirall::ShibbolethCredentials - + Login Error Log-In Fehler - + You must sign in as user %1 Sie müssen sich als %1 einloggen @@ -2050,69 +2074,69 @@ Versuchen Sie diese nochmals zu synchronisieren. Die Datei beinhaltet ungültige Zeichen und kann nicht plattformübergreifend synchronisiert werden. - + Unable to initialize a sync journal. Synchronisationsbericht konnte nicht initialisiert werden. - + Cannot open the sync journal Synchronisationsbericht kann nicht geöffnet werden - - + + 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 sub-directories in that directory Nicht erlaubt, da Sie keine Rechte zur Erstellung von Unterordnern haben - + Not allowed because you don't have permission to add parent directory Nicht erlaubt, da Sie keine Rechte zur Erstellung von Hauptordnern haben - + Not allowed because you don't have permission to add files in that directory Nicht erlaubt, da Sie keine Rechte zum Hinzufügen von Dateien in diesen Ordner 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 @@ -2183,7 +2207,7 @@ Versuchen Sie diese nochmals zu synchronisieren. Open folder '%1' - Ordner '%1' öffnen + Ordner »%1« öffnen @@ -2641,7 +2665,7 @@ Versuchen Sie diese nochmals zu synchronisieren. Setup Error - Setup-Fehler + Installationsfehler diff --git a/translations/mirall_el.ts b/translations/mirall_el.ts index 670822226..24d6f07ee 100644 --- a/translations/mirall_el.ts +++ b/translations/mirall_el.ts @@ -387,12 +387,12 @@ Total time left %5 Δραστηριότητα Συγχρονισμού - + Could not read system exclude file Αδυναμία ανάγνωσης αρχείου αποκλεισμού συστήματος - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -401,17 +401,17 @@ Are you sure you want to perform this operation? Είστε σίγουροι ότι θέλετε να εκτελέσετε αυτή τη λειτουργία; - + Remove All Files? Αφαίρεση Όλων των Αρχείων; - + Remove all files Αφαίρεση όλων των αρχείων - + Keep files Διατήρηση αρχείων @@ -638,22 +638,22 @@ Are you sure you want to perform this operation? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway Δεν ελήφθη E-Tag από το διακομιστή, ελέγξτε το διακομιστή μεσολάβησης/πύλη - + We received a different E-Tag for resuming. Retrying next time. Ελήφθη διαφορετικό E-Tag για συνέχιση. Επανάληψη την επόμενη φορά. - + Server returned wrong content-range Ο διακομιστής επέστρεψε εσφαλμένο πεδίο τιμών - + Connection Timeout Λήξη Χρόνου Αναμονής Σύνδεσης @@ -1114,8 +1114,12 @@ It is not advisable to use it. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - Αδυναμία ασφαλούς σύνδεσης. Θα θέλατε να συνδεθείτε χωρίς κρυπτογράφηση παρ'όλα αυτά (δεν προτείνεται); + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + @@ -1307,27 +1311,27 @@ It is not advisable to use it. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. Ο συγχρονισμός ματαιώθηκε από τον χρήστη. - + No E-Tag received from server, check Proxy/Gateway Δεν ελήφθη E-Tag από τον διακομιστή, ελέγξτε τον διακομιστή μεσολάβησης/πύλη - + We received a different E-Tag for resuming. Retrying next time. Ελήφθη διαφορετικό E-Tag για συνέχιση. Επανάληψη την επόμενη φορά. - + Server returned wrong content-range Ο διακομιστής επέστρεψε εσφαλμένο πεδίο τιμών - + File %1 can not be downloaded because of a local file name clash! Το αρχείο %1 δεν είναι δυνατό να ληφθεί λόγω διένεξης με το όνομα ενός τοπικού αρχείου! @@ -1335,12 +1339,17 @@ It is not advisable to use it. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! Το αρχείο %1 δεν είναι δυνατό να ληφθεί λόγω διένεξης με το όνομα ενός τοπικού αρχείου! - + + The file could not be downloaded completely. + + + + File %1 cannot be saved because of a local file name clash! @@ -1376,12 +1385,12 @@ It is not advisable to use it. Error removing '%1': %2; - + Σφάλμα αφαίρεσης '%1': %2; Could not remove directory '%1'; - + Αδυναμία αφαίρεσης καταλόγου '%1'; @@ -1426,18 +1435,18 @@ It is not advisable to use it. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely Το τοπικό αρχείο τροποποιήθηκε κατά τη διάρκεια του συγχρονισμού, θα συγχρονιστεί και πάλι όταν φτάσει πλήρως - + Sync was aborted by user. Ο συγχρονισμός ματαιώθηκε από τον χρήστη. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Το αρχείο υπέστη επεξεργασία τοπικά αλλά είναι τμήμα ενός διαμοιρασμένου καταλόγου μόνο για ανάγνωση. Επαναφέρθηκε και το επεξεργασμένο βρίσκεται στο αρχείο συγκρούσεων. @@ -1445,23 +1454,23 @@ It is not advisable to use it. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Το αρχείο υπέστη επεξεργασία τοπικά αλλά είναι τμήμα ενός διαμοιρασμένου καταλόγου μόνο για ανάγνωση. Επαναφέρθηκε και το επεξεργασμένο βρίσκεται στο αρχείο συγκρούσεων. - + The local file was removed during sync. Το τοπικό αρχείο αφαιρέθηκε κατά το συγχρονισμό. - + Local file changed during sync. Το τοπικό αρχείο τροποποιήθηκε κατά τον συγχρονισμό. - + The server did not acknowledge the last chunk. (No e-tag were present) Ο διακομιστής δεν αναγνώρισε το τελευταίο τμήμα. (Δεν υπήρχε e-tag) @@ -1539,17 +1548,26 @@ It is not advisable to use it. Η κατάσταση συγχρονισμού αντιγράφηκε στο πρόχειρο. - - Currently no files are ignored because of previous errors. - Προς το παρόν κανένα αρχείο δεν θα αγνοηθεί λόγω προηγούμενων σφαλμάτων. + + Currently no files are ignored because of previous errors and no downloads are in progress. + - + %n files are ignored because of previous errors. - Try to sync these again. - %n αρχείο αγνοήθηκε λόγω προηγούμενων σφαλμάτων. -Προσπαθείστε να τα συγχρονίσετε ξανά.%n αρχεία αγνοήθηκαν λόγω προηγούμενων σφαλμάτων. -Προσπαθείστε να τα συγχρονίσετε ξανά. + + + + + + %n files are partially downloaded. + + + + + + Try to sync these again. + Προσπάθεια για συγχρονισμό αυτών ξανά. @@ -1637,12 +1655,12 @@ It is not advisable to use it. Mirall::ShibbolethCredentials - + Login Error Σφάλμα Σύνδεσης - + You must sign in as user %1 Πρέπει να εισέλθετε σαν χρήστης %1 @@ -2050,69 +2068,69 @@ It is not advisable to use it. Το αρχείο περιέχει άκυρους χαρακτήρες που δεν μπορούν να συγχρονιστούν σε όλα τα συστήματα. - + Unable to initialize a sync journal. Αδυναμία προετοιμασίας αρχείου συγχρονισμού. - + Cannot open the sync journal Αδυναμία ανοίγματος του αρχείου συγχρονισμού - - + + Ignored because of the "choose what to sync" blacklist Αγνοήθηκε εξαιτίας της μαύρης λίστας "διάλεξε τι να συγχρονιστεί" - + Not allowed because you don't have permission to add sub-directories in that directory Δεν επιτρέπεται επειδή δεν έχετε δικαιώματα να προσθέσετε υπο-καταλόγους σε αυτό τον κατάλογο - + Not allowed because you don't have permission to add parent directory Δεν επιτρέπεται επειδή δεν έχετε δικαιώματα να προσθέσετε στο γονεϊκό κατάλογο - + Not allowed because you don't have permission to add files in that directory Δεν επιτρέπεται επειδή δεν έχεται δικαιώματα να προσθέσετε αρχεία σε αυτόν τον κατάλογο - + 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 η προέλευση diff --git a/translations/mirall_en.ts b/translations/mirall_en.ts index 735f443a0..abde7ab52 100644 --- a/translations/mirall_en.ts +++ b/translations/mirall_en.ts @@ -387,29 +387,29 @@ Total time left %5 - + Could not read system exclude file - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? - + Remove All Files? - + Remove all files - + Keep files @@ -636,22 +636,22 @@ Are you sure you want to perform this operation? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway - + We received a different E-Tag for resuming. Retrying next time. - + Server returned wrong content-range - + Connection Timeout @@ -1108,7 +1108,11 @@ It is not advisable to use it. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? @@ -1301,27 +1305,27 @@ It is not advisable to use it. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. - + No E-Tag received from server, check Proxy/Gateway - + We received a different E-Tag for resuming. Retrying next time. - + Server returned wrong content-range - + File %1 can not be downloaded because of a local file name clash! @@ -1329,12 +1333,17 @@ It is not advisable to use it. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! - + + The file could not be downloaded completely. + + + + File %1 cannot be saved because of a local file name clash! @@ -1420,18 +1429,18 @@ It is not advisable to use it. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely - + Sync was aborted by user. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. @@ -1439,23 +1448,23 @@ It is not advisable to use it. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. - + The local file was removed during sync. - + Local file changed during sync. - + The server did not acknowledge the last chunk. (No e-tag were present) @@ -1533,19 +1542,33 @@ It is not advisable to use it. - - Currently no files are ignored because of previous errors. + + Currently no files are ignored because of previous errors and no downloads are in progress. - + %n files are ignored because of previous errors. - Try to sync these again. + + + + %n files are partially downloaded. + + + + + + + + + Try to sync these again. + + Mirall::SelectiveSyncDialog @@ -1632,12 +1655,12 @@ It is not advisable to use it. Mirall::ShibbolethCredentials - + Login Error - + You must sign in as user %1 @@ -2043,69 +2066,69 @@ It is not advisable to use it. - + Unable to initialize a sync journal. - + Cannot open the sync journal - - + + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add sub-directories in that directory - + Not allowed because you don't have permission to add parent directory - + Not allowed because you don't have permission to add files in that directory - + 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 diff --git a/translations/mirall_es.ts b/translations/mirall_es.ts index 382c6b290..8ea2cb097 100644 --- a/translations/mirall_es.ts +++ b/translations/mirall_es.ts @@ -386,12 +386,12 @@ Tiempo restante %5 Actividad en la Sincronización - + Could not read system exclude file No se pudo leer el archivo de exclusión del sistema - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -400,17 +400,17 @@ Esto se puede deber a que la carpeta fue reconfigurada de forma silenciosa o a q Está seguro de que desea realizar esta operación? - + Remove All Files? Eliminar todos los archivos? - + Remove all files Eliminar todos los archivos - + Keep files Conservar archivos @@ -637,22 +637,22 @@ Está seguro de que desea realizar esta operación? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway No se recibió ninguna e-tag del servidor, revisar el proxy/gateway - + We received a different E-Tag for resuming. Retrying next time. Se recibió una e-tag distinta para reanudar. Se intentará nuevamente. - + Server returned wrong content-range El servidor devolvió un content-range erróneo - + Connection Timeout Tiempo de espera de conexión agotado @@ -1113,8 +1113,16 @@ No se recomienda usarlo. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - No se pudo hacer una conexión segura. ¿Desea conectarse de forma insegura (no recomendado)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + No se pudo conectar cifrado: + +%1 + +Desea conectar a cambio sin encriptación (no recomendado)? @@ -1306,27 +1314,27 @@ No se recomienda usarlo. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. La sincronización ha sido Interrumpida por el usuario - + No E-Tag received from server, check Proxy/Gateway No se recibió ninguna e-tag del servidor, revisar el proxy/gateway - + We received a different E-Tag for resuming. Retrying next time. Se recibió una e-tag distinta para reanudar. Se intentará nuevamente. - + Server returned wrong content-range El servidor devolvió un content-range erróneo - + File %1 can not be downloaded because of a local file name clash! ¡El fichero %1 no puede ser descargado debido al nombre de la clase de un fichero local! @@ -1334,12 +1342,17 @@ No se recomienda usarlo. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! ¡El fichero %1 no puede ser descargado debido al nombre de la clase de un fichero local! - + + The file could not be downloaded completely. + No se pudo descargar el archivo completamente. + + + File %1 cannot be saved because of a local file name clash! ¡ El fichero %1 no puede guardar debido a un conflicto con el nombre de otro fichero local ! @@ -1425,18 +1438,18 @@ No se recomienda usarlo. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely Fichero local modificado mientras se sincronizaba, sincronice otra vez cuando termine de editar - + Sync was aborted by user. La sincronización ha sido Interrumpida por el usuario - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. El archivo fue modificado localmente, pero es parte de una carpeta compartida en modo de solo lectura. Ha sido recuperado y tu modificación está en el archivo de conflicto. @@ -1444,23 +1457,23 @@ No se recomienda usarlo. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. El archivo fue modificado localmente, pero es parte de una carpeta compartida en modo de solo lectura. Ha sido recuperado y tu modificación está en el archivo de conflicto. - + The local file was removed during sync. El archivo local fue eliminado durante la sincronización. - + Local file changed during sync. Un archivo local fue modificado durante la sincronización. - + The server did not acknowledge the last chunk. (No e-tag were present) El servidor no reconoció la última parte. (No había una e-tag presente.) @@ -1538,17 +1551,30 @@ No se recomienda usarlo. El informe de sincronización fue copiado al portapapeles. - - Currently no files are ignored because of previous errors. - Actualmente no hay ficheros ignorados por errores previos. + + Currently no files are ignored because of previous errors and no downloads are in progress. + Actualmente no hay archivos ignorados debido a errores previos y a que no hay descargas en progreso. - + %n files are ignored because of previous errors. - Try to sync these again. - %n archivo ha sido ignorado por causa de errores previos. - Intente volver a sincronizarlo.%n archivos han sido ignorados por causa de errores previos. - Intente volver a sincronizarlos. + + %n Archivos han sido ignorados debido a errores previos. +%n Archivos han sido ignorados debido a errores previos. + + + + + %n files are partially downloaded. + + %n archivos han sido parcialmente descargados. +%n archivos han sido parcialmente descargados. + + + + + Try to sync these again. + Intentar sincronizar de nuevo @@ -1636,12 +1662,12 @@ No se recomienda usarlo. Mirall::ShibbolethCredentials - + Login Error Error al iniciar sesión - + You must sign in as user %1 Debe iniciar sesión como el usuario %1 @@ -2049,69 +2075,69 @@ No se recomienda usarlo. El fichero contiene caracteres inválidos que no pueden ser sincronizados con la plataforma. - + Unable to initialize a sync journal. No se pudo inicializar un registro (journal) de sincronización. - + Cannot open the sync journal No es posible abrir el diario de sincronización - - + + Ignored because of the "choose what to sync" blacklist Ignorado por que se encuentra en la lista negra de "elige que vas a sincronizar" - + Not allowed because you don't have permission to add sub-directories in that directory No está permitido, porque no tiene permisos para añadir subcarpetas en este directorio. - + Not allowed because you don't have permission to add parent directory No está permitido porque no tiene permisos para añadir un directorio - + Not allowed because you don't have permission to add files in that directory No está permitido, porque no tiene permisos para crear archivos en este 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 eliminaron 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 solo lectura. - + the destination destino - + the source origen @@ -2317,7 +2343,7 @@ No se recomienda usarlo. &Start a clean sync (Erases the local folder!) - &Iniciar una sincronización limpia(Borra la carpeta local!) + &Iniciar una sincronización limpia (borra la carpeta local) diff --git a/translations/mirall_es_AR.ts b/translations/mirall_es_AR.ts index 2c8329306..05e24e7fb 100644 --- a/translations/mirall_es_AR.ts +++ b/translations/mirall_es_AR.ts @@ -385,12 +385,12 @@ Total time left %5 Actividad de Sync - + Could not read system exclude file - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -399,17 +399,17 @@ Esto se puede deber a que el directorio fue reconfigurado de manera silenciosa o ¿Estás seguro de que querés realizar esta operación? - + Remove All Files? ¿Borrar todos los archivos? - + Remove all files Borrar todos los archivos - + Keep files Conservar archivos @@ -636,22 +636,22 @@ Esto se puede deber a que el directorio fue reconfigurado de manera silenciosa o Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway - + We received a different E-Tag for resuming. Retrying next time. - + Server returned wrong content-range - + Connection Timeout @@ -1110,7 +1110,11 @@ It is not advisable to use it. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? @@ -1303,27 +1307,27 @@ It is not advisable to use it. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. Sincronizaciójn abortada por el usuario. - + No E-Tag received from server, check Proxy/Gateway - + We received a different E-Tag for resuming. Retrying next time. - + Server returned wrong content-range - + File %1 can not be downloaded because of a local file name clash! @@ -1331,12 +1335,17 @@ It is not advisable to use it. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! - + + The file could not be downloaded completely. + + + + File %1 cannot be saved because of a local file name clash! @@ -1422,18 +1431,18 @@ It is not advisable to use it. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely Los archivos locales han cambiado durante la sincronización, la primera vez ha funcionado completamente - + Sync was aborted by user. Sincronizaciójn abortada por el usuario. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. @@ -1441,23 +1450,23 @@ It is not advisable to use it. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. - + The local file was removed during sync. - + Local file changed during sync. - + The server did not acknowledge the last chunk. (No e-tag were present) @@ -1535,16 +1544,27 @@ It is not advisable to use it. El estado de sincronización ha sido copiado al portapapeles - - Currently no files are ignored because of previous errors. - Actualmente ningún archivo es ignorado por errores previos. + + Currently no files are ignored because of previous errors and no downloads are in progress. + - + %n files are ignored because of previous errors. - Try to sync these again. + + + + %n files are partially downloaded. + + + + + + Try to sync these again. + + Mirall::SelectiveSyncDialog @@ -1631,12 +1651,12 @@ It is not advisable to use it. Mirall::ShibbolethCredentials - + Login Error - + You must sign in as user %1 @@ -2042,69 +2062,69 @@ It is not advisable to use it. El archivo contiene caracteres inválidos que no pueden ser sincronizados entre plataforma. - + Unable to initialize a sync journal. Imposible inicializar un diario de sincronización. - + Cannot open the sync journal - - + + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add sub-directories in that directory - + Not allowed because you don't have permission to add parent directory - + Not allowed because you don't have permission to add files in that directory - + 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 diff --git a/translations/mirall_et.ts b/translations/mirall_et.ts index a3a409524..c8ea6ea06 100644 --- a/translations/mirall_et.ts +++ b/translations/mirall_et.ts @@ -386,12 +386,12 @@ Aega kokku jäänud %5 Sünkroniseerimise tegevus - + Could not read system exclude file Süsteemi väljajätmiste faili lugemine ebaõnnestus - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -400,17 +400,17 @@ See võib olla põhjustatud kataloogi ümberseadistusest või on toimunud kõiki Oled kindel, et soovid seda operatsiooni teostada? - + Remove All Files? Kustutada kõik failid? - + Remove all files Kustutada kõik failid - + Keep files Säilita failid @@ -637,22 +637,22 @@ Oled kindel, et soovid seda operatsiooni teostada? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway Ühtegi E-Silti ei saabunud serverist, kontrolli puhverserverit/lüüsi. - + We received a different E-Tag for resuming. Retrying next time. Saime jätkamiseks erineva E-Sildi. Proovin järgmine kord uuesti. - + Server returned wrong content-range Server tagastas vale vahemiku - + Connection Timeout Ühenduse aegumine @@ -1113,8 +1113,12 @@ Selle kasutamine pole soovitatav. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - Ei suutnud turvaliselt ühenduda. Soovid minna üle krüpteerimata ühendusele (pole soovitatav)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + @@ -1306,27 +1310,27 @@ Selle kasutamine pole soovitatav. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. Sünkroniseering katkestati kasutaja poolt. - + No E-Tag received from server, check Proxy/Gateway Ühtegi E-Silti ei saabunud serverist, kontrolli puhverserverit/lüüsi. - + We received a different E-Tag for resuming. Retrying next time. Saime jätkamiseks erineva E-Sildi. Proovin järgmine kord uuesti. - + Server returned wrong content-range Server tagastas vale vahemiku - + File %1 can not be downloaded because of a local file name clash! Faili %1 ei saa alla laadida kuna on konflikt kohaliku faili nimega. @@ -1334,12 +1338,17 @@ Selle kasutamine pole soovitatav. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! Faili %1 ei saa alla laadida kuna on konflikt kohaliku faili nimega. - + + The file could not be downloaded completely. + + + + File %1 cannot be saved because of a local file name clash! Faili %1 ei saa salvestada kuna on nime konflikt kohaliku failiga! @@ -1425,18 +1434,18 @@ Selle kasutamine pole soovitatav. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely Kohalik fail muutus sünkroniseerimise ajal, sünkroniseerin kuni ülekanne on täielik - + Sync was aborted by user. Sünkroniseering katkestati kasutaja poolt. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Faili on lokaalselt muudetud, kuid see on osa kirjutamisõiguseta jagamisest. See on taastatud ning sinu muudatus on konfliktses failis. @@ -1444,23 +1453,23 @@ Selle kasutamine pole soovitatav. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Faili on lokaalselt muudetud, kuid see on osa kirjutamisõiguseta jagamisest. See on taastatud ning sinu muudatus on konfliktses failis. - + The local file was removed during sync. Kohalik fail on eemaldatud sünkroniseeringu käigus. - + Local file changed during sync. Kohalik fail muutus sünkroniseeringu käigus. - + The server did not acknowledge the last chunk. (No e-tag were present) Server ei tunnistanud viimast tükki. (E-silt puudus). @@ -1538,17 +1547,29 @@ Selle kasutamine pole soovitatav. Sünkroniseeringu staatus on kopeeritud lõikepuhvrisse. - - Currently no files are ignored because of previous errors. - Hetkel ei ignoreerita ühtegi faili eelnenud vigade tõttu. + + Currently no files are ignored because of previous errors and no downloads are in progress. + Hetkel ei ignoreerita ühtegi faili eelnenud vigade tõttu ja ühtegi allalaadimist ei toimu - + %n files are ignored because of previous errors. - Try to sync these again. - %n faili ignoreeriti eelnenud vigade tõttu. -Proovi uuesti sünkroniseerida.%n faili ignoreeriti eelnenud vigade tõttu. -Proovi uuesti sünkroniseerida. + + %n fail on ignoreeritud eelnenud vigade tõttu%n faili on ignoreeritud eelnenud vigade tõttu + + + + + %n files are partially downloaded. + + %n fail on osaliselt allalaaditud +%n fail on osaliselt allalaaditud + + + + + Try to sync these again. + Proovi neid uuesti sünkroniseerida. @@ -1636,12 +1657,12 @@ Proovi uuesti sünkroniseerida. Mirall::ShibbolethCredentials - + Login Error Sisselogimise viga - + You must sign in as user %1 Pead sisse logima kui kasutaja %1 @@ -2049,69 +2070,69 @@ Proovi uuesti sünkroniseerida. Fail sisaldab sobimatuid sümboleid, mida ei saa sünkroniseerida erinevate platvormide vahel. - + Unable to initialize a sync journal. Ei suuda lähtestada sünkroniseeringu zurnaali. - + Cannot open the sync journal Ei suuda avada sünkroniseeringu zurnaali - - + + 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 sub-directories in that directory Pole lubatud, kuna sul puuduvad õigused lisada sellesse kataloogi lisada alam-kataloogi - + Not allowed because you don't have permission to add parent directory Pole lubatud, kuna sul puuduvad õigused lisada ülemkataloog - + Not allowed because you don't have permission to add files in that directory Pole lubatud, kuna sul puuduvad õigused sellesse kataloogi faile lisada - + 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 diff --git a/translations/mirall_eu.ts b/translations/mirall_eu.ts index 221647b11..065185216 100644 --- a/translations/mirall_eu.ts +++ b/translations/mirall_eu.ts @@ -386,12 +386,12 @@ Geratzen den denbora %5 Sinkronizazio Jarduerak - + Could not read system exclude file - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -400,17 +400,17 @@ Izan daiteke karpeta isilpean birkonfiguratu delako edo fitxategi guztiak eskuz Ziur zaude eragiketa hau egin nahi duzula? - + Remove All Files? Ezabatu Fitxategi Guztiak? - + Remove all files Ezabatu fitxategi guztiak - + Keep files Mantendu fitxategiak @@ -637,22 +637,22 @@ Ziur zaude eragiketa hau egin nahi duzula? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway Ez da E-Tagik jaso zerbitzaritik, egiaztatu Proxy/Gateway - + We received a different E-Tag for resuming. Retrying next time. - + Server returned wrong content-range - + Connection Timeout Konexioa denboraz kanpo @@ -1113,8 +1113,12 @@ Ez da gomendagarria erabltzea. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - Ezin da modu seguruan konektatu. Nahi duzu enkriptatu gabe konektatu (ez da gomendagarria)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + @@ -1306,27 +1310,27 @@ Ez da gomendagarria erabltzea. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. Sinkronizazioa erabiltzaileak bertan behera utzi du - + No E-Tag received from server, check Proxy/Gateway Ez da E-Tagik jaso zerbitzaritik, egiaztatu Proxy/Gateway - + We received a different E-Tag for resuming. Retrying next time. - + Server returned wrong content-range - + File %1 can not be downloaded because of a local file name clash! @@ -1334,12 +1338,17 @@ Ez da gomendagarria erabltzea. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! - + + The file could not be downloaded completely. + + + + File %1 cannot be saved because of a local file name clash! @@ -1425,18 +1434,18 @@ Ez da gomendagarria erabltzea. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely - + Sync was aborted by user. Sinkronizazioa erabiltzaileak bertan behera utzi du - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. @@ -1444,23 +1453,23 @@ Ez da gomendagarria erabltzea. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. - + The local file was removed during sync. Fitxategi lokala ezabatu da sinkronizazioan. - + Local file changed during sync. Fitxategi lokala aldatu da sinkronizazioan. - + The server did not acknowledge the last chunk. (No e-tag were present) @@ -1538,16 +1547,27 @@ Ez da gomendagarria erabltzea. Sinkronizazio egoera arbelera kopiatu da. - - Currently no files are ignored because of previous errors. - Oraintxe ez da fitxategirik baztertzen aurreko erroreak direla eta. + + Currently no files are ignored because of previous errors and no downloads are in progress. + - + %n files are ignored because of previous errors. - Try to sync these again. + + + + %n files are partially downloaded. + + + + + + Try to sync these again. + + Mirall::SelectiveSyncDialog @@ -1634,12 +1654,12 @@ Ez da gomendagarria erabltzea. Mirall::ShibbolethCredentials - + Login Error Errorea sartzean - + You must sign in as user %1 @@ -2045,69 +2065,69 @@ Ez da gomendagarria erabltzea. - + Unable to initialize a sync journal. Ezin izan da sinkronizazio egunerokoa hasieratu. - + Cannot open the sync journal - - + + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add sub-directories in that directory - + Not allowed because you don't have permission to add parent directory - + Not allowed because you don't have permission to add files in that directory - + 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 diff --git a/translations/mirall_fa.ts b/translations/mirall_fa.ts index e9708daa9..ff2f4697e 100644 --- a/translations/mirall_fa.ts +++ b/translations/mirall_fa.ts @@ -385,29 +385,29 @@ Total time left %5 فعالیت همگام سازی - + Could not read system exclude file - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? - + Remove All Files? - + Remove all files - + Keep files نگه داشتن فایل ها @@ -634,22 +634,22 @@ Are you sure you want to perform this operation? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway - + We received a different E-Tag for resuming. Retrying next time. - + Server returned wrong content-range - + Connection Timeout تایم اوت اتصال @@ -1106,7 +1106,11 @@ It is not advisable to use it. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? @@ -1299,27 +1303,27 @@ It is not advisable to use it. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. - + No E-Tag received from server, check Proxy/Gateway - + We received a different E-Tag for resuming. Retrying next time. - + Server returned wrong content-range - + File %1 can not be downloaded because of a local file name clash! @@ -1327,12 +1331,17 @@ It is not advisable to use it. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! - + + The file could not be downloaded completely. + + + + File %1 cannot be saved because of a local file name clash! @@ -1418,18 +1427,18 @@ It is not advisable to use it. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely - + Sync was aborted by user. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. @@ -1437,23 +1446,23 @@ It is not advisable to use it. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. - + The local file was removed during sync. - + Local file changed during sync. - + The server did not acknowledge the last chunk. (No e-tag were present) @@ -1531,16 +1540,27 @@ It is not advisable to use it. - - Currently no files are ignored because of previous errors. + + Currently no files are ignored because of previous errors and no downloads are in progress. - + %n files are ignored because of previous errors. - Try to sync these again. + + + + %n files are partially downloaded. + + + + + + Try to sync these again. + + Mirall::SelectiveSyncDialog @@ -1627,12 +1647,12 @@ It is not advisable to use it. Mirall::ShibbolethCredentials - + Login Error - + You must sign in as user %1 @@ -2038,69 +2058,69 @@ It is not advisable to use it. - + Unable to initialize a sync journal. - + Cannot open the sync journal - - + + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add sub-directories in that directory - + Not allowed because you don't have permission to add parent directory - + Not allowed because you don't have permission to add files in that directory - + 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 diff --git a/translations/mirall_fi.ts b/translations/mirall_fi.ts index 121ae4c31..e3e356fc8 100644 --- a/translations/mirall_fi.ts +++ b/translations/mirall_fi.ts @@ -121,7 +121,7 @@ <b>Note:</b> Some folders, including network mounted or shared folders, might have different limits. - <b>Huomio:</b> Joillakin kansioilla, mukaan lukien verkon yli liitetyt tai jaetut kansiot, voivat olla erilaisten rajoitusten piirissä. + <b>Huomio:</b> Jotkin kansiot, mukaan lukien verkon yli liitetyt tai jaetut kansiot, voivat olla eri rajoitusten piirissä. @@ -216,7 +216,7 @@ Aikaa jäljellä yhteensä %5 Connected to <a href="%1">%2</a>. - Muodosta yhteys - <a href="%1">%2</a>. + Muodostetty yhteys kohteeseen <a href="%1">%2</a>. @@ -386,29 +386,29 @@ Aikaa jäljellä yhteensä %5 Synkronointiaktiviteetti - + Could not read system exclude file - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? - + Remove All Files? Poistetaanko kaikki tiedostot? - + Remove all files Poista kaikki tiedostot - + Keep files Säilytä tiedostot @@ -487,7 +487,7 @@ Are you sure you want to perform this operation? Syncing all files in your account with - + Synkronoidaan kaikki tilisi tiedostot polkuun @@ -635,22 +635,22 @@ Are you sure you want to perform this operation? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway - + We received a different E-Tag for resuming. Retrying next time. - + Server returned wrong content-range - + Connection Timeout Yhteys aikakatkaistiin @@ -1062,7 +1062,7 @@ saattaa kysyä lisäoikeuksia toimenpiteen aikana. Update advanced setup - + Lisäasetuksien päivitys @@ -1109,8 +1109,12 @@ Osoitteen käyttäminen ei ole suositeltavaa. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - Salattua yhteyttä ei voitu muodostaa. Haluatko sen muodostaa salaamattoman yhteyden? (ei suositeltu) + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + @@ -1302,27 +1306,27 @@ Osoitteen käyttäminen ei ole suositeltavaa. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. Synkronointi peruttiin käyttäjän toimesta. - + No E-Tag received from server, check Proxy/Gateway - + We received a different E-Tag for resuming. Retrying next time. - + Server returned wrong content-range - + File %1 can not be downloaded because of a local file name clash! @@ -1330,12 +1334,17 @@ Osoitteen käyttäminen ei ole suositeltavaa. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! - + + The file could not be downloaded completely. + + + + File %1 cannot be saved because of a local file name clash! @@ -1345,7 +1354,7 @@ Osoitteen käyttäminen ei ole suositeltavaa. ; Restoration Failed: - + ; Palauttaminen epäonnistui: @@ -1371,7 +1380,7 @@ Osoitteen käyttäminen ei ole suositeltavaa. Error removing '%1': %2; - + Virhe poistaessa '%1': %2; @@ -1421,18 +1430,18 @@ Osoitteen käyttäminen ei ole suositeltavaa. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely - + Sync was aborted by user. Synkronointi peruttiin käyttäjän toimesta. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. @@ -1440,23 +1449,23 @@ Osoitteen käyttäminen ei ole suositeltavaa. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. - + The local file was removed during sync. Paikallinen tiedosto poistettiin synkronoinnin aikana. - + Local file changed during sync. Paikallinen tiedosto muuttui synkronoinnin aikana. - + The server did not acknowledge the last chunk. (No e-tag were present) @@ -1521,7 +1530,7 @@ Osoitteen käyttäminen ei ole suositeltavaa. Copy the activity list to the clipboard. - + Kopioi toimilista leikepöydälle. @@ -1534,16 +1543,27 @@ Osoitteen käyttäminen ei ole suositeltavaa. Synkronointitila on kopioitu leikepöydälle. - - Currently no files are ignored because of previous errors. + + Currently no files are ignored because of previous errors and no downloads are in progress. - + %n files are ignored because of previous errors. - Try to sync these again. + + + + %n files are partially downloaded. + + + + + + Try to sync these again. + + Mirall::SelectiveSyncDialog @@ -1555,7 +1575,7 @@ Osoitteen käyttäminen ei ole suositeltavaa. Unchecked folders will be <b>removed</b> from your local file system and will not be synchronized to this computer anymore - + Ilman valintaa olevat kansiot <b>poistetaan</b> paikallisesta tiedostojärjestelmästä, eikä niitä synkronoida enää jatkossa tämän tietokoneen kanssa @@ -1630,12 +1650,12 @@ Osoitteen käyttäminen ei ole suositeltavaa. Mirall::ShibbolethCredentials - + Login Error Kirjautumisvirhe - + You must sign in as user %1 Kirjaudu käyttäjänä %1 @@ -2043,69 +2063,69 @@ Osoitteen käyttäminen ei ole suositeltavaa. Tiedosto sisältää virheellisiä merkkejä, joiden vuoksi sitä voi synkronoida eri käyttöjärjestelmien välillä. - + Unable to initialize a sync journal. - + Cannot open the sync journal - - + + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add sub-directories in that directory - + Not allowed because you don't have permission to add parent directory - + Not allowed because you don't have permission to add files in that directory Ei sallittu, koska sinulla ei ole oikeutta lisätä tiedostoja 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 diff --git a/translations/mirall_fr.ts b/translations/mirall_fr.ts index eb50088a0..2d33b2cc0 100644 --- a/translations/mirall_fr.ts +++ b/translations/mirall_fr.ts @@ -14,7 +14,7 @@ &Choose... - &Choisir + &Choisir... @@ -37,7 +37,7 @@ Add Folder - Ajouter le dossier + Ajouter un dossier @@ -311,7 +311,7 @@ Temps restant total %5 %1: %2 - %1: %2 + %1 : %2 @@ -386,12 +386,12 @@ Temps restant total %5 Activité de synchronisation - + Could not read system exclude file Impossible de lire le fichier d'exclusion du système - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -400,17 +400,17 @@ Cela est peut-être du à une reconfiguration silencieuse du dossier, ou parce q Voulez-vous réellement effectuer cette opération ? - + Remove All Files? Supprimer tous les fichiers ? - + Remove all files Supprimer tous les fichiers - + Keep files Garder les fichiers @@ -455,7 +455,7 @@ Voulez-vous réellement effectuer cette opération ? Last Sync was successful, but with warnings on individual files. - La dernière synchronisation s'est achevée avec succès mais avec des messages d'avertissement sur des fichiers individuels. + La dernière synchronisation s'est achevée avec succès mais avec des messages d'avertissement à propos de certains fichiers. @@ -494,7 +494,7 @@ Voulez-vous réellement effectuer cette opération ? Remote path: %1 - Chemin distant: %1 + Chemin distant : %1 @@ -503,7 +503,7 @@ Voulez-vous réellement effectuer cette opération ? Add Folder - Ajouter le dossier + Ajouter un dossier @@ -614,7 +614,7 @@ Voulez-vous réellement effectuer cette opération ? You are already syncing all your files. Syncing another folder is <b>not</b> supported. If you want to sync multiple folders, please remove the currently configured root folder sync. - Vous êtes déjà en cours de synchronisation de tous vos fichiers. Synchroniser un autre dossier n'est <b>pas</b> possible actuellement. Si vous voulez synchroniser de multiples dossiers, veuillez supprimer la synchronisation en cours du dossier racine. + Vous sychronisez déjà tous vos fichiers. Synchroniser un autre dossier n'est <b>pas</b> possible actuellement. Si vous voulez synchroniser plusieurs dossiers, veuillez supprimer la synchronisation du dossier racine qui est configurée actuellement. @@ -637,22 +637,22 @@ Voulez-vous réellement effectuer cette opération ? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway Aucun E-Tag reçu du serveur, vérifiez le proxy / la passerelle - + We received a different E-Tag for resuming. Retrying next time. Nous avons reçu un E-Tag différent pour reprendre le téléchargement. Nouvel essai la prochaine fois. - + Server returned wrong content-range Le serveur a retourné une gamme de contenu erronée - + Connection Timeout Temps de connexion expiré @@ -711,7 +711,7 @@ Voulez-vous réellement effectuer cette opération ? Please enter %1 password for user '%2': - Veuillez entrer %1 mot de passe pour l'utilisateur '%2': + Veuillez entrer le mot de passe %1 pour l'utilisateur '%2' : @@ -1031,7 +1031,7 @@ peut demander des privilèges additionnels durant le processus. Connect to %1 - Connecter à %1 + Connexion à %1 @@ -1074,7 +1074,7 @@ peut demander des privilèges additionnels durant le processus. Connect to %1 - Connecter à %1 + Connexion à %1 @@ -1084,7 +1084,7 @@ peut demander des privilèges additionnels durant le processus. Update user credentials - Mettre à jour les identifiants de connexion de l'utilisateur + Modification des identifiants de connexion @@ -1092,7 +1092,7 @@ peut demander des privilèges additionnels durant le processus. Connect to %1 - Connecter à %1 + Connexion à %1 @@ -1113,8 +1113,16 @@ Il est déconseillé de l'utiliser. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - Impossible de se connecter en toute sécurité. Voulez-vous vous connecter sans chiffrement à la place (non recommandé) ? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + Impossible de se connecter en toute sécurité. + +%1 + +Voulez-vous vous connecter sans chiffrement à la place (non recommandé) ? @@ -1124,7 +1132,7 @@ Il est déconseillé de l'utiliser. Update %1 server - Mettre à jour le serveur %1 + Modification de l'adresse du serveur %1 @@ -1148,7 +1156,7 @@ Il est déconseillé de l'utiliser. <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> - <font color="green">Connecté avec succès à %1: %2 version %3 (%4)</font><br/><br/> + <font color="green">Connecté avec succès à %1 : %2 version %3 (%4)</font><br/><br/> @@ -1184,7 +1192,7 @@ Il est déconseillé de l'utiliser. Failed to connect to %1 at %2:<br/>%3 - Échec de la connexion à %1 pour %2:<br/>%3 + Échec de la connexion à %1 pour %2 :<br/>%3 @@ -1287,7 +1295,7 @@ Il est déconseillé de l'utiliser. Your entire account is synced to the local folder <i>%1</i> - Votre compte est synchronisé intégralement avec le répertoire local <i>%1</i> + Votre compte est intégralement synchronisé avec le répertoire local <i>%1</i> @@ -1306,40 +1314,45 @@ Il est déconseillé de l'utiliser. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. La synchronisation a été interrompue par l'utilisateur. - + No E-Tag received from server, check Proxy/Gateway Aucun E-Tag reçu du serveur, vérifiez le proxy / la passerelle - + We received a different E-Tag for resuming. Retrying next time. Nous avons reçu un E-Tag différent pour reprendre le téléchargement. Nouvel essai la prochaine fois. - + Server returned wrong content-range Le serveur a retourné une gamme de contenu erronnée - + File %1 can not be downloaded because of a local file name clash! - File %1 ne peut pas être téléchargé en raison d'un conflit sur le nom du fichier local. + Le fichier %1 ne peut pas être téléchargé en raison d'un conflit sur le nom du fichier local. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! - File %1 ne peut pas être téléchargé en raison d'un conflit sur le nom du fichier local. + Le fichier %1 ne peut pas être téléchargé en raison d'un conflit sur le nom du fichier local. - + + The file could not be downloaded completely. + Le fichier n'a pas pu être téléchargé intégralement. + + + File %1 cannot be saved because of a local file name clash! Le fichier %1 n'a pas pu être sauvegardé en raison d'un conflit sur le nom du fichier local ! @@ -1425,18 +1438,18 @@ Il est déconseillé de l'utiliser. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely Fichier local modifié pendant la synchronisation, la synchronisation redémarrera lorsque ce sera terminé - + Sync was aborted by user. La synchronisation a été interrompue par l'utilisateur. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Le fichier a été modifié localement mais appartient à un partage en lecture seule. Il a été restauré et vos modifications sont présentes dans le fichiers de confit. @@ -1444,23 +1457,23 @@ Il est déconseillé de l'utiliser. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Le fichier a été modifié localement mais appartient à un partage en lecture seule. Il a été restauré et vos modifications sont présentes dans le fichiers de confit. - + The local file was removed during sync. Fichier local supprimé pendant la synchronisation. - + Local file changed during sync. Fichier local modifié pendant la synchronisation. - + The server did not acknowledge the last chunk. (No e-tag were present) Le serveur n'a pas acquitté le dernier morceau (aucun e-tag n'était présent). @@ -1538,17 +1551,29 @@ Il est déconseillé de l'utiliser. L'état de synchronisation a été copié dans le presse-papier. - - Currently no files are ignored because of previous errors. - Actuellement aucun fichier n'a été ignoré en raison d'erreurs précédentes. + + Currently no files are ignored because of previous errors and no downloads are in progress. + Actuellement aucun fichier n'a été ignoré en raison d'erreurs précédentes, et aucun téléchargement n'est en cours. - + %n files are ignored because of previous errors. - Try to sync these again. - %n fichier a été ignoré à cause de précédentes erreurs. -Essayez de le synchroniser à nouveau.%n fichiers ont été ignorés à cause de précédentes erreurs. -Essayez de les synchroniser à nouveau. + + %n fichiers ont été ignorés à cause d'erreurs précédentes. +%n fichiers ont été ignorés à cause d'erreurs précédentes. + + + + + %n files are partially downloaded. + + %n fichiers sont partiellement téléchargés.%n fichiers sont partiellement téléchargés. + + + + + Try to sync these again. + Essayez de les synchroniser à nouveau. @@ -1636,12 +1661,12 @@ Essayez de les synchroniser à nouveau. Mirall::ShibbolethCredentials - + Login Error Erreur de connexion - + You must sign in as user %1 Vous devez vous connecter en tant qu'utilisateur %1 @@ -2049,69 +2074,69 @@ Essayez de les synchroniser à nouveau. Le fichier contient des caractères non valides qui ne peuvent être synchronisés entre plate-formes. - + Unable to initialize a sync journal. Impossible d'initialiser un journal de synchronisation. - + Cannot open the sync journal Impossible d'ouvrir le journal de synchronisation - - + + Ignored because of the "choose what to sync" blacklist Ignoré à cause de la liste noire du contenu à synchroniser. - + Not allowed because you don't have permission to add sub-directories in that directory Non autorisé car vous n'avez pas la permission d'ajouter des sous-dossiers dans ce dossier - + Not allowed because you don't have permission to add parent directory Non autorisé car vous n'avez pas la permission d'ajouter des dossiers parents - + Not allowed because you don't have permission to add files in that directory Non autorisé car vous n'avez pas la permission d'ajouter des fichiers 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 répertoire de partage 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 @@ -2121,7 +2146,7 @@ Essayez de les synchroniser à nouveau. %1: %2 - %1: %2 + %1 : %2 @@ -2192,7 +2217,7 @@ Essayez de les synchroniser à nouveau. Calculating quota... - Calcul du quota en cours... + Calcul du quota... @@ -2237,7 +2262,7 @@ Essayez de les synchroniser à nouveau. %1% of %2 in use - %1% sur %2 utilisés + %1% de %2 utilisés @@ -2302,7 +2327,7 @@ Essayez de les synchroniser à nouveau. Sync everything from server - Synchroniser tout le contenu du serveur + Synchroniser tout le contenu de votre compte @@ -2327,7 +2352,7 @@ Essayez de les synchroniser à nouveau. &Keep local data - &Garder des données locales + &Garder les données locales @@ -2576,7 +2601,7 @@ Essayez de les synchroniser à nouveau. downloading - téléchargement + téléchargement de diff --git a/translations/mirall_gl.ts b/translations/mirall_gl.ts index 3a7e3078b..59d8b1a96 100644 --- a/translations/mirall_gl.ts +++ b/translations/mirall_gl.ts @@ -106,7 +106,7 @@ Choose What to Sync - + Escolla qué sincronizar @@ -163,7 +163,7 @@ file %1 of %2 - + ficheiro %1 de %2 @@ -198,7 +198,7 @@ Discovering '%1' - + Atopando '%1' @@ -373,12 +373,12 @@ Tempo total restante %5 %1 and %2 other files could not be synced due to errors. See the log for details. %1 names a file. - + %1 e %2 non se puideron sincronizar debido a erros. Vexa os detalles no rexistro. %1 could not be synced due to an error. See the log for details. - + %1 non se puido sincronizar debe a un erro. Vexa os detalles no rexistro. @@ -386,12 +386,12 @@ Tempo total restante %5 Actividade de sincronización - + Could not read system exclude file - + Non se puido ler o ficheiro de exclusión do sistema - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -400,17 +400,17 @@ Isto podería ser debido a que o cartafol foi reconfigurado en silencio, ou a qu Confirma que quere realizar esta operación? - + Remove All Files? Retirar todos os ficheiros? - + Remove all files Retirar todos os ficheiros - + Keep files Manter os ficheiros @@ -622,7 +622,7 @@ Confirma que quere realizar esta operación? Choose What to Sync: You can optionally deselect subfolders you do not wish to synchronize. - + Escolla qué sincronizar: Opcionalmente pode deselecionar subcartafoles que non desexe sincronizar. @@ -637,22 +637,22 @@ Confirma que quere realizar esta operación? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway Non se recibiu a «E-Tag» do servidor, comprobe o proxy e/ou a pasarela - + We received a different E-Tag for resuming. Retrying next time. Recibiuse unha «E-Tag» diferente para continuar. Tentándoo outra vez. - + Server returned wrong content-range O servidor devolveu un intervalo de contidos estragado - + Connection Timeout Esgotouse o tempo de conexión @@ -1018,7 +1018,7 @@ actualización pode pedir privilexios adicionais durante o proceso. Update status is unknown: Did not check for new updates. - + O estado da actualización é descoñecido: non se comprobaron as actualizacións. @@ -1113,8 +1113,12 @@ Recomendámoslle que non o use. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - Non é posíbel conectar de forma segura. Quere, aínda así, conectar sen cifrar (non recomendado)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + @@ -1282,7 +1286,7 @@ Recomendámoslle que non o use. Open %1 in Browser - + Abrir %1 no navegador @@ -1306,27 +1310,27 @@ Recomendámoslle que non o use. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. A sincronización foi interrompida polo usuario. - + No E-Tag received from server, check Proxy/Gateway Non se recibiu a «E-Tag» do servidor, comprobe o proxy e/ou a pasarela - + We received a different E-Tag for resuming. Retrying next time. Recibiuse unha «E-Tag» diferente para continuar. Tentándoo outra vez. - + Server returned wrong content-range O servidor devolveu un intervalo de contidos estragado - + File %1 can not be downloaded because of a local file name clash! Non é posíbel descargar o ficheiro %1 por mor dunha colisión co nome dun ficheiro local! @@ -1334,15 +1338,20 @@ Recomendámoslle que non o use. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! Non é posíbel descargar o ficheiro %1 por mor dunha colisión co nome dun ficheiro local! - - File %1 cannot be saved because of a local file name clash! + + The file could not be downloaded completely. + + + File %1 cannot be saved because of a local file name clash! + O ficheiro %1 non se gardou debido a unha colisión co nome dun ficheiro local! + Mirall::PropagateItemJob @@ -1375,12 +1384,12 @@ Recomendámoslle que non o use. Error removing '%1': %2; - + Erro eliminando '%1': %2; Could not remove directory '%1'; - + Non se puido eliminar o directorio '%1'; @@ -1425,18 +1434,18 @@ Recomendámoslle que non o use. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely O ficheiro local cambiou durante a sincronización, sincronizando unha vez quedou completado - + Sync was aborted by user. A sincronización foi interrompida polo usuario. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. O ficheiro foi editado localmente mais é parte dunha compartición de só lectura. O ficheiro foi restaurado e a súa edición atopase no ficheiro de conflitos. @@ -1444,23 +1453,23 @@ Recomendámoslle que non o use. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. O ficheiro foi editado localmente mais é parte dunha compartición de só lectura. O ficheiro foi restaurado e a súa edición atopase no ficheiro de conflitos. - + The local file was removed during sync. O ficheiro local retirarase durante a sincronización. - + Local file changed during sync. O ficheiro local cambiou durante a sincronización. - + The server did not acknowledge the last chunk. (No e-tag were present) O servidor non recoñeceu o último fragmento. (Non hai e-tag presente) @@ -1538,28 +1547,39 @@ Recomendámoslle que non o use. O estado de sincronización foi copiado no portapapeis. - - Currently no files are ignored because of previous errors. - Actualmente non hai ficheiros ignorados por mor de erros anteriores. + + Currently no files are ignored because of previous errors and no downloads are in progress. + - + %n files are ignored because of previous errors. - Try to sync these again. + + + + %n files are partially downloaded. + + + + + + Try to sync these again. + + Mirall::SelectiveSyncDialog Choose What to Sync - + Escolla qué sincronizar Unchecked folders will be <b>removed</b> from your local file system and will not be synchronized to this computer anymore - + Os cartafoles non selecionados serán <b>eliminados</b> do seu sistema de ficheiros local e non se voltarán a sincronizar con esta computadora @@ -1634,12 +1654,12 @@ Recomendámoslle que non o use. Mirall::ShibbolethCredentials - + Login Error Erro de acceso - + You must sign in as user %1 Ten que rexistrarse como usuario %1 @@ -2014,7 +2034,7 @@ Recomendámoslle que non o use. The mounted directory is temporary not available on the server - + O directorio montado non está temporalmente dispoñible no servidor @@ -2047,69 +2067,69 @@ Recomendámoslle que non o use. O ficheiro conten caracteres incorrectos que non poden sincronizarse entre distintas plataformas. - + Unable to initialize a sync journal. Non é posíbel iniciar un rexistro de sincronización. - + Cannot open the sync journal Non foi posíbel abrir o rexistro de sincronización - - + + Ignored because of the "choose what to sync" blacklist - + Ignorado debido a lista negra de "escolla qué sincronizar" - + Not allowed because you don't have permission to add sub-directories in that directory Non está permitido xa que non ten permiso para engadir subdirectorios nese directorio - + Not allowed because you don't have permission to add parent directory Non está permitido xa que non ten permiso para engadir un directorio pai - + Not allowed because you don't have permission to add files in that directory Non está permitido xa que non ten permiso para engadir ficheiros nese directorio - + 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. - + Ficheiros locáis e cartafol compartido eliminados. - + 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 @@ -2155,7 +2175,7 @@ Recomendámoslle que non o use. There are no sync folders configured. - + Non existen cartafoles de sincronización configurados. @@ -2245,7 +2265,7 @@ Recomendámoslle que non o use. Discovering '%1' - + Atopando '%1' @@ -2273,7 +2293,7 @@ Recomendámoslle que non o use. <p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.<br/>Based on Mirall by Duncan Mac-Vicar P.</small></p><p>Copyright ownCloud, Inc.</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p> - + <p>Versión %2. Para máis información visite <a href="%3">%4</a></p><p><small>Por Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz e outros.<br/>Baseado en Mirall de Duncan Mac-Vicar P.</small></p><p>Copyright ownCloud, Inc.</p><p>Licenciado baixo a GNU General Public License (GPL) Version 2.0<br/>ownCloud e o Logo ownCloud son marcas rexistradas de ownCloud, Inc. nos Estados Unidos, outros países ou en ambos.</p> @@ -2300,12 +2320,12 @@ Recomendámoslle que non o use. Sync everything from server - + Sincronice todo o contido do servidor Choose what to sync - + Escolla qué sincronizar @@ -2315,7 +2335,7 @@ Recomendámoslle que non o use. &Start a clean sync (Erases the local folder!) - + &Iniciar unha nova sincronización (Elimina o cartafol local!) diff --git a/translations/mirall_hu.ts b/translations/mirall_hu.ts index c2c66d6d0..2c579e9b0 100644 --- a/translations/mirall_hu.ts +++ b/translations/mirall_hu.ts @@ -385,29 +385,29 @@ Total time left %5 - + Could not read system exclude file - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? - + Remove All Files? El legyen távolítva az összes fájl? - + Remove all files Összes fájl eltávolítása - + Keep files Fájlok megtartása @@ -634,22 +634,22 @@ Are you sure you want to perform this operation? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway - + We received a different E-Tag for resuming. Retrying next time. - + Server returned wrong content-range - + Connection Timeout @@ -1106,7 +1106,11 @@ It is not advisable to use it. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? @@ -1299,27 +1303,27 @@ It is not advisable to use it. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. - + No E-Tag received from server, check Proxy/Gateway - + We received a different E-Tag for resuming. Retrying next time. - + Server returned wrong content-range - + File %1 can not be downloaded because of a local file name clash! @@ -1327,12 +1331,17 @@ It is not advisable to use it. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! - + + The file could not be downloaded completely. + + + + File %1 cannot be saved because of a local file name clash! @@ -1418,18 +1427,18 @@ It is not advisable to use it. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely - + Sync was aborted by user. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. @@ -1437,23 +1446,23 @@ It is not advisable to use it. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. - + The local file was removed during sync. - + Local file changed during sync. - + The server did not acknowledge the last chunk. (No e-tag were present) @@ -1531,16 +1540,27 @@ It is not advisable to use it. - - Currently no files are ignored because of previous errors. + + Currently no files are ignored because of previous errors and no downloads are in progress. - + %n files are ignored because of previous errors. - Try to sync these again. + + + + %n files are partially downloaded. + + + + + + Try to sync these again. + + Mirall::SelectiveSyncDialog @@ -1627,12 +1647,12 @@ It is not advisable to use it. Mirall::ShibbolethCredentials - + Login Error - + You must sign in as user %1 @@ -2038,69 +2058,69 @@ It is not advisable to use it. - + Unable to initialize a sync journal. - + Cannot open the sync journal - - + + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add sub-directories in that directory - + Not allowed because you don't have permission to add parent directory - + Not allowed because you don't have permission to add files in that directory - + 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 diff --git a/translations/mirall_it.ts b/translations/mirall_it.ts index 425027791..a0296167f 100644 --- a/translations/mirall_it.ts +++ b/translations/mirall_it.ts @@ -386,12 +386,12 @@ Totale tempo rimanente %5 Sincronizza attività - + Could not read system exclude file Impossibile leggere il file di esclusione di sistema - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -400,17 +400,17 @@ Ciò potrebbe accadere in caso di riconfigurazione della cartella o di rimozione Sei sicuro di voler eseguire questa operazione? - + Remove All Files? Vuoi rimuovere tutti i file? - + Remove all files Rimuovi tutti i file - + Keep files Mantieni i file @@ -637,22 +637,22 @@ Sei sicuro di voler eseguire questa operazione? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway Nessun e-tag ricevuto dal server, controlla il proxy/gateway - + We received a different E-Tag for resuming. Retrying next time. Abbiamo ricevuto un e-tag diverso per il recupero. Riprova più tardi. - + Server returned wrong content-range Il server ha restituito un content-range errato - + Connection Timeout Connessione scaduta @@ -1112,8 +1112,16 @@ Non è consigliabile utilizzarlo. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - Impossibile connettersi in modo sicuro. Vuoi provare a connetterti senza cifratura (non consigliato)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + Impossibile connettersi in modo sicuro: + +%1 + +Vuoi invece connetterti senza cifratura (non consigliato)? @@ -1305,27 +1313,27 @@ Non è consigliabile utilizzarlo. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. Sincronizzazione interrotta dall'utente. - + No E-Tag received from server, check Proxy/Gateway Nessun e-tag ricevuto dal server, controlla il proxy/gateway - + We received a different E-Tag for resuming. Retrying next time. Abbiamo ricevuto un e-tag diverso per il recupero. Riprova più tardi. - + Server returned wrong content-range Il server ha restituito un content-range errato - + File %1 can not be downloaded because of a local file name clash! Il file %1 non può essere scaricato a causa di un conflitto con un file locale. @@ -1333,12 +1341,17 @@ Non è consigliabile utilizzarlo. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! Il file %1 non può essere scaricato a causa di un conflitto con un file locale. - + + The file could not be downloaded completely. + Il file non può essere scaricato completamente. + + + File %1 cannot be saved because of a local file name clash! Il file %1 non può essere salvato a causa di un conflitto con un file locale. @@ -1424,18 +1437,18 @@ Non è consigliabile utilizzarlo. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely Un file locale è cambiato durante la sincronizzazione, nuova sincronizzazione alla ricezione. - + Sync was aborted by user. Sincronizzazione interrotta dall'utente. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Il file è stato modificato localmente, ma è parte di una condivisione in sola lettura. È stato ripristinato e la tua modifica è nel file di conflitto. @@ -1443,23 +1456,23 @@ Non è consigliabile utilizzarlo. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Il file è stato modificato localmente, ma è parte di una condivisione in sola lettura. È stato ripristinato e la tua modifica è nel file di conflitto. - + The local file was removed during sync. Il file locale è stato rimosso durante la sincronizzazione. - + Local file changed during sync. Un file locale è cambiato durante la sincronizzazione. - + The server did not acknowledge the last chunk. (No e-tag were present) Il server non ha riconosciuto l'ultimo pezzo. (Non era presente alcun e-tag) @@ -1537,17 +1550,30 @@ Non è consigliabile utilizzarlo. Lo stato di sincronizzazione è stato copiato negli appunti. - - Currently no files are ignored because of previous errors. - Attualmente nessun file è ignorato a causa di errori precedenti. + + Currently no files are ignored because of previous errors and no downloads are in progress. + Attualmente nessun file è ignorato a causa di errori precedenti e non ci sono scaricamenti in corso. - + %n files are ignored because of previous errors. - Try to sync these again. + %n file sono ignorati a causa di errori precedenti. -Prova a sincronizzare nuovamente.%n file sono ignorati a causa di errori precedenti. -Prova a sincronizzare nuovamente. +%n file sono ignorati a causa di errori precedenti. + + + + + %n files are partially downloaded. + + %n file sono stati scaricati parzialmente. + %n file sono stati scaricati parzialmente. + + + + + Try to sync these again. + Prova a sincronizzarli nuovamente. @@ -1635,12 +1661,12 @@ Prova a sincronizzare nuovamente. Mirall::ShibbolethCredentials - + Login Error Errore di accesso - + You must sign in as user %1 Devi accedere con l'utente %1 @@ -2048,69 +2074,69 @@ Prova a sincronizzare nuovamente. Il file contiene caratteri non validi che non possono essere sincronizzati su diverse piattaforme. - + Unable to initialize a sync journal. Impossibile inizializzare il registro di sincronizzazione. - + Cannot open the sync journal Impossibile aprire il registro di sincronizzazione - - + + 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 sub-directories in that directory Non consentito poiché non disponi dei permessi per aggiungere sottocartelle in quella cartella - + Not allowed because you don't have permission to add parent directory 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 directory Non consentito poiché non disponi dei permessi per aggiungere file 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 diff --git a/translations/mirall_ja.ts b/translations/mirall_ja.ts index b36ac2a10..e5be379c4 100644 --- a/translations/mirall_ja.ts +++ b/translations/mirall_ja.ts @@ -386,12 +386,12 @@ Total time left %5 同期アクティビティ - + Could not read system exclude file システム上の除外ファイルを読み込めません - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -400,17 +400,17 @@ Are you sure you want to perform this operation? 本当にこの操作を実行しますか? - + Remove All Files? すべてのファイルを削除しますか? - + Remove all files すべてのファイルを削除 - + Keep files ファイルを残す @@ -637,22 +637,22 @@ Are you sure you want to perform this operation? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway サーバーからE-Tagを受信できません。プロキシ/ゲートウェイを確認してください。 - + We received a different E-Tag for resuming. Retrying next time. 同期再開時に違う E-Tagを受信しました。次回リトライします。 - + Server returned wrong content-range サーバーが間違ったcontent-rangeを返しました - + Connection Timeout 接続タイムアウト @@ -1111,8 +1111,16 @@ It is not advisable to use it. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - 安全に接続できませんでした。暗号化せずに接続しますか?(非推奨) + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + 安全な接続ができませんでした: + +%1 + +非暗号化接続しますか?(推奨されません) @@ -1304,27 +1312,27 @@ It is not advisable to use it. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. 同期はユーザーによって中止されました。 - + No E-Tag received from server, check Proxy/Gateway サーバーからE-Tagを受信できません。プロキシ/ゲートウェイを確認してください。 - + We received a different E-Tag for resuming. Retrying next time. 同期再開時に違う E-Tagを受信しました。次回リトライします。 - + Server returned wrong content-range サーバーが間違ったcontent-rangeを返しました - + File %1 can not be downloaded because of a local file name clash! ファイル %1 はローカルファイル名が衝突しているためダウンロードできません! @@ -1332,12 +1340,17 @@ It is not advisable to use it. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! ファイル %1 はローカルファイル名が衝突しているためダウンロードできません! - + + The file could not be downloaded completely. + + + + File %1 cannot be saved because of a local file name clash! %1 はローカルファイル名が衝突しているため保存できません! @@ -1423,18 +1436,18 @@ It is not advisable to use it. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely 同期中にローカルファイルが変更されました。完了してからもう一度同期してください。 - + Sync was aborted by user. 同期はユーザーによって中止されました。 - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. ファイルがローカルで編集されましたが、読み込み専用の共有の一部です。それは復元され、あなたの編集は競合するファイル内にあります。 @@ -1442,23 +1455,23 @@ It is not advisable to use it. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. ファイルがローカルで編集されましたが、読み込み専用の共有の一部です。ファイルは復元され、あなたの編集は競合するファイル内にあります。 - + The local file was removed during sync. ローカルファイルを同期時に削除します。 - + Local file changed during sync. ローカルのファイルが同期中に変更されました。 - + The server did not acknowledge the last chunk. (No e-tag were present) サーバーは最終チャンクを認識しません。(e-tag が存在しません) @@ -1536,16 +1549,28 @@ It is not advisable to use it. 同期状況をクリップボードにコピーしました。 - - Currently no files are ignored because of previous errors. - 処理前にエラーが発生したため、ファイルは何も除外されていません。 + + Currently no files are ignored because of previous errors and no downloads are in progress. + 以前のエラーのため無視したファイルはありません。進行中のダウンロードもありません。 - + %n files are ignored because of previous errors. - Try to sync these again. - 直前のエラーのため、%n個のファイルが無視されました。 -もう一度同期してください。 + + 前のエラーのため、%n個のファイルが無視されました。 + + + + + %n files are partially downloaded. + + %nファイルのダウンロードが不完全です。 + + + + + Try to sync these again. + これらをもう一度同期してください。 @@ -1633,12 +1658,12 @@ It is not advisable to use it. Mirall::ShibbolethCredentials - + Login Error ログインエラー - + You must sign in as user %1 ユーザー %1 としてログインする必要があります @@ -2046,69 +2071,69 @@ It is not advisable to use it. ファイルに無効な文字が含まれているため、クロスプラットフォーム環境での同期ができません。 - + Unable to initialize a sync journal. 同期ジャーナルの初期化ができません。 - + Cannot open the sync journal 同期ジャーナルを開くことができません - - + + Ignored because of the "choose what to sync" blacklist "同期対象先" ブラックリストにより無視されました。 - + Not allowed because you don't have permission to add sub-directories in that directory そのディレクトリにサブディレクトリを追加する権限がありません - + Not allowed because you don't have permission to add parent directory 親ディレクトリを追加する権限がありません - + Not allowed because you don't have permission to add files in that directory そのディレクトリにファイルを追加する権限がありません - + 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 移動元 diff --git a/translations/mirall_nl.ts b/translations/mirall_nl.ts index 57e72a438..4c4b2f819 100644 --- a/translations/mirall_nl.ts +++ b/translations/mirall_nl.ts @@ -386,12 +386,12 @@ Totaal resterende tijd %5 Synchronisatie-activiteit - + Could not read system exclude file Kon het systeem-uitsluitingsbestand niet lezen - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -400,17 +400,17 @@ Dit kan komen doordat de map ongemerkt opnieuw geconfigureerd is of doordat alle Weet u zeker dat u deze bewerking wilt uitvoeren? - + Remove All Files? Verwijder alle bestanden? - + Remove all files Verwijder alle bestanden - + Keep files Bewaar bestanden @@ -637,22 +637,22 @@ Weet u zeker dat u deze bewerking wilt uitvoeren? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway Geen E-Tag ontvangen van de server, controleer Proxy/Gateway - + We received a different E-Tag for resuming. Retrying next time. We ontvingen een afwijkende E-Tag om door te gaan. We proberen het later opnieuw. - + Server returned wrong content-range Server retourneerde verkeerde content-bandbreedte - + Connection Timeout Verbindingstime-out @@ -1113,8 +1113,16 @@ We adviseren deze site niet te gebruiken. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - Kon geen beveiligde verbinding maken. Wilt u een onversleutelde verbinding maken (niet aan te raden)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + Kon geen beveiligde verbinding maken: + +%1 + +Wilt u een onversleutelde verbinding maken (niet aanbevolen)? @@ -1306,27 +1314,27 @@ We adviseren deze site niet te gebruiken. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. Synchronisatie afgebroken door gebruiker. - + No E-Tag received from server, check Proxy/Gateway Geen E-Tag ontvangen van de server, controleer Proxy/Gateway - + We received a different E-Tag for resuming. Retrying next time. We ontvingen een afwijkende E-Tag om door te gaan. We proberen het later opnieuw. - + Server returned wrong content-range Server retourneerde verkeerde content-bandbreedte - + File %1 can not be downloaded because of a local file name clash! Bestand %1 kan niet worden gedownload omdat de naam conflicteert met een lokaal bestand @@ -1334,12 +1342,17 @@ We adviseren deze site niet te gebruiken. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! Bestand %1 kan niet worden gedownload omdat de naam conflicteert met een lokaal bestand - + + The file could not be downloaded completely. + Het bestand kon niet volledig worden gedownload. + + + File %1 cannot be saved because of a local file name clash! Bestand %1 kan niet worden opgeslagen wegens een lokaal bestandsnaam conflict! @@ -1425,18 +1438,18 @@ We adviseren deze site niet te gebruiken. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely Een lokaal bestand is gewijzigd tijdens het synchroniseren, wordt gesynchroniseerd als het volledig is aangekomen. - + Sync was aborted by user. Synchronisatie afgebroken door gebruiker. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Het bestand is lokaal bewerkt, maar hoort bij een alleen-lezen share. Het originele bestand is teruggezet en uw bewerking staat in het conflicten bestand. @@ -1444,23 +1457,23 @@ We adviseren deze site niet te gebruiken. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Het bestand is lokaal bewerkt, maar hoort bij een alleen-lezen share. Het originele bestand is teruggezet en uw bewerking staat in het conflicten bestand. - + The local file was removed during sync. Het lokale bestand werd verwijderd tijdens sync. - + Local file changed during sync. Lokaal bestand gewijzigd bij sync. - + The server did not acknowledge the last chunk. (No e-tag were present) De server heeft het laatste deel niet bevestigd (er was geen e-tag aanwezig) @@ -1538,17 +1551,29 @@ We adviseren deze site niet te gebruiken. Het synchronisatie overzicht is gekopieerd naar het klembord. - - Currently no files are ignored because of previous errors. - Er zijn nu geen bestanden genegeerd vanwege eerdere fouten. + + Currently no files are ignored because of previous errors and no downloads are in progress. + Er worden op dit moment geen bestanden genegeerd vanwege eerdere fouten er zijn geen downloads bezig. - + %n files are ignored because of previous errors. - Try to sync these again. - %1 bestand genegeerd vanwege eerdere fouten. -Probeer opnieuw te synchroniseren.%1 bestanden zijn genegeerd vanwege eerdere fouten. -Probeer opnieuw te synchroniseren. + + %n bestand genegeerd wegens eerdere fouten.%n bestanden genegeerd wegens eerdere fouten. + + + + + %n files are partially downloaded. + + %n bestand gedeeltelijk gedownload. +%n bestanden gedeeltelijk gedownload. + + + + + Try to sync these again. + Probeer deze opnieuw te synchen. @@ -1636,12 +1661,12 @@ Probeer opnieuw te synchroniseren. Mirall::ShibbolethCredentials - + Login Error Inlogfout - + You must sign in as user %1 U moet inloggen als gebruiker %1 @@ -2041,7 +2066,7 @@ Probeer opnieuw te synchroniseren. File is listed on the ignore list. - De file is opgenomen op de negeerlijst. + Het bestand is opgenomen op de negeerlijst. @@ -2049,69 +2074,69 @@ Probeer opnieuw te synchroniseren. Bestand bevat ongeldige karakters die niet tussen platformen gesynchroniseerd kunnen worden. - + Unable to initialize a sync journal. - Niet in staat om een synchornisatie journaal te starten. + Niet in staat om een synchronisatie transactielog te starten. - + Cannot open the sync journal - Kan het sync journal niet openen + Kan het sync transactielog niet openen - - + + Ignored because of the "choose what to sync" blacklist Genegeerd vanwege de "kies wat te synchen" zwarte lijst - + Not allowed because you don't have permission to add sub-directories in that directory Niet toegestaan, omdat u geen rechten hebt om sub-directories aan te maken in die directory - + Not allowed because you don't have permission to add parent directory Niet toegestaan, omdat u geen rechten hebt om een bovenliggende directories toe te voegen - + Not allowed because you don't have permission to add files in that directory Niet toegestaan, omdat u geen rechten hebt om bestanden in die directory 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 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 @@ -2380,7 +2405,7 @@ Probeer opnieuw te synchroniseren. Server &address: - Server adres: + Server &adres: @@ -2429,7 +2454,7 @@ Probeer opnieuw te synchroniseren. &Do not store password on local machine - &Geen wachtwoorden opslaan op de lokale machine. + &Sla geen wachtwoorden op op de lokale machine. @@ -2439,12 +2464,12 @@ Probeer opnieuw te synchroniseren. Enter the url of the ownCloud you want to connect to (without http or https). - Voer de url in van de ownCloud-server waarmee u wilt verbinden (met http of https). + Voer de URL in van de server waarmee u wilt verbinden (zonder http of https). Server &Address - Server&adres + Server &adres @@ -2560,7 +2585,7 @@ Probeer opnieuw te synchroniseren. Filesystem access error - Bestandssysteem toegangsfout + Toegangsfout van het bestandssysteem diff --git a/translations/mirall_pl.ts b/translations/mirall_pl.ts index 203ee4d1d..e9ee7b788 100644 --- a/translations/mirall_pl.ts +++ b/translations/mirall_pl.ts @@ -386,12 +386,12 @@ Pozostało czasu %5 Aktywności synchronizacji - + Could not read system exclude file Nie można przeczytać pliku wyłączeń - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -400,17 +400,17 @@ Mogło się tak zdarzyć z powodu niezauważonej rekonfiguracji folderu, lub te Czy jesteś pewien/pewna, że chcesz wykonać tę operację? - + Remove All Files? Usunąć wszystkie pliki? - + Remove all files Usuń wszystkie pliki - + Keep files Pozostaw pliki @@ -637,22 +637,22 @@ Czy jesteś pewien/pewna, że chcesz wykonać tę operację? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway Nie otrzymano E-Tag z serwera, sprawdź Proxy/Bramę - + We received a different E-Tag for resuming. Retrying next time. Otrzymaliśmy inny E-Tag wznowienia. Spróbuje ponownie następnym razem. - + Server returned wrong content-range Serwer zwrócił błędną zakres zawartości - + Connection Timeout Limit czasu połączenia @@ -1113,8 +1113,12 @@ Niezalecane jest jego użycie. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - Nie udało się połączyć bezpiecznie. Czy chcesz nawiązać połączenie nieszyfrowane (niezalecane)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + @@ -1306,27 +1310,27 @@ Niezalecane jest jego użycie. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. Synchronizacja anulowane przez użytkownika. - + No E-Tag received from server, check Proxy/Gateway Nie otrzymano E-Tag z serwera, sprawdź Proxy/Bramę - + We received a different E-Tag for resuming. Retrying next time. Otrzymaliśmy inny E-Tag wznowienia. Spróbuje ponownie następnym razem. - + Server returned wrong content-range Serwer zwrócił błędną zakres zawartości - + File %1 can not be downloaded because of a local file name clash! Nie można pobrać pliku %1 ze względu na konflikt nazwy pliku lokalnego! @@ -1334,12 +1338,17 @@ Niezalecane jest jego użycie. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! Nie można pobrać pliku %1 ze względu na konflikt nazwy pliku lokalnego! - + + The file could not be downloaded completely. + + + + File %1 cannot be saved because of a local file name clash! @@ -1425,18 +1434,18 @@ Niezalecane jest jego użycie. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely Lokalny plik zmienił się podczas synchronizacji, synchronizuję ponownie ponieważ dotarł w całości. - + Sync was aborted by user. Synchronizacja anulowane przez użytkownika. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Plik był edytowany lokalnie ale jest częścią udziału z prawem tylko do odczytu. Został przywrócony i Twoja edycja jest w pliku konfliktu @@ -1444,23 +1453,23 @@ Niezalecane jest jego użycie. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Plik był edytowany lokalnie ale jest częścią udziału z prawem tylko do odczytu. Został przywrócony i Twoja edycja jest w pliku konfliktu - + The local file was removed during sync. Pliki lokalny został usunięty podczas synchronizacji. - + Local file changed during sync. Lokalny plik zmienił się podczas synchronizacji. - + The server did not acknowledge the last chunk. (No e-tag were present) Serwer nie potwierdził ostatniego łańcucha danych. (Nie było żadnego e-tag-u) @@ -1538,16 +1547,27 @@ Niezalecane jest jego użycie. Status synchronizacji został skopiowany do schowka. - - Currently no files are ignored because of previous errors. - Obecnie nie ma plików, które są ignorowane z powodu wcześniejszych błędów. + + Currently no files are ignored because of previous errors and no downloads are in progress. + - + %n files are ignored because of previous errors. - Try to sync these again. + + + + %n files are partially downloaded. + + + + + + Try to sync these again. + + Mirall::SelectiveSyncDialog @@ -1634,12 +1654,12 @@ Niezalecane jest jego użycie. Mirall::ShibbolethCredentials - + Login Error Błąd logowania - + You must sign in as user %1 Musisz zalogować się jako użytkownik %1 @@ -2047,69 +2067,69 @@ Niezalecane jest jego użycie. Plik zawiera nieprawidłowe znaki, które nie mogą być synchronizowane wieloplatformowo. - + Unable to initialize a sync journal. Nie można zainicjować synchronizacji dziennika. - + Cannot open the sync journal Nie można otworzyć dziennika synchronizacji - - + + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add sub-directories in that directory Nie masz uprawnień do dodawania podkatalogów w tym katalogu. - + Not allowed because you don't have permission to add parent directory Nie masz uprawnień by dodać katalog nadrzędny - + Not allowed because you don't have permission to add files in that directory Nie masz uprawnień by dodać pliki 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. - + 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 diff --git a/translations/mirall_pt.ts b/translations/mirall_pt.ts index 7d8ea3b67..cff0335f6 100644 --- a/translations/mirall_pt.ts +++ b/translations/mirall_pt.ts @@ -9,17 +9,17 @@ Pick a local folder on your computer to sync - Escollha a pasta local a sincronizar + Escolha a pasta local no seu computador para sincronizar &Choose... - &Escolha... + &Escolher ... &Directory alias name: - Nome do &directorio: + Nome da &diretoria: @@ -32,17 +32,17 @@ Select a remote destination folder - Seleccione a pasta de destino + Selecione a pasta de destino remota Add Folder - Adicionar pasta + Adicionar Pasta Refresh - Actualizar + Atualizar @@ -70,28 +70,28 @@ Edit Ignored Files - Editar ficheiros ignorados + Editar Ficheiros Ignorados Modify Account - Modificar conta + Modificar Conta Account to Synchronize - Conta a sincronizar + Conta a Sincronizar Connected with <server> as <user> - Ligado a <server> como <user> + Conetado com <server> como <user> Pause - Pausa + Pausar @@ -101,22 +101,22 @@ Add Folder... - Adicionar Pasta... + Adicionar Pasta ... Choose What to Sync - Escolher o que sincronizar + Escolher o Que Sincronizar Storage Usage - Utilização do armazenamento + Utilização do Armazenamento Retrieving usage information... - A obter estatísticas de utilização... + A obter estatísticas da utilização ... @@ -126,12 +126,12 @@ Resume - Resumir + Retomar Confirm Folder Remove - Confirme a remoção da pasta + Confirmar Remover Pasta @@ -141,7 +141,7 @@ Confirm Folder Reset - Confirmar reposição da pasta + Confirmar Repor Pasta @@ -168,12 +168,12 @@ %1 (%3%) of %2 server space in use. - %1 (%3%) de %2 de espaço utilizado. + %1 (%3%) de %2 de espaço do servidor em uso. No connection to %1 at <a href="%2">%3</a>. - Sem ligação a %1 em <a href="%2">%3</a>. + Sem coneção para %1 em <a href="%2">%3</a>. @@ -183,7 +183,7 @@ Sync Running - A sincronização está a decorrer + Sincronização em Execução @@ -204,29 +204,29 @@ %1 %2 (%3 of %4) %5 left at a rate of %6/s Example text: "uploading foobar.png (1MB of 2MB) time left 2 minutes at a rate of 24Kb/s" - %1 %2 (%3 de %4) %5 faltando a uma taxa de %6/s + %1 %2 (%3 de %4) %5 restante, a uma taxa de %6/s %1 of %2, file %3 of %4 Total time left %5 - - + %1 of %2, ficheiro %3 de %4 +Tempo total restante %5 Connected to <a href="%1">%2</a>. - Conectado a <a href="%1">%2</a>. + Conetado a <a href="%1">%2</a>. Connected to <a href="%1">%2</a> as <i>%3</i>. - Conectado a <a href="%1">%2</a> como <i>%3</i>. + Conetado a <a href="%1">%2</a> como <i>%3</i>. Currently there is no storage usage information available. - Histórico de utilização de armazenamento não disponível. + Atualmente não está disponível nenhuma informação da utilização do armazenamento. @@ -234,22 +234,22 @@ Total time left %5 Authentication Required - Autenticação necessária + Autenticação Requerida Enter username and password for '%1' at %2. - Introduza o nome de utilizador e password para '%1' em %2. + Insira o nome de utilizador e a senha para '%1' em %2. &User: - &Utilizador + &Utilizador: &Password: - Password&: + &Senha: @@ -273,12 +273,12 @@ Total time left %5 Unable to connect to %1 - Não foi possível ligar a %1 + Não foi possível conetar a %1 timeout - tempo limite + tempo expirado @@ -291,7 +291,7 @@ Total time left %5 Unable to create csync-context - Impossível criar 'csync-context' + Não é possível criar 'csync-context' @@ -306,7 +306,7 @@ Total time left %5 %1 is not readable. - Não é possível ler %1 + %1 não é legível. @@ -335,18 +335,18 @@ Total time left %5 %1 has been downloaded. %1 names a file. - Fez o download de %1 + %1 foi transferido. %1 and %2 other files have been updated. - Os ficheiros %1 e %2 foram actualizados. + %1 e %2 outros ficheiros foram atualizados. %1 has been updated. %1 names a file. - %1 foi actualizado. + %1 foi atualizado. @@ -383,15 +383,15 @@ Total time left %5 Sync Activity - Actividade de sincronicação + Atividade de Sincronização - + Could not read system exclude file Não foi possível ler o ficheiro system exclude - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -399,17 +399,17 @@ Are you sure you want to perform this operation? Se você, ou o seu administrador, reiniciou a sua conta no servidor, escolha "Manter os ficheiros". Se quer apagar os seus dados, escolha "Remover todos os ficheiros". - + Remove All Files? Remover todos os ficheiros? - + Remove all files Remover todos os ficheiros - + Keep files Manter os ficheiros @@ -434,22 +434,22 @@ Se você, ou o seu administrador, reiniciou a sua conta no servidor, escolha &q Waits to start syncing. - A aguardar o inicio da sincronização. + A aguardar para iniciar a sincronização. Preparing for sync. - A preparar para sincronização. + A preparar para sincronizar. Sync is running. - A sincronização está a correr. + A sincronização está em execução. Last Sync was successful. - A última sincronização foi efectuada com sucesso. + A última sincronização foi efetuada com sucesso. @@ -469,12 +469,12 @@ Se você, ou o seu administrador, reiniciou a sua conta no servidor, escolha &q Sync is paused. - A sincronização está em pausa. + A sincronização está pausada. %1 (Sync is paused) - %1 (Sincronização em pausa) + %1 (A sincronização está pausada) @@ -488,12 +488,12 @@ Se você, ou o seu administrador, reiniciou a sua conta no servidor, escolha &q Syncing all files in your account with - A sincronizar todos os ficheiros sua conta com + A sincronizar todos os ficheiros na sua conta com Remote path: %1 - Pasta remota: %1 + Caminho remoto: %1 @@ -502,7 +502,7 @@ Se você, ou o seu administrador, reiniciou a sua conta no servidor, escolha &q Add Folder - Acrescentar pasta + Adicionar Pasta @@ -510,7 +510,7 @@ Se você, ou o seu administrador, reiniciou a sua conta no servidor, escolha &q Click to select a local folder to sync. - Escolha a pasta local a sincronizar. + Clique para selecionar a pasta local para sincronizar. @@ -636,22 +636,22 @@ Se você, ou o seu administrador, reiniciou a sua conta no servidor, escolha &q Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway Nenhum E-Tag recebido do servidor, verifique Proxy / gateway - + We received a different E-Tag for resuming. Retrying next time. Recebemos um e-Tag diferente para resumir. Tentando uma próxima vez. - + Server returned wrong content-range O servidor retornou o alcance-conteúdo errado - + Connection Timeout O tempo de ligação expirou @@ -705,12 +705,12 @@ Se você, ou o seu administrador, reiniciou a sua conta no servidor, escolha &q Enter Password - Introduza a Palavra-passe + Insira a Senha Please enter %1 password for user '%2': - Por favor introduza %1 password para o utilizador '%2': + Por favor, insira %1 senha para o utilizador '%2': @@ -728,7 +728,7 @@ Se você, ou o seu administrador, reiniciou a sua conta no servidor, escolha &q Remove - Apagar + Remover @@ -851,7 +851,7 @@ Itens verificados também serão removidos se evitarem que um diretório seja re <p>A new version of the %1 Client is available.</p><p><b>%2</b> is available for download. The installed version is %3.</p> - <p>A nova serão do %1 Cliente está disponivel.</p><p><b>%2</b> está disponível para descarga. A versão instalada é a %3.</p> + <p>A nova serão do %1 Cliente está disponivel.</p><p><b>%2</b> está disponível para transferência. A versão instalada é a %3.</p> @@ -947,17 +947,17 @@ Itens verificados também serão removidos se evitarem que um diretório seja re Hostname of proxy server - Nome do servidor proxy. + Nome do servidor proxy Username for proxy server - Nome de utilizador para o servidor proxy. + Nome de utilizador para o servidor proxy Password for proxy server - Password para o servidor proxy. + Senha para o servidor proxy. @@ -975,7 +975,7 @@ Itens verificados também serão removidos se evitarem que um diretório seja re New Update Ready - Nova actualização disponível + Nova atualização disponível @@ -1006,7 +1006,7 @@ for additional privileges during the process. New version %1 available. Please use the system's update tool to install it. - Uma nova versão %1 está disponível. Por favor use o sistema de actualização para instalar. + Nova versão %1 disponível. Por favor use a ferramenta de atualização do sistema para a instalar. @@ -1016,7 +1016,7 @@ for additional privileges during the process. Update status is unknown: Did not check for new updates. - Estado de actualização é desconhecido: não foi possível procurar novas actualizações + Estado de actualização é desconhecido: não foi possível procurar novas actualizações. @@ -1110,8 +1110,16 @@ It is not advisable to use it. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - Não foi possível estabelecer uma ligação segura. Deseja utilizar uma ligação não segura?(não recomendado)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + Não foi possível ligar com segurança: + +%1 + +Em vez disso deseja utilizar uma ligação não codificada (não recomendado)? @@ -1303,27 +1311,27 @@ It is not advisable to use it. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. A sincronização foi cancelada pelo utilizador. - + No E-Tag received from server, check Proxy/Gateway Nenhum E-Tag recebido do servidor, verifique Proxy / gateway - + We received a different E-Tag for resuming. Retrying next time. Recebemos um e-Tag diferente para resumir. Tentando uma próxima vez. - + Server returned wrong content-range O servidor retornou o alcance-conteúdo errado - + File %1 can not be downloaded because of a local file name clash! O ficheiro %1 não pode ser descarregado devido a conflito com um nome de ficheiro local! @@ -1331,12 +1339,17 @@ It is not advisable to use it. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! O ficheiro %1 não pode ser descarregado devido a conflito com um nome de ficheiro local! - + + The file could not be downloaded completely. + Não foi possível transferir o ficheiro na totalidade. + + + File %1 cannot be saved because of a local file name clash! Ficheiro %1 não pode ser guardado devido à existência de um ficheiro local com o mesmo nome. @@ -1422,18 +1435,18 @@ It is not advisable to use it. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely Ficheiro local foi alterado durante a sincronização. A sincronizar quando chegar na totalidade - + Sync was aborted by user. A sincronização foi cancelada pelo utilizador. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. O ficheiro foi editado localmente mas faz parte de uma prtilha só de leitura. Foi restaurado mas a edição está no ficheiro de conflito. @@ -1441,23 +1454,23 @@ It is not advisable to use it. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. O ficheiro foi editado localmente mas faz parte de uma prtilha só de leitura. Foi restaurado mas a edição está no ficheiro de conflito. - + The local file was removed during sync. O arquivo local foi removido durante a sincronização. - + Local file changed during sync. Ficheiro local alterado durante a sincronização. - + The server did not acknowledge the last chunk. (No e-tag were present) O servidor não reconheceu o último bloco. (Nenhuma e-tag estava presente) @@ -1535,17 +1548,30 @@ It is not advisable to use it. O estado da sincronização foi copiada para a área de transferência. - - Currently no files are ignored because of previous errors. - Devido a erros anteriores, nenhum ficheiro é ignorado. + + Currently no files are ignored because of previous errors and no downloads are in progress. + Atualmente os ficheiros não são ignorados devido a erros anteriores e não existem transferências em progresso - + %n files are ignored because of previous errors. - Try to sync these again. - %n ficheiros são ignorados devido a erros anteriores. -Tente sincronizá-los novamente.%n ficheiros são ignorados devido a erros anteriores. -Tente sincronizá-los novamente. + + é ignorado %n ficheiro devido a erros anteriores. +são ignorados %n ficheiros devido a erros anteriores. + + + + + %n files are partially downloaded. + + %n ficheiro foi parcialmente transferido. +%n ficheiros foram parcialmente transferidos. + + + + + Try to sync these again. + Tente sincronizar estes também. @@ -1633,12 +1659,12 @@ Tente sincronizá-los novamente. Mirall::ShibbolethCredentials - + Login Error Erro de login - + You must sign in as user %1 Deve fazer o login como utilizador %1. @@ -2047,69 +2073,69 @@ Por favor utilize um servidor de sincronização horária (NTP), no servidor e n O ficheiro contém caracteres inválidos que não podem ser sincronizados pelas várias plataformas. - + Unable to initialize a sync journal. Impossível inicializar sincronização 'journal'. - + Cannot open the sync journal Impossível abrir o jornal de sincronismo - - + + 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 sub-directories in that directory Não permitido, porque não tem permissão para adicionar sub-directórios ao directório - + Not allowed because you don't have permission to add parent directory Não permitido, porque não tem permissão para adicionar o directório principal - + Not allowed because you don't have permission to add files in that directory Não permitido, porque não tem permissão para adicionar ficheiros no directório - + Not allowed to upload this file because it is read-only on the server, restoring Não é permitido fazer o envio deste ficheiro porque é só de leitura no servidor, restaurando - - + + 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 @@ -2220,12 +2246,12 @@ Por favor utilize um servidor de sincronização horária (NTP), no servidor e n Sign in... - Entrar... + Iniciar sessão... Sign out - Sair + Terminar sessão @@ -2255,7 +2281,7 @@ Por favor utilize um servidor de sincronização horária (NTP), no servidor e n Syncing %1 (%2 left) - Sincronizando %1 (%2 faltando) + A sincronizar %1 (%2 em falta) @@ -2265,7 +2291,7 @@ Por favor utilize um servidor de sincronização horária (NTP), no servidor e n Up to date - Actualizado + Atualizado @@ -2273,7 +2299,7 @@ Por favor utilize um servidor de sincronização horária (NTP), no servidor e n <p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.<br/>Based on Mirall by Duncan Mac-Vicar P.</small></p><p>Copyright ownCloud, Inc.</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p> - <p>Versão %2. Para mais informação visita <a href="%3">%4</a></p><p><small>Por Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.<br/>Baseado em Mirall por Duncan Mac-Vicar P.</small></p><p>Copyright ownCloud, Inc.</p><p>Licenciado sob a GNU General Public License (GPL) Versão 2.0<br/>ownCloud e ownCloud Logo são marcas registadas de ownCloud, Inc. nos Estados Unidos da América, em outros países, ou ambos.</p> + <p>Versão %2. Para mais informações visite <a href="%3">%4</a></p><p><small>Por Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.<br/>Baseado em Mirall por Duncan Mac-Vicar P.</small></p><p>Copyright ownCloud, Inc.</p><p>Licenciado sob a GNU General Public License (GPL) Versão 2.0<br/>ownCloud e ownCloud Logo são marcas registadas de ownCloud, Inc. nos Estados Unidos da América, em outros países, ou ambos.</p> @@ -2353,7 +2379,7 @@ Por favor utilize um servidor de sincronização horária (NTP), no servidor e n &Password - &Password + &Senha @@ -2412,22 +2438,22 @@ Por favor utilize um servidor de sincronização horária (NTP), no servidor e n &Password: - Password&: + &Senha: Enter the ownCloud password. - Introduza a sua palavra-passe do ownCloud + Introduza a sua senha do ownCloud Do not allow the local storage of the password. - Não permitir que a palavra-passe seja guardada. + Não permitir que a senha seja guardada localmente. &Do not store password on local machine - &Não guardar a password + &Não guardar a senha na máquina local diff --git a/translations/mirall_pt_BR.ts b/translations/mirall_pt_BR.ts index 7af8da783..1f30273f7 100644 --- a/translations/mirall_pt_BR.ts +++ b/translations/mirall_pt_BR.ts @@ -386,12 +386,12 @@ Total de tempo que falta 5% Atividade de Sincronização - + Could not read system exclude file Não foi possível ler o sistema de arquivo de exclusão - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -400,17 +400,17 @@ Isso pode ser porque a pasta foi silenciosamente reconfigurada, ou todos os arqu Você tem certeza que quer executar esta operação? - + Remove All Files? Deseja Remover Todos os Arquivos? - + Remove all files Remover todos os arquivos - + Keep files Manter arquivos @@ -637,22 +637,22 @@ Você tem certeza que quer executar esta operação? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway Nenhuma E-Tag recebida do servidor, verifique Proxy / gateway - + We received a different E-Tag for resuming. Retrying next time. Recebemos um e-Tag diferente para resumir. Tente uma próxima vez. - + Server returned wrong content-range O servidor retornou erro numa série-de-conteúdo - + Connection Timeout Conexão Finalizada @@ -1111,8 +1111,16 @@ It is not advisable to use it. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - Não foi possível conectar com segurança. Você deseja se conectar sem usar criptografia (não recomendado)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + Não foi possível conectar com segurança: + +%1 + +Você deseja se conectar sem criptografia (não recomendado)? @@ -1304,27 +1312,27 @@ It is not advisable to use it. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. A sincronização foi abortada pelo usuário. - + No E-Tag received from server, check Proxy/Gateway Nenhuma E-Tag recebida do servidor, verifique Proxy / gateway - + We received a different E-Tag for resuming. Retrying next time. Recebemos um e-Tag diferente para resumir. Tente uma próxima vez. - + Server returned wrong content-range O servidor retornou erro numa série-de-conteúdo - + File %1 can not be downloaded because of a local file name clash! O arquivo %1 não pode ser baixado por causa de um confronto local no nome do arquivo! @@ -1332,12 +1340,17 @@ It is not advisable to use it. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! O arquivo %1 não pode ser baixado por causa de um confronto local no nome do arquivo! - + + The file could not be downloaded completely. + O arquivo não pode ser baixado completamente. + + + File %1 cannot be saved because of a local file name clash! O arquivo %1 não pode ser salvo por causa de um confronto com um nome de arquivo local! @@ -1423,18 +1436,18 @@ It is not advisable to use it. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely Arquivo local alterado durante a sincronização, sincronizando uma vez que chegou completamente - + Sync was aborted by user. A sincronização foi abortada pelo usuário. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. O arquivo foi editado localmente mas faz parte de compartilhamento só de leitura. Ele foi restaurado mas sua edição está em conflito com o arquivo. @@ -1442,23 +1455,23 @@ It is not advisable to use it. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. O arquivo foi editado localmente mas faz parte de compartilhamento só de leitura. Ele foi restaurado mas sua edição está em conflito com o arquivo. - + The local file was removed during sync. O arquivo local foi removido durante a sincronização. - + Local file changed during sync. Arquivo local modificado durante a sincronização. - + The server did not acknowledge the last chunk. (No e-tag were present) O servidor não reconheceu o último bloco. (Nenhuma e-tag estava presente) @@ -1536,15 +1549,29 @@ It is not advisable to use it. O estado de sincronização foi copiado para a área de transferência. - - Currently no files are ignored because of previous errors. - Correntemente nenhum arquivo será ignorado por causa de erros prévios. + + Currently no files are ignored because of previous errors and no downloads are in progress. + Atualmente não há arquivos ignorados devido a erros anteriores e nenhum downloads está em andamento. - + %n files are ignored because of previous errors. - Try to sync these again. - + + %n arquivo foi ignorado por causa dos erros anteriores. +%n arquivos foram ignorados por causa dos erros anteriores. + + + + + %n files are partially downloaded. + + %n arquivo está parcialmente baixado. +%n arquivos forão parcialmente baixados. + + + + Try to sync these again. + Tente sincronizar estes novamente. @@ -1632,12 +1659,12 @@ It is not advisable to use it. Mirall::ShibbolethCredentials - + Login Error Erro de Login - + You must sign in as user %1 Você deve entrar como usuário %1 @@ -2045,69 +2072,69 @@ It is not advisable to use it. Arquivos que contém caracteres inválidos não podem ser sincronizados através de plataformas. - + Unable to initialize a sync journal. Impossibilitado de iniciar a sincronização. - + Cannot open the sync journal Não é possível abrir o arquivo de sincronização - - + + 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 sub-directories in that directory Não permitido porque você não tem permissão de criar sub-pastas nesta pasta - + Not allowed because you don't have permission to add parent directory Não permitido porque você não tem permissão de criar pastas mãe - + Not allowed because you don't have permission to add files in that directory Não permitido porque você não tem permissão de adicionar arquivos a esta 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 diff --git a/translations/mirall_ru.ts b/translations/mirall_ru.ts index 018950bda..298726c05 100644 --- a/translations/mirall_ru.ts +++ b/translations/mirall_ru.ts @@ -198,7 +198,7 @@ Discovering '%1' - + Ищем '%1' @@ -386,12 +386,12 @@ Total time left %5 Журнал синхронизации - + Could not read system exclude file Невозможно прочесть исключенный системный файл - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -400,17 +400,17 @@ Are you sure you want to perform this operation? Вы уверены, что хотите выполнить операцию? - + Remove All Files? Удалить все файлы? - + Remove all files Удалить все файлы - + Keep files Сохранить файлы @@ -637,22 +637,22 @@ Are you sure you want to perform this operation? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway E-Tag от сервера на получен, проверьте сетевые настройки (настройки прокси, шлюз). - + We received a different E-Tag for resuming. Retrying next time. Мы получили другой E-Tag для возобновления. Повторите попытку позже. - + Server returned wrong content-range Сервер вернул неверный диапазон содержания - + Connection Timeout Тайм-аут подключения @@ -1113,8 +1113,16 @@ It is not advisable to use it. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - Не удалось безопасно подключиться . Вы хотите подключиться в незашифрованном виде(не рекомендуется)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + Не удаётся установить защищённое подключение к: + +%1 + +Хотите установить незашифрованное подключение (не рекомендуется)? @@ -1306,27 +1314,27 @@ It is not advisable to use it. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. Синхронизация прервана пользователем. - + No E-Tag received from server, check Proxy/Gateway E-Tag от сервера на получен, проверьте сетевые настройки (настройки прокси, шлюз). - + We received a different E-Tag for resuming. Retrying next time. Мы получили другой E-Tag для возобновления. Повторите попытку позже. - + Server returned wrong content-range Сервер вернул неверный диапазон содержания - + File %1 can not be downloaded because of a local file name clash! Файл %1 не может быть загружен из-за локальных конфликтов имен! @@ -1334,14 +1342,19 @@ It is not advisable to use it. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! Файл %1 не может быть загружен из-за локальных конфликтов имен! - + + The file could not be downloaded completely. + Невозможно полностью загрузить файл. + + + File %1 cannot be saved because of a local file name clash! - + Файл %1 не может быть сохранён из-за совпадения его имени с локальным файлом! @@ -1425,18 +1438,18 @@ It is not advisable to use it. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely Локальный файл изменился в процессе синхронизации, повторяем процесс - + Sync was aborted by user. Синхронизация прервана пользователем. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Этот файл был изменен локально, но является частью опубликованной папки с правами только для чтения. Он восстановлен и ваши изменения находятся в файле конфликтов. @@ -1444,23 +1457,23 @@ It is not advisable to use it. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Этот файл был изменен локально, но является частью опубликованной папки с правами только для чтения. Он восстановлен и ваши изменения находятся в файле конфликтов. - + The local file was removed during sync. Локальный файл был удалён в процессе синхронизации. - + Local file changed during sync. Локальный файл изменился в процессе синхронизации. - + The server did not acknowledge the last chunk. (No e-tag were present) Сервер не смог подтвердить последний отрезок данных. (Отсутствовали теги e-tag) @@ -1538,18 +1551,33 @@ It is not advisable to use it. Статус синхронизации скопирован в буфер обмена. - - Currently no files are ignored because of previous errors. - На данный момент файлы, игнорируемые из-за ошибок, отсутствуют. + + Currently no files are ignored because of previous errors and no downloads are in progress. + В настоящий момент из-за предыдущих ошибок ни один из файлов не игнорируется и нет ни одной активной загрузки. - + %n files are ignored because of previous errors. - Try to sync these again. - %n файл проигнорированы из-за предыдущих ошибок. -Попробуйте синхронизировать их ещё раз.%n файлов проигнорированы из-за предыдущих ошибок. -Попробуйте синхронизировать их ещё раз.%n файла проигнорированы из-за предыдущих ошибок. -Попробуйте синхронизировать их ещё раз. + + %n файл игнорируется из-за предыдущих ошибок. + +%n файла игнорируются из-за предыдущих ошибок. +%n файлов игнорируются из-за предыдущих ошибок. + + + + + %n files are partially downloaded. + + %n файл частично загружен. +%n файла частично загружены. +%n файлов частично загружены. + + + + + Try to sync these again. + Попробуйте синхронизировать позже @@ -1562,7 +1590,7 @@ It is not advisable to use it. Unchecked folders will be <b>removed</b> from your local file system and will not be synchronized to this computer anymore - + Неотмеченные папки будут <b>удалены</b> из вашей локальной файловой системы и больше не будут синхронизироваться на этом компьютере @@ -1637,12 +1665,12 @@ It is not advisable to use it. Mirall::ShibbolethCredentials - + Login Error Ошибка входа - + You must sign in as user %1 Вы должны войти как пользователь %1 @@ -2050,69 +2078,69 @@ It is not advisable to use it. Файл содержит недопустимые символы, которые невозможно синхронизировать между платформами. - + Unable to initialize a sync journal. Не удалось инициализировать журнал синхронизации. - + Cannot open the sync journal Не удаётся открыть журнал синхронизации - - + + Ignored because of the "choose what to sync" blacklist Игнорируется из-за черного списка в "выбрать что синхронизировать" - + Not allowed because you don't have permission to add sub-directories in that directory Недопустимо из-за отсутствия у вас разрешений на добавление подпапок в этой папке - + Not allowed because you don't have permission to add parent directory Недопустимо из-за отсутствия у вас разрешений на добавление родительской папки - + Not allowed because you don't have permission to add files in that directory Недопустимо из-за отсутствия у вас разрешений на добавление файлов в эту папку - + 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 Источник @@ -2248,7 +2276,7 @@ It is not advisable to use it. Discovering '%1' - + Ищем '%1' diff --git a/translations/mirall_sk.ts b/translations/mirall_sk.ts index 27ee09d7d..568a656a0 100644 --- a/translations/mirall_sk.ts +++ b/translations/mirall_sk.ts @@ -386,12 +386,12 @@ Celkom zostáva %5 Aktivita synchronizácie - + Could not read system exclude file - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -400,17 +400,17 @@ Toto môže byť kvôli tichej rekonfigurácii priečinka, prípadne boli všetk Ste si istý, že chcete uskutočniť danú operáciu? - + Remove All Files? Odstrániť všetky súbory? - + Remove all files Odstrániť všetky súbory - + Keep files Ponechať súbory @@ -637,22 +637,22 @@ Ste si istý, že chcete uskutočniť danú operáciu? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway Zo servera nebol prijatý E-Tag, skontrolujte proxy/bránu - + We received a different E-Tag for resuming. Retrying next time. Prijali sme iný E-Tag pre pokračovanie. Skúsim to neskôr znovu. - + Server returned wrong content-range Server vrátil nesprávnu hodnotu Content-range - + Connection Timeout Spojenie vypršalo @@ -1113,8 +1113,12 @@ Nie je vhodné ju používať. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - Nemožno sa bezpečne pripojiť. Chcete sa pripojiť nešifrovane (neodporúča sa)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + @@ -1306,27 +1310,27 @@ Nie je vhodné ju používať. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. Synchronizácia zrušená používateľom. - + No E-Tag received from server, check Proxy/Gateway Zo servera nebol prijatý E-Tag, skontrolujte proxy/bránu - + We received a different E-Tag for resuming. Retrying next time. Prijali sme iný E-Tag pre pokračovanie. Skúsim to neskôr znovu. - + Server returned wrong content-range Server vrátil nesprávnu hodnotu Content-range - + File %1 can not be downloaded because of a local file name clash! Súbor %1 nie je možné stiahnuť, pretože súbor s rovnakým menom už existuje! @@ -1334,12 +1338,17 @@ Nie je vhodné ju používať. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! Súbor %1 nie je možné stiahnuť, pretože súbor s rovnakým menom už existuje! - + + The file could not be downloaded completely. + + + + File %1 cannot be saved because of a local file name clash! @@ -1425,18 +1434,18 @@ Nie je vhodné ju používať. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely Lokálny súbor bol počas synchronizácie zmenený, zosynchronizuje sa, akonáhle bude kompletný - + Sync was aborted by user. Synchronizácia zrušená používateľom. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Súbor bol zmenený, ale je súčasťou zdieľania len na čítanie. Pôvodný súbor bol obnovený a upravená verzia je uložená v konfliktnom súbore. @@ -1444,23 +1453,23 @@ Nie je vhodné ju používať. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Súbor bol zmenený, ale je súčasťou zdieľania len na čítanie. Pôvodný súbor bol obnovený a upravená verzia je uložená v konfliktnom súbore. - + The local file was removed during sync. Lokálny súbor bol odstránený počas synchronizácie. - + Local file changed during sync. Lokálny súbor bol zmenený počas synchronizácie. - + The server did not acknowledge the last chunk. (No e-tag were present) Server nepotvrdil posledný kúsok. (Nebol prítomný e-tag) @@ -1538,16 +1547,27 @@ Nie je vhodné ju používať. Stav synchronizácie bol nakopírovaný do schránky. - - Currently no files are ignored because of previous errors. - V súčastnosti nie sú na čiernej listine žiadne súbory kvôli predchádzajúcim chybovým stavom. + + Currently no files are ignored because of previous errors and no downloads are in progress. + - + %n files are ignored because of previous errors. - Try to sync these again. + + + + %n files are partially downloaded. + + + + + + Try to sync these again. + + Mirall::SelectiveSyncDialog @@ -1634,12 +1654,12 @@ Nie je vhodné ju používať. Mirall::ShibbolethCredentials - + Login Error Chybné prihlásenie - + You must sign in as user %1 Musíte sa prihlásiť ako používateľ %1 @@ -2047,69 +2067,69 @@ Nie je vhodné ju používať. Súbor obsahuje neplatné znaky, ktoré nemôžu byť zosynchronizované medzi platformami. - + Unable to initialize a sync journal. Nemôžem inicializovať synchronizačný žurnál. - + Cannot open the sync journal Nemožno otvoriť sync žurnál - - + + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add sub-directories in that directory Nie je dovolené, pretože nemáte oprávnenie pridávať do tohto adresára podadresáre. - + Not allowed because you don't have permission to add parent directory Nie je dovolené, pretože nemáte oprávnenie pridať nadradený adresár. - + Not allowed because you don't have permission to add files in that directory Nie je dovolené, pretože nemáte oprávnenie pridávať do tohto adresára súbory. - + 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. - + 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 @@ -2300,7 +2320,7 @@ Nie je vhodné ju používať. Sync everything from server - + Synchronizovať všetko zo servera diff --git a/translations/mirall_sl.ts b/translations/mirall_sl.ts index 7113bfec7..d879b38b7 100644 --- a/translations/mirall_sl.ts +++ b/translations/mirall_sl.ts @@ -386,12 +386,12 @@ Skupaj še %5 Dejavnost usklajevanja - + Could not read system exclude file Ni mogoče prebrati sistemske izločitvene datoteke - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -400,17 +400,17 @@ Mapa je bila morda odstranjena ali pa so bile nastavitve spremenjene. Ali sta prepričani, da želite izvesti to opravilo? - + Remove All Files? Ali naj bodo odstranjene vse datoteke? - + Remove all files Odstrani vse datoteke - + Keep files Ohrani datoteke @@ -637,22 +637,22 @@ Ali sta prepričani, da želite izvesti to opravilo? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway Ni prejete oznake s strežnika. Preveriti je treba podatke posredovalnega strežnika ali prehoda. - + We received a different E-Tag for resuming. Retrying next time. Prejeta je različna oznaka za nadaljevanje opravila. Ponovni poskus bo izveden kasneje. - + Server returned wrong content-range Odziv strežnika kaže na neveljaven obseg vsebine - + Connection Timeout Povezava časovno pretekla @@ -1113,8 +1113,16 @@ Uporaba ni priporočljiva. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - Ni mogoče vzpostaviti varne povezave. Ali želite vzpostaviti nešifrirano povezavo (ni priporočljivo)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + Ni mogoče vzpostaviti varne povezave: + +%1 + +Ali želite vzpostaviti nešifrirano povezavo (ni priporočljivo)? @@ -1306,27 +1314,27 @@ Uporaba ni priporočljiva. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. Usklajevanje je bilo prekinjeno s strani uporabnika - + No E-Tag received from server, check Proxy/Gateway Ni prejete oznake s strežnika. Preveriti je treba podatke posredovalnega strežnika ali prehoda. - + We received a different E-Tag for resuming. Retrying next time. Prejeta je različna oznaka za nadaljevanje opravila. Ponovni poskus bo izveden kasneje. - + Server returned wrong content-range Odziv strežnika kaže na neveljaven obseg vsebine - + File %1 can not be downloaded because of a local file name clash! Datoteke %1 ni možno prejeti, zaradi neskladja z imenom krajevne datoteke! @@ -1334,15 +1342,20 @@ Uporaba ni priporočljiva. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! Datoteke %1 ni mogoče prejeti zaradi neskladja z imenom krajevne datoteke! - - File %1 cannot be saved because of a local file name clash! + + The file could not be downloaded completely. + + + File %1 cannot be saved because of a local file name clash! + Datoteke %1 ni mogoče shraniti zaradi neskladja z imenom obstoječe datoteke! + Mirall::PropagateItemJob @@ -1375,12 +1388,12 @@ Uporaba ni priporočljiva. Error removing '%1': %2; - + Napaka odstranjevanja '%1': %2; Could not remove directory '%1'; - + Ni mogoče odstraniti mape '%1'; @@ -1425,18 +1438,18 @@ Uporaba ni priporočljiva. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely Krajevna datoteka je bila med usklajevanjem spremenjena. Usklajena bo, ko bo shranjena. - + Sync was aborted by user. Usklajevanje je bilo prekinjeno s strani uporabnika - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Datoteka je bila krajevno spremenjena, vendar pa je označena za souporabo le za branje. Izvorna datoteka je obnovljena, vaše spremembe pa so zabeležene v datoteki spora. @@ -1444,23 +1457,23 @@ Uporaba ni priporočljiva. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Datoteka je bila krajevno spremenjena, vendar pa je označena za souporabo le za branje. Izvorna datoteka je obnovljena, vaše spremembe pa so zabeležene v datoteki spora. - + The local file was removed during sync. Krajevna datoteka je bila me usklajevanjem odstranjena. - + Local file changed during sync. Krajevna datoteka je bila med usklajevanjem spremenjena. - + The server did not acknowledge the last chunk. (No e-tag were present) Strežnik ni prepoznal zadnjega niza besed. (ni določenih e-oznak) @@ -1538,19 +1551,34 @@ Uporaba ni priporočljiva. Stanje usklajevanja je kopirano v odložišče. - - Currently no files are ignored because of previous errors. - Trenutno zaradi predhodnih napak ni prezrta nobena datoteka. + + Currently no files are ignored because of previous errors and no downloads are in progress. + Trenutno zaradi predhodnih napak ni prezrta nobena datoteka in ni dejavnih prejemov. - + %n files are ignored because of previous errors. - Try to sync these again. - %n datoteka je prezrta zaradi predhodnih napak. -Datoteko poskusite uskladiti znova.%n datoteki sta prezrti zaradi predhodnih napak. -Datoteki poskusite uskladiti znova.%n datoteke so prezrte zaradi predhodnih napak. -Datoteke poskusite uskladiti znova.%n datotek je prezrtih zaradi predhodnih napak. -Datoteke poskusite uskladiti znova. + + Zaradi predhodnih napak je prezrta %n datoteka. +Zaradi predhodnih napak sta prezrti %n datoteki. +Zaradi predhodnih napak so prezrte %n datoteke. +Zaradi predhodnih napak je prezrtih %n datotek. + + + + + %n files are partially downloaded. + + Prenos %n datoteke še ni končan. +Prenos %n datotek še ni končan. +Prenos %n datotek še ni končan. +Prenos %n datotek še ni končan. + + + + + Try to sync these again. + Poskusi s ponovnim usklajevanje. @@ -1638,12 +1666,12 @@ Datoteke poskusite uskladiti znova. Mirall::ShibbolethCredentials - + Login Error Napaka prijave - + You must sign in as user %1 Prijaviti se je treba kot uporabnik %1 @@ -2051,69 +2079,69 @@ Datoteke poskusite uskladiti znova. Ime datoteke vsebuje neveljavne znake, ki niso podprti na vseh okoljih. - + Unable to initialize a sync journal. Dnevnika usklajevanja ni mogoče začeti. - + Cannot open the sync journal Ni mogoče odpreti dnevnika usklajevanja - - + + Ignored because of the "choose what to sync" blacklist Prezrto, ker ni neizbrano za usklajevanje - + Not allowed because you don't have permission to add sub-directories in that directory Ni ustreznih dovoljenj za dodajanje podmap v izbrano mapo. - + Not allowed because you don't have permission to add parent directory Ni ustreznih dovoljenj za dodajanje nadrejene mape. - + Not allowed because you don't have permission to add files in that directory Ni ustreznih dovoljenj za dodajanje datotek v izbrano 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 diff --git a/translations/mirall_sv.ts b/translations/mirall_sv.ts index 3eeb0d7c1..81f9b3775 100644 --- a/translations/mirall_sv.ts +++ b/translations/mirall_sv.ts @@ -386,12 +386,12 @@ Total tid kvar %5 Synk aktivitet - + Could not read system exclude file - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -400,17 +400,17 @@ Detta kan bero på att konfigurationen för mappen ändrats, eller att alla file Är du säker på att du vill fortsätta? - + Remove All Files? Ta bort alla filer? - + Remove all files Ta bort alla filer - + Keep files Behåll filer @@ -637,22 +637,22 @@ Detta kan bero på att konfigurationen för mappen ändrats, eller att alla file Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway Ingen e-tag mottogs från servern, kontrollera proxy/gateway - + We received a different E-Tag for resuming. Retrying next time. Vi mottog en helt annan e-tag för att återuppta. Försök igen nästa gång. - + Server returned wrong content-range - + Connection Timeout Anslutningen avbröts på grund av timeout @@ -1113,8 +1113,12 @@ Det är inte lämpligt använda den. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - Kunde inte ansluta säkert. Vill du ansluta okrypterat istället (rekommenderas ej)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + @@ -1306,27 +1310,27 @@ Det är inte lämpligt använda den. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. Synkningen avbröts av användare. - + No E-Tag received from server, check Proxy/Gateway Ingen E-Tag mottogs från servern, kontrollera proxy/gateway - + We received a different E-Tag for resuming. Retrying next time. Vi mottog en helt annan E-Tag för att återuppta. Försöker igen nästa gång. - + Server returned wrong content-range - + File %1 can not be downloaded because of a local file name clash! Fil %1 kan inte laddas ner på grund av namnkonflikt med en lokal fil! @@ -1334,12 +1338,17 @@ Det är inte lämpligt använda den. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! Fil %1 kan inte laddas ner på grund av namnkonflikt med en lokal fil! - + + The file could not be downloaded completely. + + + + File %1 cannot be saved because of a local file name clash! @@ -1425,18 +1434,18 @@ Det är inte lämpligt använda den. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely Lokal fil ändrades under synk, synkar när den har anlänt komplett - + Sync was aborted by user. Synkningen avbröts av användare. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Filen ändrades lokalt men är en del av en endast-läsbar delning. Den återställs och din editering är i konflikt filen. @@ -1444,23 +1453,23 @@ Det är inte lämpligt använda den. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Filen ändrades lokalt men är en del av en endast-läsbar delning. Den återställdes och din editering är i konflikt filen. - + The local file was removed during sync. Den lokala filen togs bort under synkronisering. - + Local file changed during sync. Lokal fil ändrades under synk. - + The server did not acknowledge the last chunk. (No e-tag were present) Servern bekräftade inte det sista fil-fragmentet (Ingen e-tag fanns tillgänglig) @@ -1538,16 +1547,27 @@ Det är inte lämpligt använda den. Synkroniseringsstatus har kopierats till urklipp. - - Currently no files are ignored because of previous errors. - För närvarande ignoreras inga filer på grund av föregående fel. + + Currently no files are ignored because of previous errors and no downloads are in progress. + - + %n files are ignored because of previous errors. - Try to sync these again. + + + + %n files are partially downloaded. + + + + + + Try to sync these again. + + Mirall::SelectiveSyncDialog @@ -1634,12 +1654,12 @@ Det är inte lämpligt använda den. Mirall::ShibbolethCredentials - + Login Error Login fel - + You must sign in as user %1 Du måste logga in som en användare %1 @@ -2047,69 +2067,69 @@ Det är inte lämpligt använda den. Filen innehåller ogiltiga tecken som inte kan synkas oberoende av plattform. - + Unable to initialize a sync journal. Kan inte initialisera en synk journal. - + Cannot open the sync journal Kunde inte öppna synk journalen - - + + 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 sub-directories in that directory Går ej att genomföra då du saknar rättigheter att lägga till underkataloger i den katalogen - + Not allowed because you don't have permission to add parent directory Går ej att genomföra då du saknar rättigheter att lägga till någon moderkatalog - + Not allowed because you don't have permission to add files in that directory Går ej att genomföra då du saknar rättigheter att lägga till filer i den katalogen - + 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 diff --git a/translations/mirall_th.ts b/translations/mirall_th.ts index 3d85fc164..e171e4363 100644 --- a/translations/mirall_th.ts +++ b/translations/mirall_th.ts @@ -385,29 +385,29 @@ Total time left %5 - + Could not read system exclude file - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? - + Remove All Files? - + Remove all files - + Keep files @@ -634,22 +634,22 @@ Are you sure you want to perform this operation? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway - + We received a different E-Tag for resuming. Retrying next time. - + Server returned wrong content-range - + Connection Timeout @@ -1106,7 +1106,11 @@ It is not advisable to use it. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? @@ -1299,27 +1303,27 @@ It is not advisable to use it. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. - + No E-Tag received from server, check Proxy/Gateway - + We received a different E-Tag for resuming. Retrying next time. - + Server returned wrong content-range - + File %1 can not be downloaded because of a local file name clash! @@ -1327,12 +1331,17 @@ It is not advisable to use it. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! - + + The file could not be downloaded completely. + + + + File %1 cannot be saved because of a local file name clash! @@ -1418,18 +1427,18 @@ It is not advisable to use it. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely - + Sync was aborted by user. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. @@ -1437,23 +1446,23 @@ It is not advisable to use it. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. - + The local file was removed during sync. - + Local file changed during sync. - + The server did not acknowledge the last chunk. (No e-tag were present) @@ -1531,16 +1540,27 @@ It is not advisable to use it. - - Currently no files are ignored because of previous errors. + + Currently no files are ignored because of previous errors and no downloads are in progress. - + %n files are ignored because of previous errors. - Try to sync these again. + + + + %n files are partially downloaded. + + + + + + Try to sync these again. + + Mirall::SelectiveSyncDialog @@ -1627,12 +1647,12 @@ It is not advisable to use it. Mirall::ShibbolethCredentials - + Login Error - + You must sign in as user %1 @@ -2038,69 +2058,69 @@ It is not advisable to use it. - + Unable to initialize a sync journal. - + Cannot open the sync journal - - + + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add sub-directories in that directory - + Not allowed because you don't have permission to add parent directory - + Not allowed because you don't have permission to add files in that directory - + 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 diff --git a/translations/mirall_tr.ts b/translations/mirall_tr.ts index 0e9c78fbf..77a5e1b20 100644 --- a/translations/mirall_tr.ts +++ b/translations/mirall_tr.ts @@ -386,12 +386,12 @@ Toplam kalan süre: %5 Eşitleme Etkinliği - + Could not read system exclude file Sistem hariç tutulma dosyası okunamadı - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -400,17 +400,17 @@ Bu, klasörün sessizce yeniden yapılandırılması veya tüm dosyaların el il Bu işlemi gerçekleştirmek istediğinize emin misiniz? - + Remove All Files? Tüm Dosyalar Kaldırılsın mı? - + Remove all files Tüm dosyaları kaldır - + Keep files Dosyaları koru @@ -435,7 +435,7 @@ Bu işlemi gerçekleştirmek istediğinize emin misiniz? Waits to start syncing. - Eşitleme başlatmak için bekleniyor. + Eşitleme başlatmak için bekliyor. @@ -637,22 +637,22 @@ Bu işlemi gerçekleştirmek istediğinize emin misiniz? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway Sunucudan E-Etiket alınamadı, Vekil sunucu/Ağ geçidini denetleyin. - + We received a different E-Tag for resuming. Retrying next time. Devam etmek üzere farklı bir E-Etiket aldık. Sonraki işlemde yeniden denenecek. - + Server returned wrong content-range Sunucu yanlış içerik aralığı döndürdü - + Connection Timeout Bağlantı Zaman Aşımı @@ -1113,8 +1113,16 @@ Kullanmanız önerilmez. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - Güvenli olarak bağlanılamadı. Bunun yerine şifrelenmemiş bağlantı yapmak ister misiniz (önerilmez)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + Güvenli olarak bağlanılamadı: + +%1 + +Bunun yerine şifrelenmemiş bağlantı yapmak ister misiniz (önerilmez)? @@ -1306,27 +1314,27 @@ Kullanmanız önerilmez. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. Eşitleme kullanıcı tarafından iptal edildi. - + No E-Tag received from server, check Proxy/Gateway Sunucudan E-Etiket alınamadı, Vekil sunucu/Ağ geçidini denetleyin. - + We received a different E-Tag for resuming. Retrying next time. Devam etmek üzere farklı bir E-Etiket aldık. Sonraki işlemde yeniden denenecek. - + Server returned wrong content-range Sunucu yanlış içerik aralığı döndürdü - + File %1 can not be downloaded because of a local file name clash! %1 dosyası, yerel dosya adı çakışması nedeniyle indirilemiyor! @@ -1334,14 +1342,19 @@ Kullanmanız önerilmez. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! %1 dosyası, yerel dosya adı çakışması nedeniyle indirilemiyor! - + + The file could not be downloaded completely. + Dosya tamamıyla indirilemedi. + + + File %1 cannot be saved because of a local file name clash! - Yerel bir dosya ismi ile çakıştığından, %1 dosyası kaydedilemedi. + Yerel bir dosya ismi ile çakıştığından, %1 dosyası kaydedilemedi! @@ -1425,18 +1438,18 @@ Kullanmanız önerilmez. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely Eşitleme sırasında yerel dosya değişti, tamamen ulaştıktan sonra bir kez eşitlenecek - + Sync was aborted by user. Eşitleme kullanıcı tarafından iptal edildi. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Dosya yerel olarak düzenlendi ancak salt okunur paylaşımın bir parçası. Geri yüklendi ve düzenlemeniz çakışan dosyada. @@ -1444,23 +1457,23 @@ Kullanmanız önerilmez. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Dosya yerel olarak düzenlendi ancak salt okunur paylaşımın bir parçası. Geri yüklendi ve düzenlemeniz çakışan dosyada. - + The local file was removed during sync. Eşitleme sırasında yerel dosya kaldırıldı. - + Local file changed during sync. Eşitleme sırasında yerel dosya değişti. - + The server did not acknowledge the last chunk. (No e-tag were present) Sunucu son yığını onaylamadı. (Mevcut e-etiket bulunamadı) @@ -1538,17 +1551,30 @@ Kullanmanız önerilmez. Eşitleme durumu panoya kopyalandı. - - Currently no files are ignored because of previous errors. - Önceki hata koşullarından dolayı yoksayılmış dosya yok. + + Currently no files are ignored because of previous errors and no downloads are in progress. + Önceki hatalar nedeniyle hiçbir dosya yolsayılmadı ve süren bir indirme yok. - + %n files are ignored because of previous errors. - Try to sync these again. - %n dosya önceki hatalar nedeniyle yoksayıldı. -Tekrar eşitleyi deneyin.em.%n dosya önceki hatalar nedeniyle yoksayıldı. -Tekrar eşitleyi deneyin.em. + + önceki hatalardan dolayı %n dosya yoksayıldı. +önceki hatalardan dolayı %n dosya yoksayıldı. + + + + + %n files are partially downloaded. + + %n dosya kısmen karşıya indirilebildi. +%n dosya kısmen karşıya indirilebildi. + + + + + Try to sync these again. + Bunları tekrar eşitlemeyi deneyin. @@ -1636,12 +1662,12 @@ Tekrar eşitleyi deneyin.em. Mirall::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 @@ -2016,7 +2042,7 @@ Tekrar eşitleyi deneyin.em. The mounted directory is temporary not available on the server - Bağlanan dizin geçici olup sunucuda mevcut değildir + Bağlanan dizin geçici olarak sunucuda kullanılamıyor @@ -2049,69 +2075,69 @@ Tekrar eşitleyi deneyin.em. Dosya, çapraz platform arasında eşitlenemeyecek karakterler içeriyor. - + Unable to initialize a sync journal. Bir eşitleme günlüğü başlatılamadı. - + Cannot open the sync journal Eşitleme günlüğü açılamıyor - - + + 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 sub-directories in that directory Bu dizine alt dizin ekleme yetkiniz olmadığından izin verilmedi - + Not allowed because you don't have permission to add parent directory Üst dizin ekleme yetkiniz olmadığından izin verilmedi - + Not allowed because you don't have permission to add files in that directory Bu dizine dosya 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 @@ -2129,7 +2155,7 @@ Tekrar eşitleyi deneyin.em. <p>Version %1 For more information please visit <a href='%2'>%3</a>.</p><p>Copyright ownCloud, Inc.</p><p>Distributed by %4 and licensed under the GNU General Public License (GPL) Version 2.0.<br/>%5 and the %5 logo are registered trademarks of %4 in the United States, other countries, or both.</p> - <p>Sürüm %1 Daha fazla bilgi için lütfen <a href='%2'>%3</a> adresini ziyaret edin.</p><p>Telif hakkı ownCloud, Inc.</p><p>Dağıtım %4 ve GNU Genel Kamu Lisansı (GPL) Sürüm 2.0 ile lisanslanmıştır olup <br/>%5 ve %5 logoları ABD ve/veya diğer ülkelerde %4 tescili markalarıdır.</p> + <p>Sürüm %1 Daha fazla bilgi için lütfen <a href='%2'>%3</a> adresini ziyaret edin.</p><p>Telif hakkı ownCloud, Inc.</p><p>%4 tarafından dağıtılmakta ve GNU Genel Kamu Lisansı (GPL) Sürüm 2.0 ile lisanslanmıştır olup <br/>%5 ve %5 logoları ABD ve/veya diğer ülkelerde %4 tescili markalarıdır.</p> @@ -2275,7 +2301,7 @@ Tekrar eşitleyi deneyin.em. <p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.<br/>Based on Mirall by Duncan Mac-Vicar P.</small></p><p>Copyright ownCloud, Inc.</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p> - <p>Sürüm %2. Daha fazla bilgi için lütfen <a href="%3">%4</a> adresini ziyaret edin.</p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz ve diğerleri.<br>Duncan Mac-Vicar P. tarafından yazılmış Mirall tabanlıdır.</small></p><p>Telif hakkı ownCloud, Inc.</p><p>GNU Genel Kamu Lisansı (GPL) Sürüm 2.0 ile lisanslanmıştır.<br>ownCloud ve ownCloud logoları <br>ABD ve/veya diğer ülkelerde ownCloud, Inc.'nin tescili markalarıdır.</p> + <p>Sürüm %2. Daha fazla bilgi için lütfen <a href="%3">%4</a> adresini ziyaret edin.</p><p><small>Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz ve diğerleri.<br/>Duncan Mac-Vicar P. tarafından yazılmış Mirall tabanlıdır.</small></p><p>Telif hakkı ownCloud, Inc.</p><p>GNU Genel Kamu Lisansı (GPL) Sürüm 2.0 ile lisanslanmıştır.<br/>ownCloud ve ownCloud logoları ABD ve/veya diğer ülkelerde ownCloud, Inc.'nin tescili markalarıdır.</p> diff --git a/translations/mirall_uk.ts b/translations/mirall_uk.ts index 61c5009a5..71e3ae99b 100644 --- a/translations/mirall_uk.ts +++ b/translations/mirall_uk.ts @@ -386,12 +386,12 @@ Total time left %5 Журнал синхронізації - + Could not read system exclude file Неможливо прочитати виключений системний файл - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -400,17 +400,17 @@ Are you sure you want to perform this operation? Ви дійсно бажаєте продовжити цю операцію? - + Remove All Files? Видалити усі файли? - + Remove all files Видалити усі файли - + Keep files Зберегти файли @@ -637,22 +637,22 @@ Are you sure you want to perform this operation? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway Не отримано E-Tag від серверу, перевірте мережеві налаштування (проксі, шлюз) - + We received a different E-Tag for resuming. Retrying next time. Ми отримали інший E-Tag для відновлення. Спробуйте ще раз пізніше. - + Server returned wrong content-range Сервер повернув невірний content-range - + Connection Timeout Тайм-аут З'єднання @@ -1113,8 +1113,16 @@ It is not advisable to use it. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? - Не вдалося безпечно підключитися. Бажаєте підключитися без шифрування (не рекомендується)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? + Не вдалося безпечно підключитися. + +%1 + +Бажаєте підключитися без шифрування (не рекомендується)? @@ -1306,27 +1314,27 @@ It is not advisable to use it. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. Синхронізація перервана користувачем. - + No E-Tag received from server, check Proxy/Gateway Не отримано E-Tag від серверу, перевірте мережеві налаштування (проксі, шлюз) - + We received a different E-Tag for resuming. Retrying next time. Ми отримали інший E-Tag для відновлення. Спробуйте ще раз пізніше. - + Server returned wrong content-range Сервер повернув невірний content-range - + File %1 can not be downloaded because of a local file name clash! Файл %1 не завантажено, через локальний конфлікт ім'я! @@ -1334,14 +1342,19 @@ It is not advisable to use it. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! Файл %1 не завантажено, через локальний конфлікт ім'я! - + + The file could not be downloaded completely. + Файл не може бути завантажений повністю. + + + File %1 cannot be saved because of a local file name clash! - + Файл %1 не збережено, через локальний конфлікт ім'я! @@ -1375,12 +1388,12 @@ It is not advisable to use it. Error removing '%1': %2; - + Помилка при видалені '%1': %2; Could not remove directory '%1'; - + Неможливо видалити теку '%1'; @@ -1425,18 +1438,18 @@ It is not advisable to use it. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely Локальний файл змінився під час синхронізації, повторюємо процес - + Sync was aborted by user. Синхронізація перервана користувачем. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Файл було змінено локально, але він розташований в теці з правами лише на перегляд. Файл відновлено, а ваші зміни розташовані в теці конфліктів. @@ -1444,23 +1457,23 @@ It is not advisable to use it. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. Файл було змінено локально, але він розташований в теці з правами лише на перегляд. Файл відновлено, а ваші зміни розташовані в теці конфліктів. - + The local file was removed during sync. Локальний файл було видалено під час синхронізації. - + Local file changed during sync. Локальний файл змінився під час синхронізації. - + The server did not acknowledge the last chunk. (No e-tag were present) Сервер не зміг підтвердити останній відрізок даних. (Були відсутні e-tag) @@ -1538,15 +1551,32 @@ It is not advisable to use it. Протокол синхронізації був скопійований в буфер обміну. - - Currently no files are ignored because of previous errors. - На даний час, проігноровані файли відсутні через помилки. + + Currently no files are ignored because of previous errors and no downloads are in progress. + На даний час жоден файл не ігнорується, через попередні помилки, та немає активних завантажень. - + %n files are ignored because of previous errors. - Try to sync these again. - + + %n файл проігноровано, через попередні помилки. +%n файлів проігноровано, через попередні помилки. +%n файлів проігноровано, через попередні помилки. + + + + + %n files are partially downloaded. + + %n файл частково завантажений. +%n файли частково завантажені. +%n файли частково завантажені. + + + + + Try to sync these again. + Спробуйте синхронізувати ще раз. @@ -1559,7 +1589,7 @@ It is not advisable to use it. Unchecked folders will be <b>removed</b> from your local file system and will not be synchronized to this computer anymore - + Не позначені теки будуть <b>видалені</b> з вашої системи та більше не будуть синхронізуватися @@ -1634,12 +1664,12 @@ It is not advisable to use it. Mirall::ShibbolethCredentials - + Login Error Помилка входу - + You must sign in as user %1 Ви маєте увійти як %1 @@ -2014,7 +2044,7 @@ It is not advisable to use it. The mounted directory is temporary not available on the server - + Змонтована тека тимчасово недоступна на сервері @@ -2047,69 +2077,69 @@ It is not advisable to use it. Файл містить недопустимі символи, через це синхронізація між платформами неможлива. - + Unable to initialize a sync journal. Не вдалося ініціалізувати протокол синхронізації. - + Cannot open the sync journal Не вдається відкрити протокол синхронізації - - + + Ignored because of the "choose what to sync" blacklist Ігнорується через чорний список в "обрати що синхронізувати" - + Not allowed because you don't have permission to add sub-directories in that directory Не дозволено через відсутність прав на додавання підкаталогів в цій теці. - + Not allowed because you don't have permission to add parent directory Не дозволено через відсутність прав на додавання батьківської теки. - + Not allowed because you don't have permission to add files in that directory Не дозволено через відсутність прав на додавання файлів в цю теку. - + 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 джерело diff --git a/translations/mirall_zh_CN.ts b/translations/mirall_zh_CN.ts index 39b739602..bd3f8c8c7 100644 --- a/translations/mirall_zh_CN.ts +++ b/translations/mirall_zh_CN.ts @@ -385,12 +385,12 @@ Total time left %5 同步活动 - + Could not read system exclude file - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? @@ -399,17 +399,17 @@ Are you sure you want to perform this operation? 你确定执行该操作吗? - + Remove All Files? 删除所有文件? - + Remove all files 删除所有文件 - + Keep files 保持所有文件 @@ -636,22 +636,22 @@ Are you sure you want to perform this operation? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway 未能收到来自服务器的 E-Tag,请检查代理/网关 - + We received a different E-Tag for resuming. Retrying next time. 我们收到了不同的恢复 E-Tag,将在下次尝试。 - + Server returned wrong content-range - + Connection Timeout 连接超时 @@ -1110,7 +1110,11 @@ It is not advisable to use it. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? @@ -1303,27 +1307,27 @@ It is not advisable to use it. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. 同步被用户撤销。 - + No E-Tag received from server, check Proxy/Gateway 未能收到来自服务器的 E-Tag,请检查代理/网关 - + We received a different E-Tag for resuming. Retrying next time. 我们收到了不同的恢复 E-Tag,将在下次尝试。 - + Server returned wrong content-range - + File %1 can not be downloaded because of a local file name clash! @@ -1331,12 +1335,17 @@ It is not advisable to use it. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! - + + The file could not be downloaded completely. + + + + File %1 cannot be saved because of a local file name clash! @@ -1422,18 +1431,18 @@ It is not advisable to use it. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely - + Sync was aborted by user. 同步被用户撤销。 - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. @@ -1441,23 +1450,23 @@ It is not advisable to use it. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. - + The local file was removed during sync. - + Local file changed during sync. 本地文件在同步时已修改。 - + The server did not acknowledge the last chunk. (No e-tag were present) @@ -1535,16 +1544,27 @@ It is not advisable to use it. - - Currently no files are ignored because of previous errors. + + Currently no files are ignored because of previous errors and no downloads are in progress. - + %n files are ignored because of previous errors. - Try to sync these again. + + + + %n files are partially downloaded. + + + + + + Try to sync these again. + + Mirall::SelectiveSyncDialog @@ -1631,12 +1651,12 @@ It is not advisable to use it. Mirall::ShibbolethCredentials - + Login Error 登录错误 - + You must sign in as user %1 @@ -2044,69 +2064,69 @@ It is not advisable to use it. - + Unable to initialize a sync journal. 无法初始化同步日志 - + Cannot open the sync journal 无法打开同步日志 - - + + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add sub-directories in that directory - + Not allowed because you don't have permission to add parent directory - + Not allowed because you don't have permission to add files in that directory - + 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 diff --git a/translations/mirall_zh_TW.ts b/translations/mirall_zh_TW.ts index 8cbffb9f5..0d1a0e49b 100644 --- a/translations/mirall_zh_TW.ts +++ b/translations/mirall_zh_TW.ts @@ -385,29 +385,29 @@ Total time left %5 同步啟用 - + Could not read system exclude file - + This sync would remove all the files in the sync folder '%1'. This might be because the folder was silently reconfigured, or that all the file were manually removed. Are you sure you want to perform this operation? - + Remove All Files? 移除所有檔案? - + Remove all files 移除所有檔案 - + Keep files 保留檔案 @@ -634,22 +634,22 @@ Are you sure you want to perform this operation? Mirall::GETFileJob - + No E-Tag received from server, check Proxy/Gateway - + We received a different E-Tag for resuming. Retrying next time. - + Server returned wrong content-range - + Connection Timeout @@ -1106,7 +1106,11 @@ It is not advisable to use it. - Could not connect securely. Do you want to connect unencrypted instead (not recommended)? + Could not connect securely: + +%1 + +Do you want to connect unencrypted instead (not recommended)? @@ -1299,27 +1303,27 @@ It is not advisable to use it. Mirall::PropagateDownloadFileLegacy - + Sync was aborted by user. - + No E-Tag received from server, check Proxy/Gateway - + We received a different E-Tag for resuming. Retrying next time. - + Server returned wrong content-range - + File %1 can not be downloaded because of a local file name clash! @@ -1327,12 +1331,17 @@ It is not advisable to use it. Mirall::PropagateDownloadFileQNAM - + File %1 can not be downloaded because of a local file name clash! - + + The file could not be downloaded completely. + + + + File %1 cannot be saved because of a local file name clash! @@ -1418,18 +1427,18 @@ It is not advisable to use it. Mirall::PropagateUploadFileLegacy - - + + Local file changed during sync, syncing once it arrived completely - + Sync was aborted by user. - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. @@ -1437,23 +1446,23 @@ It is not advisable to use it. Mirall::PropagateUploadFileQNAM - + The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file. - + The local file was removed during sync. - + Local file changed during sync. - + The server did not acknowledge the last chunk. (No e-tag were present) @@ -1531,16 +1540,27 @@ It is not advisable to use it. - - Currently no files are ignored because of previous errors. + + Currently no files are ignored because of previous errors and no downloads are in progress. - + %n files are ignored because of previous errors. - Try to sync these again. + + + + %n files are partially downloaded. + + + + + + Try to sync these again. + + Mirall::SelectiveSyncDialog @@ -1627,12 +1647,12 @@ It is not advisable to use it. Mirall::ShibbolethCredentials - + Login Error - + You must sign in as user %1 @@ -2038,69 +2058,69 @@ It is not advisable to use it. - + Unable to initialize a sync journal. - + Cannot open the sync journal - - + + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add sub-directories in that directory - + Not allowed because you don't have permission to add parent directory - + Not allowed because you don't have permission to add files in that directory - + 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