Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/owncloud/client.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Goffart <ogoffart@woboq.com>2018-09-14 16:25:59 +0300
committerOlivier Goffart <ogoffart@woboq.com>2018-09-14 16:25:59 +0300
commit0290564d5c654d654856f04f1b04bad984f36aee (patch)
tree3b9a5eda39861d9467bc130a00e7effbc4ef7b6c
parent638f5c8752164ccc0429b1df60b79c3d3293bcd4 (diff)
parent3a335879fa1f00f094d82855126fec3f6ab59405 (diff)
Merge remote-tracking branch 'owncloud/master' into delta-sync
Conflicts: .gitmodules src/cmd/cmd.cpp src/gui/generalsettings.ui src/libsync/propagatedownload.cpp src/libsync/propagateuploadng.cpp
-rw-r--r--.drone.yml92
-rw-r--r--.github/release_template.md74
-rw-r--r--.gitmodules3
-rw-r--r--.travis.yml37
-rw-r--r--CMakeLists.txt39
-rw-r--r--ChangeLog156
-rw-r--r--Jenkinsfile72
-rw-r--r--OWNCLOUD.cmake3
-rw-r--r--README.md33
-rw-r--r--THEME.cmake38
-rw-r--r--VERSION.cmake4
-rw-r--r--admin/osx/CMakeLists.txt5
-rwxr-xr-xadmin/osx/create_mac.sh.cmake (renamed from admin/osx/create_mac_pkg.sh.cmake)2
-rwxr-xr-xadmin/osx/macdeployqt.py13
-rw-r--r--admin/osx/macosx.pkgproj.cmake (renamed from admin/osx/macosx.pkgproj)6
-rw-r--r--admin/osx/post_install.sh.cmake6
-rwxr-xr-xadmin/osx/sign_dmg.sh40
-rw-r--r--admin/win/nsi/lib/fileassoc.nsh120
-rw-r--r--admin/win/nsi/page_header.bmpbin34254 -> 25820 bytes
-rw-r--r--appveyor.ini9
-rw-r--r--appveyor.yml10
m---------binary0
-rw-r--r--client.qrc2
-rw-r--r--cmake/modules/ECMAddAppIcon.cmake157
-rw-r--r--cmake/modules/FindIcoTool.cmake27
-rw-r--r--cmake/modules/FindSQLite3.cmake2
-rw-r--r--cmake/modules/MacOSXBundleInfo.plist.in43
-rw-r--r--cmake/modules/NSIS.template.in15
-rw-r--r--cmake/modules/Warnings.cmake5
-rw-r--r--config.h.in4
-rw-r--r--doc/.gitignore2
-rw-r--r--doc/CMakeLists.txt4
-rw-r--r--doc/Makefile174
-rw-r--r--doc/architecture.rst16
-rw-r--r--doc/building.rst92
-rw-r--r--doc/conf.py292
-rw-r--r--doc/conf.py.in11
-rw-r--r--doc/conffile.rst4
-rw-r--r--doc/conflicts.rst61
m---------doc/docs-themes0
-rw-r--r--doc/faq.rst19
-rw-r--r--doc/images/client-4.pngbin64091 -> 0 bytes
-rw-r--r--doc/images/log_output_window.pngbin43946 -> 34320 bytes
-rw-r--r--doc/images/save_log_file.pngbin68034 -> 0 bytes
-rw-r--r--doc/index.rst3
-rw-r--r--doc/installing.rst210
-rw-r--r--doc/introduction.rst8
-rw-r--r--doc/navigating.rst2
-rw-r--r--doc/options.rst6
-rw-r--r--doc/troubleshooting.rst50
-rw-r--r--man/CMakeLists.txt2
-rw-r--r--mirall.desktop.in81
-rw-r--r--resources/more.pngbin122 -> 0 bytes
-rw-r--r--resources/more.svg5
-rw-r--r--shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/FinderSync.h1
-rw-r--r--shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/FinderSync.m103
-rw-r--r--shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/SyncClientProxy.h2
-rw-r--r--shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/SyncClientProxy.m38
-rw-r--r--shell_integration/dolphin/ownclouddolphinpluginhelper.cpp13
-rwxr-xr-xshell_integration/nautilus/setappname.sh4
-rw-r--r--shell_integration/nautilus/syncstate.py40
-rw-r--r--shell_integration/windows/OCContextMenu/OCContextMenu.cpp4
-rw-r--r--shell_integration/windows/OCContextMenu/OCContextMenu.rcbin4586 -> 4596 bytes
-rw-r--r--shell_integration/windows/OCOverlays/OCOverlay.rcbin5534 -> 5534 bytes
-rw-r--r--shell_integration/windows/OCUtil/CMakeLists.txt1
-rw-r--r--shell_integration/windows/OCUtil/OCUtil.rcbin0 -> 4478 bytes
-rw-r--r--shell_integration/windows/OCUtil/OCUtil.vcxproj5
-rw-r--r--shell_integration/windows/OCUtil/resource.h14
m---------src/3rdparty/libcrashreporter-qt0
-rw-r--r--src/3rdparty/sqlite3/sqlite3.c16976
-rw-r--r--src/3rdparty/sqlite3/sqlite3.h917
-rw-r--r--src/CMakeLists.txt5
-rw-r--r--src/cmd/CMakeLists.txt10
-rw-r--r--src/cmd/cmd.cpp49
-rw-r--r--src/common/checksums.cpp71
-rw-r--r--src/common/checksums.h9
-rw-r--r--src/common/filesystembase.cpp72
-rw-r--r--src/common/filesystembase.h14
-rw-r--r--src/common/ownsql.cpp64
-rw-r--r--src/common/ownsql.h52
-rw-r--r--src/common/remotepermissions.cpp35
-rw-r--r--src/common/remotepermissions.h15
-rw-r--r--src/common/syncjournaldb.cpp783
-rw-r--r--src/common/syncjournaldb.h117
-rw-r--r--src/common/syncjournalfilerecord.cpp15
-rw-r--r--src/common/syncjournalfilerecord.h40
-rw-r--r--src/common/utility.cpp99
-rw-r--r--src/common/utility.h17
-rw-r--r--src/crashreporter/CMakeLists.txt25
-rw-r--r--src/crashreporter/resources.qrc5
-rw-r--r--src/crashreporter/resources.qrc.in5
-rw-r--r--src/csync/CMakeLists.txt29
-rw-r--r--src/csync/config_csync.h.cmake1
-rw-r--r--src/csync/csync.cpp110
-rw-r--r--src/csync/csync.h45
-rw-r--r--src/csync/csync_exclude.cpp43
-rw-r--r--src/csync/csync_exclude.h30
-rw-r--r--src/csync/csync_macros.h11
-rw-r--r--src/csync/csync_misc.cpp26
-rw-r--r--src/csync/csync_private.h36
-rw-r--r--src/csync/csync_reconcile.cpp108
-rw-r--r--src/csync/csync_reconcile.h4
-rw-r--r--src/csync/csync_update.cpp228
-rw-r--r--src/csync/csync_util.cpp2
-rw-r--r--src/csync/vio/csync_vio.cpp8
-rw-r--r--src/csync/vio/csync_vio.h4
-rw-r--r--src/csync/vio/csync_vio_local_win.cpp3
-rw-r--r--src/gui/CMakeLists.txt25
-rw-r--r--src/gui/accountmanager.cpp50
-rw-r--r--src/gui/accountmanager.h8
-rw-r--r--src/gui/accountsettings.cpp34
-rw-r--r--src/gui/accountsettings.h2
-rw-r--r--src/gui/accountstate.cpp19
-rw-r--r--src/gui/accountstate.h1
-rw-r--r--src/gui/activitydata.h5
-rw-r--r--src/gui/activityitemdelegate.cpp2
-rw-r--r--src/gui/activitywidget.cpp7
-rw-r--r--src/gui/activitywidget.h2
-rw-r--r--src/gui/application.cpp160
-rw-r--r--src/gui/application.h12
-rw-r--r--src/gui/clientproxy.cpp (renamed from src/libsync/clientproxy.cpp)0
-rw-r--r--src/gui/clientproxy.h (renamed from src/libsync/clientproxy.h)4
-rw-r--r--src/gui/connectionvalidator.cpp (renamed from src/libsync/connectionvalidator.cpp)36
-rw-r--r--src/gui/connectionvalidator.h (renamed from src/libsync/connectionvalidator.h)7
-rw-r--r--src/gui/creds/oauth.cpp4
-rw-r--r--src/gui/folder.cpp206
-rw-r--r--src/gui/folder.h50
-rw-r--r--src/gui/folderman.cpp157
-rw-r--r--src/gui/folderman.h24
-rw-r--r--src/gui/folderstatusdelegate.cpp42
-rw-r--r--src/gui/folderstatusdelegate.h3
-rw-r--r--src/gui/folderstatusmodel.cpp69
-rw-r--r--src/gui/folderstatusmodel.h5
-rw-r--r--src/gui/folderwatcher.cpp11
-rw-r--r--src/gui/folderwatcher.h13
-rw-r--r--src/gui/folderwatcher_linux.cpp5
-rw-r--r--src/gui/folderwizard.cpp24
-rw-r--r--src/gui/folderwizard.h6
-rw-r--r--src/gui/generalsettings.cpp109
-rw-r--r--src/gui/generalsettings.h1
-rw-r--r--src/gui/generalsettings.ui127
-rw-r--r--src/gui/ignorelisteditor.cpp87
-rw-r--r--src/gui/ignorelisteditor.h5
-rw-r--r--src/gui/issueswidget.cpp99
-rw-r--r--src/gui/issueswidget.h5
-rw-r--r--src/gui/issueswidget.ui84
-rw-r--r--src/gui/logbrowser.cpp28
-rw-r--r--src/gui/logbrowser.h2
-rw-r--r--src/gui/navigationpanehelper.cpp13
-rw-r--r--src/gui/networksettings.cpp16
-rw-r--r--src/gui/networksettings.h5
-rw-r--r--src/gui/notificationwidget.cpp11
-rw-r--r--src/gui/ocsshareejob.cpp2
-rw-r--r--src/gui/ocssharejob.cpp1
-rw-r--r--src/gui/ocssharejob.h2
-rw-r--r--src/gui/owncloud.xml.in7
-rw-r--r--src/gui/owncloudgui.cpp260
-rw-r--r--src/gui/owncloudgui.h24
-rw-r--r--src/gui/owncloudsetupwizard.cpp25
-rw-r--r--src/gui/owncloudsetupwizard.h1
-rw-r--r--src/gui/protocolwidget.cpp76
-rw-r--r--src/gui/protocolwidget.h29
-rw-r--r--src/gui/selectivesyncdialog.cpp2
-rw-r--r--src/gui/servernotificationhandler.cpp2
-rw-r--r--src/gui/settingsdialog.cpp9
-rw-r--r--src/gui/settingsdialog.h1
-rw-r--r--src/gui/settingsdialogmac.cpp11
-rw-r--r--src/gui/settingsdialogmac.h1
-rw-r--r--src/gui/sharedialog.cpp9
-rw-r--r--src/gui/sharedialog.h3
-rw-r--r--src/gui/sharelinkwidget.cpp71
-rw-r--r--src/gui/sharelinkwidget.h5
-rw-r--r--src/gui/sharelinkwidget.ui25
-rw-r--r--src/gui/sharemanager.cpp17
-rw-r--r--src/gui/shareusergroupwidget.cpp2
-rw-r--r--src/gui/socketapi.cpp486
-rw-r--r--src/gui/socketapi.h43
-rw-r--r--src/gui/sslbutton.cpp10
-rw-r--r--src/gui/sslbutton.h2
-rw-r--r--src/gui/syncrunfilelog.cpp12
-rw-r--r--src/gui/updater/ocupdater.cpp35
-rw-r--r--src/gui/updater/ocupdater.h3
-rw-r--r--src/gui/updater/sparkleupdater.h7
-rw-r--r--src/gui/updater/sparkleupdater_mac.mm49
-rw-r--r--src/gui/updater/updateinfo.cpp38
-rw-r--r--src/gui/updater/updateinfo.h3
-rw-r--r--src/gui/updater/updater.cpp62
-rw-r--r--src/gui/updater/updater.h1
-rw-r--r--src/gui/wizard/owncloudadvancedsetuppage.cpp68
-rw-r--r--src/gui/wizard/owncloudadvancedsetuppage.h5
-rw-r--r--src/gui/wizard/owncloudadvancedsetuppage.ui221
-rw-r--r--src/gui/wizard/owncloudoauthcredspage.cpp13
-rw-r--r--src/gui/wizard/owncloudsetuppage.cpp9
-rw-r--r--src/gui/wizard/owncloudwizard.cpp36
-rw-r--r--src/gui/wizard/owncloudwizard.h10
-rw-r--r--src/libsync/CMakeLists.txt7
-rw-r--r--src/libsync/abstractnetworkjob.cpp15
-rw-r--r--src/libsync/abstractnetworkjob.h4
-rw-r--r--src/libsync/accessmanager.cpp5
-rw-r--r--src/libsync/account.cpp3
-rw-r--r--src/libsync/account.h2
-rw-r--r--src/libsync/configfile.cpp80
-rw-r--r--src/libsync/configfile.h21
-rw-r--r--src/libsync/creds/httpcredentials.cpp23
-rw-r--r--src/libsync/creds/httpcredentials.h1
-rw-r--r--src/libsync/discoveryphase.cpp49
-rw-r--r--src/libsync/discoveryphase.h2
-rw-r--r--src/libsync/localdiscoverytracker.cpp95
-rw-r--r--src/libsync/localdiscoverytracker.h103
-rw-r--r--src/libsync/logger.cpp110
-rw-r--r--src/libsync/logger.h21
-rw-r--r--src/libsync/networkjobs.cpp24
-rw-r--r--src/libsync/owncloudpropagator.cpp91
-rw-r--r--src/libsync/owncloudpropagator.h7
-rw-r--r--src/libsync/owncloudpropagator_p.h6
-rw-r--r--src/libsync/owncloudtheme.cpp66
-rw-r--r--src/libsync/owncloudtheme.h15
-rw-r--r--src/libsync/progressdispatcher.cpp3
-rw-r--r--src/libsync/progressdispatcher.h8
-rw-r--r--src/libsync/propagatedownload.cpp52
-rw-r--r--src/libsync/propagateremotedelete.cpp12
-rw-r--r--src/libsync/propagateremotemkdir.cpp3
-rw-r--r--src/libsync/propagateremotemove.cpp30
-rw-r--r--src/libsync/propagateupload.cpp93
-rw-r--r--src/libsync/propagateupload.h28
-rw-r--r--src/libsync/propagateuploadng.cpp51
-rw-r--r--src/libsync/propagateuploadv1.cpp57
-rw-r--r--src/libsync/propagatorjobs.cpp3
-rw-r--r--src/libsync/syncengine.cpp240
-rw-r--r--src/libsync/syncengine.h20
-rw-r--r--src/libsync/syncfileitem.h6
-rw-r--r--src/libsync/syncoptions.h4
-rw-r--r--src/libsync/syncresult.cpp6
-rw-r--r--src/libsync/syncresult.h1
-rw-r--r--src/libsync/theme.cpp70
-rw-r--r--src/libsync/theme.h39
-rw-r--r--test/CMakeLists.txt9
-rw-r--r--test/csync/CMakeLists.txt4
-rw-r--r--test/csync/csync_tests/check_csync_exclude.cpp34
-rw-r--r--test/csync/csync_tests/check_csync_update.cpp11
-rwxr-xr-xtest/scripts/txpl/t7.pl291
-rw-r--r--test/syncenginetestutils.h59
-rw-r--r--test/testallfilesdeleted.cpp102
-rw-r--r--test/testblacklist.cpp193
-rw-r--r--test/testchecksumvalidator.cpp68
-rw-r--r--test/testchunkingng.cpp197
-rw-r--r--test/testdownload.cpp125
-rw-r--r--test/testexcludedfiles.cpp1
-rw-r--r--test/testfilesystem.cpp76
-rw-r--r--test/testfolderman.cpp15
-rw-r--r--test/testfolderwatcher.cpp3
-rw-r--r--test/testlocaldiscovery.cpp155
-rw-r--r--test/testoauth.cpp3
-rw-r--r--test/testownsql.cpp15
-rw-r--r--test/testpermissions.cpp292
-rw-r--r--test/testremotediscovery.cpp128
-rw-r--r--test/testsyncconflict.cpp97
-rw-r--r--test/testsyncengine.cpp47
-rw-r--r--test/testsyncjournaldb.cpp134
-rw-r--r--test/testsyncmove.cpp85
-rw-r--r--test/testsyncvirtualfiles.cpp631
-rw-r--r--test/testuploadreset.cpp1
-rw-r--r--test/testutility.cpp36
-rw-r--r--translations/client_ca.ts1576
-rw-r--r--translations/client_cs.ts1612
-rw-r--r--translations/client_de.ts1618
-rw-r--r--translations/client_el.ts1554
-rw-r--r--translations/client_en.ts1532
-rw-r--r--translations/client_es.ts1622
-rw-r--r--translations/client_es_AR.ts1542
-rw-r--r--translations/client_et.ts1562
-rw-r--r--translations/client_eu.ts1546
-rw-r--r--translations/client_fa.ts1596
-rw-r--r--translations/client_fi.ts1626
-rw-r--r--translations/client_fr.ts1588
-rw-r--r--translations/client_gl.ts1544
-rw-r--r--translations/client_hu.ts1903
-rw-r--r--translations/client_it.ts1616
-rw-r--r--translations/client_ja.ts1586
-rw-r--r--translations/client_nb_NO.ts1665
-rw-r--r--translations/client_nl.ts1616
-rw-r--r--translations/client_pl.ts1648
-rw-r--r--translations/client_pt.ts1564
-rw-r--r--translations/client_pt_BR.ts1567
-rw-r--r--translations/client_ru.ts1570
-rw-r--r--translations/client_sk.ts1584
-rw-r--r--translations/client_sl.ts1572
-rw-r--r--translations/client_sr.ts1546
-rw-r--r--translations/client_sv.ts1558
-rw-r--r--translations/client_th.ts1609
-rw-r--r--translations/client_tr.ts1554
-rw-r--r--translations/client_uk.ts1594
-rw-r--r--translations/client_zh_CN.ts1630
-rw-r--r--translations/client_zh_TW.ts1556
-rw-r--r--version.h.in4
295 files changed, 48696 insertions, 30702 deletions
diff --git a/.drone.yml b/.drone.yml
new file mode 100644
index 000000000..4e95e9ddc
--- /dev/null
+++ b/.drone.yml
@@ -0,0 +1,92 @@
+#
+# We are building GCC with make and Clang with ninja, the combinations are more
+# or less arbitrarily chosen. We just want to check that both compilers and both
+# CMake generators work. It's unlikely that a specific generator only breaks
+# with a specific compiler.
+#
+
+workspace:
+ base: /drone
+ path: src/github.com/owncloud/client
+
+branches:
+ - master
+ - 2.5
+ - 2.4
+
+clone:
+ git:
+ image: plugins/git
+ pull: true
+ tags: false
+
+pipeline:
+ prepare-clang:
+ image: owncloudci/client:latest
+ pull: true
+ environment:
+ - LC_ALL=C.UTF-8
+ commands:
+ - mkdir clang-build
+ - cd clang-build
+ - cmake -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE="Debug" -DUNIT_TESTING=1 ..
+
+ building-clang:
+ image: owncloudci/client:latest
+ pull: true
+ environment:
+ - LC_ALL=C.UTF-8
+ commands:
+ - cd clang-build
+ - ninja -j4
+
+ testing-clang:
+ image: owncloudci/client:latest
+ pull: true
+ environment:
+ - LC_ALL=C.UTF-8
+ commands:
+ - cd clang-build
+ - useradd -m -s /bin/bash tester
+ - chown -R tester:tester .
+ - su-exec tester ctest --output-on-failure
+
+ prepare-gcc:
+ image: owncloudci/client:latest
+ pull: true
+ environment:
+ - LC_ALL=C.UTF-8
+ commands:
+ - mkdir gcc-build
+ - cd gcc-build
+ - cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_BUILD_TYPE="Debug" -DUNIT_TESTING=1 ..
+
+ building-gcc:
+ image: owncloudci/client:latest
+ pull: true
+ environment:
+ - LC_ALL=C.UTF-8
+ commands:
+ - cd gcc-build
+ - make -j4
+
+ testing-gcc:
+ image: owncloudci/client:latest
+ pull: true
+ environment:
+ - LC_ALL=C.UTF-8
+ commands:
+ - cd gcc-build
+ - useradd -m -s /bin/bash tester
+ - chown -R tester:tester .
+ - su-exec tester ctest --output-on-failure
+
+ notify-slack:
+ image: plugins/slack
+ pull: true
+ secrets: [ slack_webhook ]
+ channel: desktop
+ when:
+ local: false
+ status: [ changed, failure ]
+ event: [ push ]
diff --git a/.github/release_template.md b/.github/release_template.md
index e3bd20ac0..f803d574c 100644
--- a/.github/release_template.md
+++ b/.github/release_template.md
@@ -16,11 +16,12 @@ Some weeks before the release:
* [ ] Ensure Windows Overlay DLLs are rebuilt
* [ ] Check nightly builds are up and running, that is Jenkins jobs ownCloud-client-linux, ownCloud-client-osx and ownCloud-client-win32 all green.
* [ ] Ensure Linux nightlies are built too for all distros https://build.opensuse.org/package/show/isv:ownCloud:community:nightly/owncloud-client
+ * Check if patches still apply in the linux packages
* [ ] Build branded clients through the scripting machine and smoke test one or two branded clients (especially with predefined url)
* [ ] Upload a nightly build of the windows version to virustotal.com
* Contact AV vendors whom's engine reports a virus
* [ ] Documentation should be online before the release http://doc.owncloud.org/desktop/1.X/
-* [ ] QA goes over https://github.com/owncloud/mirall/wiki/Testing-Scenarios
+* [ ] QA goes over https://github.com/owncloud/client/wiki/Testing-Scenarios
* [ ] Make sure to have `client/ChangeLog` updated
* use `git log --format=oneline v<lastrelease>...master` if your memory fails you
* [ ] check if enterprise issues are fixed
@@ -28,6 +29,7 @@ Some weeks before the release:
For first Alpha/Beta of a Major or Minor release:
* [ ] branch off master to new version branch (e.g. master -> 2.1, when releasing 2.1)
* [ ] Adjust `VERSION.cmake` in master and count up (e.g. 2.2)
+* [ ] Add branch to branches.only section in appveyor.yml, so PRs to that branch will be built by AppVeyor
* [ ] Adjust translation jobs for [client](https://ci.owncloud.org/view/translation-sync/job/translation-sync-client/) and [NSIS](https://ci.owncloud.org/view/translation-sync/job/translation-sync-client-nsis/) to point to the release branch (e.g. 2.1).
* [ ] Make sure there is a job for the docs of the new master branch and the current release branch on rotor e.g. http://doc.owncloud.org/desktop/1.X/ exists
@@ -35,18 +37,21 @@ For all alphas, betas and RCs (Copy this section for each alpha/beta/rc):
* [ ] Add last updates to Changelog in the client source repository.
* [ ] Branch off a release branch called VERSION-rcX or VERSION-betaX (without v, v is for tags)
* [ ] Edit ```VERSION.cmake``` to set the suffix to beta1, beta2 etc. Commit the result to the release branch only
-* [ ] Create build for using owncloud-client-trigger (uncheck the "nightly build" checkbox, use the proper dropdown for version suffix) for theme 'ownCloud'
-* [ ] Create build for using owncloud-client-trigger (uncheck the "nightly build" checkbox, use the proper dropdown for version suffix) for theme 'testpilotcloud'
-* [ ] Only now download the last created source .tar.xz and sign it with gpg. Copy the signature into a new .asc file. (timing issue because currently 'testpilotcloud' re-creates the source .tar.xz)
-* (no need to copy builds as they are already in testing directory or repository) (https://github.com/owncloud/enterprise/wiki/Desktop-Signing-Knowledge)
+* [ ] Make sure to increase the version number of the branched of release, e.g. if you release 2.3.2 then you should change VERSION.cmake in 2.3 to 2.3.3 since that branch now will be 2.3.3
+* [ ] Create build for theme 'ownCloud' using client-trigger (uncheck the "nightly build" checkbox, use the proper dropdown for version suffix)
+* [ ] Create build for theme 'testpilotcloud' using client-trigger (uncheck the "nightly build" checkbox, use the proper dropdown for version suffix)
+* [ ] Only now download the owncloudclient-*.tar.xz and sign it with gpg. Copy the signature into a new .asc file. (20180719jw: no more timing issue since client-trigger uses client-source-branded)
+(see https://github.com/owncloud/enterprise/wiki/Desktop-Signing-Knowledge)
+* Build results are in https://download.owncloud.com/desktop/testing -- win and mac binaries are there, linux packages are listed in a *repo.html file.
* [ ] Mac: Perform smoke test (Install, make sure it does not explode, and check if all version indicators are correct)
* [ ] Win: Perform smoke test (Install, make sure it does not explode, and check if all version indicators are correct)
* [ ] Linux: Smoke test of one distro package (Install, make sure it does not explode, and check if all version indicators are correct)
+* [ ] Linux: Run client-linux-tests ob for @SamuAlfageme 's magic Linux-test-all-packages-script
* [ ] Create a signed tag using ```git tag -u E94E7B37 tagname``` (https://github.com/owncloud/enterprise/wiki/Desktop-Signing-Knowledge)
-* [ ] Create a pull request to the owncloud.org repository to update the install page (strings.php, page-desktop.php) and the changelog on owncloud.org. From now on download packages from the staging webserver.
-* [ ] Inform community mailinglists devel@owncloud.org and testpilots@owncloud.org
-* [ ] Inform packagers @dragotin (openSUSE) @hefee (Debian)
+* [ ] update the wordpress content at owncloud.org (20180719 jw: FIXME: clarify, no more staging??)
+* [ ] Inform packagers @dragotin (openSUSE), @hefee (Debian), ??? (Fedora)
* [ ] Announce on https://central.owncloud.org
+* [ ] Inform community mailinglists devel@owncloud.org and testpilots@owncloud.org (make sure to mention it is an rc). Link to the central post so discussion happens there.
* [ ] Check crash reporter
One week before the final release:
@@ -58,57 +63,60 @@ Day before final Release:
* [ ] Check the translations coming from transifex: All synchronized?
* [ ] Run the tx.pl scripts on the final code tag
* [ ] Run ```make test```
-* [ ] Run smashbox
+* [ ] Run smashbox (20180719 jw: FIXME: add details, how?)
* [ ] Inform product management and marketing that we are 1 day out
On Release Day (for final release):
* [ ] Add last updates to Changelog in the client source repository.
-* [ ] Branch off a release branch called VERSION-rcX or VERSION-betaX (without v, v is for tags)
-* [ ] Edit ```VERSION.cmake``` to set the suffix to beta1, beta2 etc. Commit the result to the release branch only
-* [ ] Make sure to increase the version number of the branched of release, e.g. if you release 2.3.2 then you should change VERSION.cmake in 2.3 to 2.3.3 since that branch now will be 2.3.3
-* [ ] Create build for using owncloud-client-trigger (uncheck the "nightly build" checkbox, use the proper dropdown for version suffix) for theme 'ownCloud'
-* [ ] Create build for using owncloud-client-trigger (uncheck the "nightly build" checkbox, use the proper dropdown for version suffix) for theme 'testpilotcloud'
-* [ ] Only now download the last created source .tar.xz and sign it with gpg. Copy the signature into a new .asc file. (timing issue because currently 'testpilotcloud' re-creates the source .tar.xz) (https://github.com/owncloud/enterprise/wiki/Desktop-Signing-Knowledge)
-* [ ] Branch isv:ownCloud:desktop to isv:ownCloud:desktop:client-X.Y.Z before overwriting https://github.com/owncloud/administration/blob/master/jenkins/obs_integration/obs-backup-prj.sh
- * Check if patches still apply in the linux packages
- * Update [OBS repository](https://build.opensuse.org/project/show?project=isv%3AownCloud%3Adesktop) `isv:ownCloud:desktop`
+* [ ] Branch off a release branch called VERSION (without v, v is for tags)
+* [ ] Edit ```VERSION.cmake``` to set the suffix to "" etc. Commit the result to the release branch only
+* [ ] Create build for theme 'ownCloud' using client-trigger (uncheck the "nightly build" checkbox, use the proper dropdown for version suffix)
+* [ ] Create build for theme 'testpilotcloud' using client-trigger (uncheck the "nightly build" checkbox, use the proper dropdown for version suffix)
+* [ ] Only now download the owncloudclient-*.tar.xz and sign it with gpg. Copy the signature into a new .asc file. (20180719jw: no more timing issue since client-trigger uses client-source-branded)
+(see https://github.com/owncloud/enterprise/wiki/Desktop-Signing-Knowledge)
+* Build results are in https://download.owncloud.com/desktop/testing -- win and mac binaries are there, linux packages are listed in a *repo.html file.
+* [ ] Branch isv:ownCloud:desktop to isv:ownCloud:desktop:client-X.Y.Z before overwriting https://github.com/owncloud/administration/blob/master/jenkins/obs_integration/obs-backup-prj.sh (the linux packages will land in the :testing repository still)
+ ```obs-backup-prj.sh isv:ownCloud:desktop isv:ownCloud:desktop:client-2.4.1 owncloud-client 2.4.1 # (if not already done)```
* [ ] Re-download Mac builds and check signature. Interactive in installer window
* [ ] Re-download Win build check signature. From Mac or Linux: ```osslsigncode verify ownCloud-version-setup.exe```
* [ ] Mac: Perform smoke test (Install, make sure it does not explode, and check if all version indicators are correct)
* [ ] Win: Perform smoke test (Install, make sure it does not explode, and check if all version indicators are correct)
* [ ] Linux: Smoke test of one distro package (Install, make sure it does not explode, and check if all version indicators are correct)
-* [ ] Linux: Run @SamuAlfageme 's magic Linux-test-all-packages-script
-* [ ] Linux: Re-enable OBS publishing on the project (check for accidentially disabled packages too)
-* Let obs build and publish exactly once. then
- * [ ] disable publishing (on the obs project!) and rebuild the owncloud-client package and all its dependencies.
- * [ ] double-check that there are no _aggregatepac from other projects
- * [ ] Create a signed tag using ```git tag -u E94E7B37 tagname``` (https://github.com/owncloud/enterprise/wiki/Desktop-Signing-Knowledge)
-* [ ] Copy builds from ```testing``` to ```stable``` on download.owncloud.com, double check the download links. (make sure the .asc is there too)
-* [ ] Create a pull request to the owncloud.org repository to update the install page (strings.php, page-desktop.php). From now on download packages from the staging webserver.
+* [ ] Linux: Run @SamuAlfageme 's client-linux-tests Jenkins job (this tests only package installations!) Adjust REPO_URL in https://jenkins.int.owncloud.com/job/client-linux-tests/build (Better: gitlab? running the test in gitlab would be better for public transparency, but only jenkins can set the parameters easily)
+* [ ] Win/Mac Copy builds from ```testing``` to ```stable``` on download.owncloud.com, double check the download links. (make sure the .asc is there too)
+* [ ] Linux: disable publishing on project isv:ownCloud:desktop
+* [ ] Linux: Use https://github.com/owncloud/administration/blob/master/jenkins/obs_integration/obs-deepcopy-prj.sh to copy from isv:ownCloud:community:testing to isv:ownCloud:desktop
+  ```obs-deepcopy-prj.sh isv:ownCloud:desktop:testing isv:ownCloud:desktop```
+  ```obs-deepcopy-prj.sh isv:ownCloud:testpilot:testing isv:ownCloud:testpilot```
+* [ ] check osc meta prj for needed updates between :desktop:testing and :desktop
+* [ ] Linux: Re-enable OBS publishing on the project after official release date and if all distros build (check for accidentially disabled packages too)
+* [ ] Linux: Wait until everything is built and published, then disable publishing on project isv:ownCloud:desktop
+* [ ] Create git signed tag in client repository using ```git tag -u E94E7B37 tagname``` (https://github.com/owncloud/enterprise/wiki/Desktop-Signing-Knowledge)
+* [ ] Create a (draft) release on https://github.com/owncloud/client/releases
+* [ ] Update https://owncloud.org/changelog/desktop-client/
+* [ ] Update https://owncloud.org/download/#owncloud-desktop-client -> Download ownCloud -> click open 'Desktop Client', edit win/mac/lin, each all three tabs "Production", "Technical Preview" [disabled], "Test pilot" enabled, edit the links.
* [ ] Announce on https://central.owncloud.org
-* [ ] Announce on announcements@owncloud.org
-* [ ] Inform packagers @dragotin (openSUSE) @hefee (Debian)
-* [ ] Create git signed tag in client repository using ```git tag -u E94E7B37 tagname```
+* [ ] Announce on announcements@owncloud.org Link to the central post so discussion happens there.
+* [ ] Inform packagers @dragotin (openSUSE) @hefee (Debian) @Germano0 (Fedora)
* [ ] Send out Social (tweet, blog, other)
* [ ] Send out customer communication (if any)
* [ ] Inform GCX that the new version is released (gcx@owncloud.com)
* [ ] Inform release-coordination@owncloud.com
* [ ] Ensure marketing is aware (marketing@owncloud.com)
* [ ] Take pride and celebrate!
-* [ ] Also update the testpilotcloud builds for that release version and make sure they show up on the download page
* [ ] Tell GCX to increment the minimum supported version for enterprise customers
* [ ] Check if minimum.supported.desktop.version (https://github.com/owncloud/core/blob/master/config/config.sample.php#L1152) needs to be updated in server
-* [ ] Linux OBS: Update the testing repository to the latest stable version.
15 minutes after after release:
* [ ] Test all advertised download links to have the expected version
-* [ ] Check for build errors in OBS
+* [ ] Check for build errors in OBS, do
+```obs-deepcopy-prj.sh isv:ownCloud:desktop isv:ownCloud:desktop:client-2.X.X```
* [ ] disable publishing in OBS to prevent that accidential rebuilds hit the end users.
A few days after the release (for final release)
* [ ] Review changes in the release branch, merge back into master
* [ ] check the crash reporter if auto update is a good idea or we need a new release
-* [ ] Update the updater script ```clientupdater.php```
+* [ ] Update the updater script ```clientupdater.php``` https://github.com/owncloud/enterprise/wiki/How-to-use-the-Client-Updater#updating-the-owncloud-hosted-updater
* [ ] Execute announced deprecations. Disable builds for deprecated platforms. Update accordingly: https://doc.owncloud.org/server/latest/admin_manual/installation/system_requirements.html#desktop
* [ ] Increment version number in nightly builds. Special case: after the last release in a branch, jump forward to the 'next release branch'... That may mean, this is nightly is the same as edge then.
diff --git a/.gitmodules b/.gitmodules
index 19d0e8349..3b5db194c 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -10,3 +10,6 @@
[submodule "src/3rdparty/zsync"]
path = src/3rdparty/zsync
url = https://github.com/ahmedammar/zsync
+[submodule "doc/docs-themes"]
+ path = doc/docs-themes
+ url = https://github.com/owncloud/docs-themes.git
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 4ebb75c18..000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,37 +0,0 @@
-sudo: required
-
-language: cpp
-
-services:
- - docker
-
-branches:
- only:
- - coverity_scan
-
-before_install:
-- sudo sh -c "echo 'deb http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/Ubuntu_14.04/ /' >> /etc/apt/sources.list.d/owncloud-client.list"
-- sudo sh -c "echo 'deb-src http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/Ubuntu_14.04/ /' >> /etc/apt/sources.list.d/owncloud-client.list"
-- wget http://download.opensuse.org/repositories/isv:ownCloud:desktop/Ubuntu_14.04/Release.key
-- sudo apt-key add - < Release.key
-- sudo apt-get update
-- sudo apt-get -y build-dep owncloud-client
-- checkout=$(git show-ref --head --hash head)
-- cd ../
-- wget https://scan.coverity.com/download/linux-64 --post-data "token=$token&project=owncloud%2Fmirall" -O coverity_tool.tgz
-- mkdir coverity
-- tar -xvf coverity_tool.tgz -C coverity --strip-components=1
-- export PATH=$PATH:$PWD/coverity/bin/
-- cd $TRAVIS_BUILD_DIR
-
-install:
-- cd ../
-- mkdir client-build
-- cd client-build
-- cmake -DCMAKE_BUILD_TYPE="Debug" $TRAVIS_BUILD_DIR
-- cov-build --dir cov-int make
-- tar czvf client.tgz cov-int
-- curl --form token=$token --form email=lukas@statuscode.ch --form file=@$PWD/client.tgz --form version="$checkout" --form description="$checkout" https://scan.coverity.com/builds?project=owncloud%2Fmirall
-
-# Hack to stop processing
-script: true
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 67b6d0d9c..4cb3a96de 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -5,41 +5,15 @@ project(client)
set(BIN_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
-set(OEM_THEME_DIR "" CACHE STRING "Define directory containing a custom theme")
-if ( EXISTS ${OEM_THEME_DIR}/OEM.cmake )
- include ( ${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()
+include("${CMAKE_CURRENT_LIST_DIR}/THEME.cmake")
-# For usage in XML files we preprocess
-string(REPLACE "&" "&amp;" APPLICATION_NAME_XML_ESCAPED "${APPLICATION_NAME}")
-string(REPLACE "<" "&lt;" APPLICATION_NAME_XML_ESCAPED "${APPLICATION_NAME_XML_ESCAPED}")
-string(REPLACE ">" "&gt;" APPLICATION_NAME_XML_ESCAPED "${APPLICATION_NAME_XML_ESCAPED}")
+set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules")
-if (NOT DEFINED LINUX_PACKAGE_SHORTNAME)
- set(LINUX_PACKAGE_SHORTNAME "${APPLICATION_SHORTNAME}")
-endif()
-
-if (NOT DEFINED PACKAGE)
- set(PACKAGE "${LINUX_PACKAGE_SHORTNAME}-client")
-endif()
-
-set( CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules )
-
-if(NOT CRASHREPORTER_EXECUTABLE)
- set(CRASHREPORTER_EXECUTABLE "${APPLICATION_EXECUTABLE}_crash_reporter")
-endif()
+set(synclib_NAME "${APPLICATION_EXECUTABLE}sync")
+set(csync_NAME "${APPLICATION_EXECUTABLE}_csync")
include(Warnings)
-include(${CMAKE_SOURCE_DIR}/VERSION.cmake)
# For config.h
include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR})
# Allows includes based on src/ like #include "common/utility.h" or #include "csync/csync.h"
@@ -188,7 +162,7 @@ if(BUILD_CLIENT)
endif()
if (NOT DEFINED APPLICATION_ICON_NAME)
- set(APPLICATION_ICON_NAME ${APPLICATION_SHORTNAME})
+ set(APPLICATION_ICON_NAME "${APPLICATION_SHORTNAME}")
endif()
include(OwnCloudCPack.cmake)
@@ -211,9 +185,6 @@ endif()
file( GLOB TRANS_FILES ${CMAKE_SOURCE_DIR}/translations/client_*.ts)
set(TRANSLATIONS ${TRANS_FILES})
-# Make sure we set this before recursing into child folders.
-set(WITH_TESTING ${UNIT_TESTING})
-
if(BUILD_CLIENT)
add_subdirectory(src)
if(NOT BUILD_LIBRARIES_ONLY)
diff --git a/ChangeLog b/ChangeLog
index 20e5b546e..f8eaa243e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,161 @@
ChangeLog
=========
-version 2.4.0 (2017-12-XX)
+version 2.5.0 (2018-08-xx)
+* Local discovery: Speed up by skipping directories without changes reported by the file system watcher.
+* Windows: Add sync folders to Explorer's navigation pane (#5295)
+* Experimental option to create virtual files and download contents on demand ("placeholders")
+* Experimental option to upload conflict files (#4557)
+* Conflicts: Change conflict file naming scheme
+* Conflicts: Add user name to conflict file name (#6325)
+* Conflicts: Better comparison when connection broke (#6626)
+* Conflicts: Deal with file/folder conflicts (#6312)
+* Conflicts: Change tray icon for unresolved conflicts (#6277)
+* Conflicts: Add documentation link to conflicts listing (#6396)
+* Conflicts: Change tags to be more user friendly (#6365)
+* Share dialog: Allow opening it if the file's contents are still syncing (#4608)
+* Share dialog: Don't hide account settings when opening it (#6185)
+* Share dialog: Remove odd grey square on OSX (#5774)
+* Share dialog: Preserve the entered password when unrelated changes are done (#6512)
+* Share dialog: Fix Re-shares not not showing up (#6666)
+* Sharing: Add "copy public link" to menu (#6356)
+* Share link: Update permission wording (#6192)
+* User shares: Show avatars
+* OAuth2: Remove the timeout (#6612)
+* Wizard: Remove the "Skip folder config" button and instead add a radio button (#3664)
+* Wizard: Fix for back button in OAuth2 (#6574)
+* Wizard: add a context menu to copy the OAuth2 link (enterprise
+* Wizard: Put errors into a scroll area (#6546)
+* Wizard: show a message when the URL is invalid
+* Wizard: pre-select the right radio button (#6685)
+* Selective Sync: Do not abort applying selective sync if one folder has an error (#6675)
+* Protocol: Introduce context menu with "open in browser" (#6121)
+* Protocol: Correct sorting by size (#6326)
+* Issues tab: Invalidate issues selectively (#6226)
+* Issues tab: Don't allow two issues for the same file/folder
+* Issues tab: addItem performance improvement
+* Activities: Remove the text that a server does not support activities when the account is removed (#6679)
+* Activities: Handle the fact that the username can contain a '@' (#6728)
+* Notifications: Lower hiding timeout
+* Notifications: Also have clickable link (#6236)
+* Shell integration: Add "Open in browser" entry in the explorer menu (#5903)
+* Sync journal: Fix crash when unmounting a drive while a sync is running (#6049)
+* Client certs: Improve error message (#6128)
+* Settings: Hide selective sync buttons while disconnected (#5809)
+* Settings: Show account page when account created
+* Settings: Move "About" to a dialog (#6075)
+* Excludes: Optimize further the matching of exclude files using regular expression
+* Windows: Update Overlay Icon naming
+* Windows: Release handle/fd when file open fails (#6699)
+* Config: Look for exclude file in a relative path.
+* Config: Versionize settings
+* Settings: Fix rename migration issue on old macOS
+* Credentials: Re-try on Linux if daemon not running (#4274, #6522)
+* Windows: Fixed MSVC build and compiler bugs
+* Proxy: Hostname validation and reconnection on setting change (#6140)
+* owncloudcmd: Set proxy earlier (#6281)
+* Exclude regex: Restore old matching on Windows (#6245)
+* Build system: Modernize the CMakeLists.txt files
+* Use standard png2ico
+* Sync: When detecting a local move, keep the local mtime (#6629)
+* Sync: Better error handling for local directory parsing (#6610)
+* Sync: Error if properties are missing (#6317)
+* Sync: Recover when the PUT reply (or chunkin's MOVE) is lost (#5106)
+* Sync: Do not abort a sync if the server closes the connection (#6516)
+* Sync: Increase the timeout for the last MOVE/PUT for huge files (#6527)
+* Sync: Fix renames making hierarchy inversion (#6694)
+* Sync: RemotePermissions: Fix empty vs null (#4608)
+* Sync: Fix the "direction" of the "all file delted" message when the server is reset (#6317)
+* Data-Fingerprint: Fix backup detection when fingerprint is empty
+* propagateuploadv1: Fixed an assert with ownCloud 5
+* Download: Use the <s:message> from the reply in the error message (#6459, #6459)
+* SocketAPI: dynamic action menu
+* Hidden option to move remote-deleted files to trash (#6265)
+* FolderStatusModel: Refresh folders on Problem sync (#6337)
+* SyncJournal: Clear etag filter before sync
+* SyncEngine: Use separate state for two unicode conversions
+* owncloudcmd: Do not read the proxy settings from the gui's config file
+* ProgressInfo: Add information for local vs remote discovery
+* SyncResult: Make sure the number of conflicts is correct (#6226)
+* Remove the "CSync" wording from the error messages
+* Apply branding to crashreporter resources file
+* SslButton: Add HTTP/2 info (#3146)
+* SslButton: Improve speed (especially on macOS) (#6031)
+* Folder: normalize the local path. (#4424)
+* Folder: Fix checking if the folder can be used as sync folder (#6654)
+* Blacklisting must prevent parent etag updates (#6411)
+* FolderStatusModel: fix potential assert
+* Nautilus integration: Not a ColumnProvider
+* Nautilus integration: Fix python3 compatibility (#6406, #6643)
+* Nautilus: Guard against None state (#6643)
+* Dolphin plugin: fall back if $XDG_RUNTIME_DIR is empty
+* Notify if an explicitly excluded folder is created (#6222)
+* Theme: unify ownCloudTheme and Theme classes
+* SyncJournalDb::setSelectiveSyncList: Always use a transaction (#6431)
+* Folders: Use "Problem" icon for unresolved conflicts (#6277)
+* macOS: Unload the Finder extension on exit (#5382, #3819)
+* Logging: Go to new file on Problem/Abort too (#6442)
+* Logging: Compress log when switching files (#6442)
+* Logging: Add persistent auto-logdir option (#6442)
+* Logging: .owncloudsynclog: Allow 10 MB of size (#6420)
+* Logging: .owncloudsynclog: Persist X-Request-ID for correlation with server (#6420)
+* UI: High-DPI layout fixes
+* Network settings: Better warnings about bad configuration (#5885)
+* Folder watcher: Show a notification if it becomes unreliable (#6119)
+* Ignore editor: Preserve comments in the exclude list file
+* Updater: Support EXE->MSI upgrade (different code than 2.4)
+* ConnectionValidator: change the minimum server version to 7.0
+* ConnectionValidator: Warn when the server version is less than 9.1
+* Valgrind: Refactorings to avoid errors
+* Crash fixes (#6562 and more)
+* Windows: Fix missing company name in our DLLs
+* Linux: More tray workarounds (#6545)
+* libocsync: Rename to ${APPLICATION_EXECUTABLE}_csync
+* Don't use Qt deprecated API now that we required Qt 5.6
+
+version 2.4.3 (2018-08-13)
+* Windows: Don't ignore files with FILE_ATTRIBUTE_TEMPORARY (#6696, #6610)
+* OAuth2: Fix infinite loop when the refresh token is expired
+* Windows MSI: Fix crash in the auto updater
+* Nautilus: Guard against None state (#6643)
+
+version 2.4.2 (2018-07-18)
+* Linux: Tray workarounds (#6545)
+* Fix nautilus/nemo shell issues (#6393, #6406)
+* Updater: Add update channel feature (#6259)
+* Updater: Support EXE->MSI upgrade
+* SyncJournal: Fixes for sync folders on removable media (#6049, #6049)
+* SslButton: Add HTTP/2 info (#3146)
+* Fix assert when using ownCloud server 5 (which you should not) (#6403)
+* Normalize local path (#4424)
+* Blacklisting must prevent parent etag updates (#6411)
+* macdeployqt: Adjust minimum version based on our Qt (#5932)
+* macOS: Unload the Finder extension on exit (#5382, #3819)
+* Upload: Adjust timeout for final job based on file size (#6527)
+* Sync: When detecting a local move, keep the local mtime (#6629)
+* Credentials: Retry fetching from the keychain in case the keychain is still starting (#4274, #6522)
+* OAuth2: Try to refresh the token even if the credentials weren't ready (#6522)
+
+version 2.4.1 (2018-03-05)
+* Ignore files with file names that can't be encoded for the filesystem (#6287, #5676, #5719)
+* Issues: Speed up insertion and add hard upper limit (#6272)
+* Notifications: Fix "Dismiss" action
+* Notifications: Fix timer invocation on macOS
+* Notifications: Immediately poll when account online
+* Protocol: Remove entries for auto resolved conflicts (#6316)
+* owncloudcmd: Set proxy before capabilities call (#6281)
+* owncloudcmd: Do not do the capability call when --nonshib is passed
+* Avatars: Use old location for servers <10 (#6279)
+* Link shares: Change default share name (#6298)
+* Sharing: Use maximum allowed permissions for new share (#6346)
+* Nautilus integration: Work with python2 and python3
+* Windows: Don't delete contents behind directory junctions (#6322)
+* SyncJournal: Don't use LIKE with paths (#6322)
+* Fix setting launch-on-startup when the first account is set up (#6347)
+* HTTP2: Only allow with Qt 5.9.4 (#6285)
+* Crash fixes
+
+version 2.4.0 (2017-12-21)
* If you're using 2.4.0 alpha1, please upgrade as previous alphas/rcs had an issue with hidden files and renames!
* OAuth2 authentication support by opening external browser (#5668)
* Shibboleth: Change to use OAuth2 if supported (#6198)
diff --git a/Jenkinsfile b/Jenkinsfile
deleted file mode 100644
index 22dc1f99f..000000000
--- a/Jenkinsfile
+++ /dev/null
@@ -1,72 +0,0 @@
-#!groovy
-
-//
-// We now run the tests in Debug mode so that ASSERTs are triggered.
-// Ideally we should run the tests in both Debug and Release so we catch
-// all possible error combinations.
-// See also the top comment in syncenginetestutils.h
-//
-// We are building "Linux - GCC" with "make" and "Linux - Clang" with ninja,
-// the combinations are more or less arbitrarily chosen. We just want to
-// check that both compilers and both CMake generators work. It's
-// unlikely that a specific generator only breaks with a specific
-// compiler.
-
-// Constructed from the DockerFile in admin/linux/DockerFile
-def linux = docker.image('dominikschmidt/docker-owncloud-client-linux:latest')
-// Constructed from the DockerFile in admin/win/docker/DockerFile
-def win32 = docker.image('dominikschmidt/docker-owncloud-client-win32-cross:latest')
-
-node('CLIENT') {
- stage 'Checkout'
- checkout scm
- sh '''git submodule update --init'''
-
- stage 'Linux - Pull Docker Image'
- linux.pull()
-
- stage 'Linux - GCC'
- linux.inside {
- sh '''
- export HOME="$(pwd)/home"
- rm -rf build home
- mkdir build
- cd build
- cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_BUILD_TYPE="Debug" -DUNIT_TESTING=1 ..
- make -j4
- LC_ALL=C.UTF-8 ctest -V --output-on-failure
- '''
- }
-
- stage 'Linux - Clang'
- linux.inside {
- sh '''
- export HOME="$(pwd)/home"
- rm -rf build home
- mkdir build
- cd build
- cmake -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE="Debug" -DUNIT_TESTING=1 ..
- ninja -j4
- LC_ALL=C.UTF-8 ctest -V --output-on-failure
- '''
- }
-
- stage 'Win32 Cross - Pull Docker Image'
- win32.pull()
-
- stage 'Win32 Cross'
- win32.inside {
- sh '''
- rm -rf build-win32
- mkdir build-win32
- cd build-win32
- ../admin/win/download_runtimes.sh
- cmake .. -DCMAKE_TOOLCHAIN_FILE=../admin/win/Toolchain-mingw32-openSUSE.cmake -DWITH_CRASHREPORTER=ON
- make -j4
- make package
- ctest .
- '''
- }
-
- // Stage 'macOS' TODO
-}
diff --git a/OWNCLOUD.cmake b/OWNCLOUD.cmake
index a98c0787f..8d76fa014 100644
--- a/OWNCLOUD.cmake
+++ b/OWNCLOUD.cmake
@@ -5,6 +5,7 @@ set( APPLICATION_DOMAIN "owncloud.com" )
set( APPLICATION_VENDOR "ownCloud" )
set( APPLICATION_UPDATE_URL "https://updates.owncloud.com/client/" CACHE string "URL for updater" )
set( APPLICATION_ICON_NAME "owncloud" )
+set( APPLICATION_VIRTUALFILE_SUFFIX "owncloud" CACHE STRING "Virtual file suffix (not including the .)")
set( LINUX_PACKAGE_SHORTNAME "owncloud" )
@@ -19,4 +20,4 @@ set( MAC_INSTALLER_BACKGROUND_FILE "${CMAKE_SOURCE_DIR}/admin/osx/installer-back
option( WITH_CRASHREPORTER "Build crashreporter" OFF )
set( CRASHREPORTER_SUBMIT_URL "https://crash-reports.owncloud.com/submit" CACHE string "URL for crash reporter" )
-set( CRASHREPORTER_ICON ":/owncloud-icon.png" )
+
diff --git a/README.md b/README.md
index 3f6bbe2da..699e76a0a 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# ownCloud Desktop Client
-[![Build Status](https://jenkins.owncloud.org/buildStatus/icon?job=owncloud-client/client/master)](https://jenkins.owncloud.org/job/owncloud-client/job/client/job/master/) [![Build status](https://ci.appveyor.com/api/projects/status/a1x3dslys7de6e21/branch/master?svg=true)](https://ci.appveyor.com/project/ownclouders/client/branch/master)
+[![Build Status](https://drone.owncloud.com/api/badges/owncloud/client/status.svg)](https://drone.owncloud.com/owncloud/client) [![Build status](https://ci.appveyor.com/api/projects/status/a1x3dslys7de6e21/branch/master?svg=true)](https://ci.appveyor.com/project/ownclouders/client/branch/master)
## Introduction
@@ -12,7 +12,7 @@ with your computer.
### Binary packages
-* Refer to the download page https://owncloud.org/install/#install-clients
+* Refer to the download page https://owncloud.org/download/#owncloud-desktop-client
### Source code
@@ -27,18 +27,6 @@ https://github.com/owncloud/client.
[Building the Client](http://doc.owncloud.org/desktop/2.3/building.html)
in the ownCloud Desktop Client manual.
-## Maintainers and Contributors
-
-The maintainers of this repository are:
-
-* Klaas Freitag <freitag@owncloud.com>
-* Daniel Molkentin <danimo@owncloud.com>
-* Markus Goetz <guruz@owncloud.com>
-* Olivier Goffart <ogoffart@owncloud.com>
-
-ownCloud Desktop Client is developed by the ownCloud community and receives
-patches from a variety of authors.
-
## Reporting issues and contributing
If you find any bugs or have any suggestion for improvement, please
@@ -56,6 +44,23 @@ If you want to contact us, e.g. before starting a more complex feature,
you can join us at
[#owncloud-client-dev](irc://irc.freenode.net/#owncloud-client-dev).
+## Maintainers and Contributors
+
+The current maintainers of this repository are:
+
+* Markus Goetz <guruz@owncloud.com>
+* Olivier Goffart <ogoffart@owncloud.com>
+* Christian Kamm <mail@ckamm.de>
+
+ownCloud Desktop Client is developed by the ownCloud community and [receives
+patches from a variety of authors](https://github.com/owncloud/client/graphs/contributors).
+
+Past maintainers:
+
+* Klaas Freitag <freitag@owncloud.com>
+* Daniel Molkentin <daniel@molkentin.de>
+* Andreas Schneider <asn@cryptomilk.org>
+
## License
This program is free software; you can redistribute it and/or modify
diff --git a/THEME.cmake b/THEME.cmake
new file mode 100644
index 000000000..e0946dac0
--- /dev/null
+++ b/THEME.cmake
@@ -0,0 +1,38 @@
+set(OEM_THEME_DIR "" CACHE STRING "Define directory containing a custom theme")
+if (EXISTS "${OEM_THEME_DIR}/OEM.cmake")
+ include("${OEM_THEME_DIR}/OEM.cmake")
+else()
+ include ("${CMAKE_CURRENT_LIST_DIR}/OWNCLOUD.cmake")
+endif()
+
+# Default suffix if the theme doesn't define one
+if(NOT DEFINED APPLICATION_VIRTUALFILE_SUFFIX)
+ set(APPLICATION_VIRTUALFILE_SUFFIX "${APPLICATION_SHORTNAME}_virtual" CACHE STRING "Virtual file suffix (not including the .)")
+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()
+
+# For usage in XML files we preprocess
+string(REPLACE "&" "&amp;" APPLICATION_NAME_XML_ESCAPED "${APPLICATION_NAME}")
+string(REPLACE "<" "&lt;" APPLICATION_NAME_XML_ESCAPED "${APPLICATION_NAME_XML_ESCAPED}")
+string(REPLACE ">" "&gt;" APPLICATION_NAME_XML_ESCAPED "${APPLICATION_NAME_XML_ESCAPED}")
+
+if (NOT DEFINED LINUX_PACKAGE_SHORTNAME)
+ set(LINUX_PACKAGE_SHORTNAME "${APPLICATION_SHORTNAME}")
+endif()
+
+if (NOT DEFINED PACKAGE)
+ set(PACKAGE "${LINUX_PACKAGE_SHORTNAME}-client")
+endif()
+
+if(NOT CRASHREPORTER_EXECUTABLE)
+ set(CRASHREPORTER_EXECUTABLE "${APPLICATION_EXECUTABLE}_crash_reporter")
+endif()
+
+
+include("${CMAKE_CURRENT_LIST_DIR}/VERSION.cmake")
diff --git a/VERSION.cmake b/VERSION.cmake
index c03021310..61adf735e 100644
--- a/VERSION.cmake
+++ b/VERSION.cmake
@@ -1,7 +1,7 @@
set( MIRALL_VERSION_MAJOR 2 )
-set( MIRALL_VERSION_MINOR 5 )
+set( MIRALL_VERSION_MINOR 6 )
set( MIRALL_VERSION_PATCH 0 )
-set( MIRALL_VERSION_YEAR 2017 )
+set( MIRALL_VERSION_YEAR 2018 )
set( MIRALL_SOVERSION 0 )
if ( NOT DEFINED MIRALL_VERSION_SUFFIX )
diff --git a/admin/osx/CMakeLists.txt b/admin/osx/CMakeLists.txt
index 78f9ec32a..5531223fb 100644
--- a/admin/osx/CMakeLists.txt
+++ b/admin/osx/CMakeLists.txt
@@ -11,7 +11,8 @@ else()
set(MAC_INSTALLER_DO_CUSTOM_BACKGROUND "0")
endif()
-configure_file(create_mac_pkg.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/create_mac.sh)
-configure_file(macosx.pkgproj ${CMAKE_CURRENT_BINARY_DIR}/macosx.pkgproj)
+find_package(Qt5 5.6 COMPONENTS Core REQUIRED)
+configure_file(create_mac.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/create_mac.sh)
+configure_file(macosx.pkgproj.cmake ${CMAKE_CURRENT_BINARY_DIR}/macosx.pkgproj)
configure_file(pre_install.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/pre_install.sh)
configure_file(post_install.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/post_install.sh)
diff --git a/admin/osx/create_mac_pkg.sh.cmake b/admin/osx/create_mac.sh.cmake
index 90e871587..40b3e5796 100755
--- a/admin/osx/create_mac_pkg.sh.cmake
+++ b/admin/osx/create_mac.sh.cmake
@@ -23,7 +23,7 @@ identity="$3"
prjfile=$build_path/admin/osx/macosx.pkgproj
# The name of the installer package
-installer="@APPLICATION_SHORTNAME@-@MIRALL_VERSION_FULL@@MIRALL_VERSION_SUFFIX@"
+installer="@APPLICATION_SHORTNAME@-qt@Qt5Core_VERSION@-@MIRALL_VERSION_FULL@@MIRALL_VERSION_SUFFIX@"
installer_file="$installer.pkg"
installer_file_tar="$installer.pkg.tar"
installer_file_tar_bz2="$installer.pkg.tar.bz2"
diff --git a/admin/osx/macdeployqt.py b/admin/osx/macdeployqt.py
index f27eead38..378afcc87 100755
--- a/admin/osx/macdeployqt.py
+++ b/admin/osx/macdeployqt.py
@@ -22,6 +22,7 @@ import subprocess
import commands
import sys
from glob import glob
+from distutils.version import LooseVersion
def QueryQMake(attrib):
return subprocess.check_output([qmake_path, '-query', attrib]).rstrip('\n')
@@ -92,6 +93,8 @@ commands.append(['mkdir', '-p', resources_dir])
plugins_dir = os.path.join(bundle_dir, 'Contents', 'PlugIns')
binaries = [i for i in glob(os.path.join(bundle_dir, 'Contents', 'MacOS', "*")) if is_exe(i)];
+qt_version = QueryQMake('QT_VERSION')
+print "Using Qt", qt_version
fixed_libraries = []
fixed_frameworks = []
@@ -334,9 +337,19 @@ def FindQtPlugin(name):
for binary in binaries:
FixBinary(binary)
+
+if LooseVersion(qt_version) >= LooseVersion("5.10.0"):
+ QT_PLUGINS.append('styles/libqmacstyle.dylib')
for plugin in QT_PLUGINS:
FixPlugin(FindQtPlugin(plugin), os.path.dirname(plugin))
+if LooseVersion(qt_version) >= LooseVersion("5.10.0"):
+ args = ['plutil', '-insert', 'LSMinimumSystemVersion', '-string', '10.10.0', os.path.join(bundle_dir, 'Contents', 'Info.plist')]
+ commands.append(args)
+else:
+ args = ['plutil', '-insert', 'LSMinimumSystemVersion', '-string', '10.7.0', os.path.join(bundle_dir, 'Contents', 'Info.plist')]
+ commands.append(args)
+
if len(sys.argv) <= 2:
print 'Will run %d commands:' % len(commands)
for command in commands:
diff --git a/admin/osx/macosx.pkgproj b/admin/osx/macosx.pkgproj.cmake
index 927ca92df..0552e1c32 100644
--- a/admin/osx/macosx.pkgproj
+++ b/admin/osx/macosx.pkgproj.cmake
@@ -579,7 +579,9 @@
</dict>
</dict>
<key>INSTALLATION TYPE</key>
- <integer>0</integer>
+ <integer>1</integer>
+ <key>MODE</key>
+ <integer>1</integer>
</dict>
<key>INSTALLATION_STEPS</key>
<array>
@@ -699,7 +701,7 @@
<key>BUILD_PATH</key>
<dict>
<key>PATH</key>
- <string>../install/.</string>
+ <string>@CMAKE_INSTALL_PREFIX@/.</string>
<key>PATH_TYPE</key>
<integer>3</integer>
</dict>
diff --git a/admin/osx/post_install.sh.cmake b/admin/osx/post_install.sh.cmake
index bee2caaf9..0cbbee2ff 100644
--- a/admin/osx/post_install.sh.cmake
+++ b/admin/osx/post_install.sh.cmake
@@ -1,12 +1,16 @@
#!/bin/sh
-osascript << EOF
+# Check if Finder is running (for systems with Finder disabled)
+finder_status=`ps aux | grep "/System/Library/CoreServices/Finder.app/Contents/MacOS/Finder" | grep -v "grep"`
+if ! [ "$finder_status" == "" ] ; then # Finder is running
+ osascript << EOF
tell application "Finder"
activate
select the last Finder window
reveal POSIX file "/Applications/@APPLICATION_EXECUTABLE@.app"
end tell
EOF
+fi
# Always enable the new 10.10 finder plugin if available
if [ -x "$(command -v pluginkit)" ]; then
diff --git a/admin/osx/sign_dmg.sh b/admin/osx/sign_dmg.sh
deleted file mode 100755
index c1f4ba7d5..000000000
--- a/admin/osx/sign_dmg.sh
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/sh -x
-
-[ "$#" -lt 2 ] && echo "Usage: sign_dmg.sh <dmg> <identity>" && exit
-
-src_dmg="$1"
-tmp_dmg="writable_$1"
-signed_dmg="signed_$1"
-identity="$2"
-
-QT_FMWKS=`basename ${TMP_APP}/Contents/Frameworks`/Qt*
-QT_FMWK_VERSION="5"
-
-fix_frameworks() {
- TMP_APP=$1
- QT_FMWK_PATH=$2
- QT_FMWKS=$3/Qt*.framework
-
- echo "Patching Qt frameworks..."
- for FMWK in $QT_FMWKS; do
- FMWK_NAME=`basename -s .framework $FMWK`
- FMWK=`basename $FMWK`
- FMWK_PATH="${TMP_APP}/Contents/Frameworks/${FMWK}"
- mkdir -p "${FMWK_PATH}/Versions/${QT_FMWK_VERSION}/Resources/"
- cp -avf "${QT_FMWK_PATH}/${FMWK}/Contents/Info.plist" "${FMWK_PATH}/Versions/${QT_FMWK_VERSION}/Resources"
- (cd "${FMWK_PATH}" && ln -sf "Versions/${QT_FMWK_VERSION}/Resources" "Resources")
- perl -pi -e "s/${FMWK_NAME}_debug/${FMWK_NAME}/" "${FMWK_PATH}/Resources/Info.plist"
- done
-}
-
-mount="/Volumes/$(basename "$src_dmg"|sed 's,-\([0-9]\)\(.*\),,')"
-test -e "$tmp_dmg" && rm -rf "$tmp_dmg"
-hdiutil convert "$src_dmg" -format UDRW -o "$tmp_dmg"
-hdiutil attach "$tmp_dmg"
-pushd "$mount"
-fix_frameworks "$mount"/*.app `qmake -query QT_INSTALL_LIBS` "$mount"/*.app/Contents/Frameworks
-codesign -s "$identity" --deep "$mount"/*.app
-popd
-diskutil eject "$mount"
-test -e "$signed_dmg" && rm -rf "$signed_dmg"
-hdiutil convert "$tmp_dmg" -format UDBZ -o "$signed_dmg"
diff --git a/admin/win/nsi/lib/fileassoc.nsh b/admin/win/nsi/lib/fileassoc.nsh
new file mode 100644
index 000000000..87e6caf10
--- /dev/null
+++ b/admin/win/nsi/lib/fileassoc.nsh
@@ -0,0 +1,120 @@
+; fileassoc.nsh
+; File association helper macros
+; Written by Saivert
+; See http://nsis.sourceforge.net/FileAssoc
+;
+; Features automatic backup system and UPDATEFILEASSOC macro for
+; shell change notification.
+;
+; |> How to use <|
+; To associate a file with an application so you can double-click it in explorer, use
+; the APP_ASSOCIATE macro like this:
+;
+; Example:
+; !insertmacro APP_ASSOCIATE "txt" "myapp.textfile" "Description of txt files" \
+; "$INSTDIR\myapp.exe,0" "Open with myapp" "$INSTDIR\myapp.exe $\"%1$\""
+;
+; Never insert the APP_ASSOCIATE macro multiple times, it is only ment
+; to associate an application with a single file and using the
+; the "open" verb as default. To add more verbs (actions) to a file
+; use the APP_ASSOCIATE_ADDVERB macro.
+;
+; Example:
+; !insertmacro APP_ASSOCIATE_ADDVERB "myapp.textfile" "edit" "Edit with myapp" \
+; "$INSTDIR\myapp.exe /edit $\"%1$\""
+;
+; To have access to more options when registering the file association use the
+; APP_ASSOCIATE_EX macro. Here you can specify the verb and what verb is to be the
+; standard action (default verb).
+;
+; And finally: To remove the association from the registry use the APP_UNASSOCIATE
+; macro. Here is another example just to wrap it up:
+; !insertmacro APP_UNASSOCIATE "txt" "myapp.textfile"
+;
+; |> Note <|
+; When defining your file class string always use the short form of your application title
+; then a period (dot) and the type of file. This keeps the file class sort of unique.
+; Examples:
+; Winamp.Playlist
+; NSIS.Script
+; Photoshop.JPEGFile
+;
+; |> Tech info <|
+; The registry key layout for a file association is:
+; HKEY_CLASSES_ROOT
+; <applicationID> = <"description">
+; shell
+; <verb> = <"menu-item text">
+; command = <"command string">
+;
+
+!macro APP_ASSOCIATE EXT FILECLASS DESCRIPTION ICON COMMANDTEXT COMMAND
+ ; Backup the previously associated file class
+ ReadRegStr $R0 HKCR ".${EXT}" ""
+ WriteRegStr HKCR ".${EXT}" "${FILECLASS}_backup" "$R0"
+
+ WriteRegStr HKCR ".${EXT}" "" "${FILECLASS}"
+
+ WriteRegStr HKCR "${FILECLASS}" "" `${DESCRIPTION}`
+ WriteRegStr HKCR "${FILECLASS}\DefaultIcon" "" `${ICON}`
+ WriteRegStr HKCR "${FILECLASS}\shell" "" "open"
+ WriteRegStr HKCR "${FILECLASS}\shell\open" "" `${COMMANDTEXT}`
+ WriteRegStr HKCR "${FILECLASS}\shell\open\command" "" `${COMMAND}`
+!macroend
+
+!macro APP_ASSOCIATE_EX EXT FILECLASS DESCRIPTION ICON VERB DEFAULTVERB SHELLNEW COMMANDTEXT COMMAND
+ ; Backup the previously associated file class
+ ReadRegStr $R0 HKCR ".${EXT}" ""
+ WriteRegStr HKCR ".${EXT}" "${FILECLASS}_backup" "$R0"
+
+ WriteRegStr HKCR ".${EXT}" "" "${FILECLASS}"
+ StrCmp "${SHELLNEW}" "0" +2
+ WriteRegStr HKCR ".${EXT}\ShellNew" "NullFile" ""
+
+ WriteRegStr HKCR "${FILECLASS}" "" `${DESCRIPTION}`
+ WriteRegStr HKCR "${FILECLASS}\DefaultIcon" "" `${ICON}`
+ WriteRegStr HKCR "${FILECLASS}\shell" "" `${DEFAULTVERB}`
+ WriteRegStr HKCR "${FILECLASS}\shell\${VERB}" "" `${COMMANDTEXT}`
+ WriteRegStr HKCR "${FILECLASS}\shell\${VERB}\command" "" `${COMMAND}`
+!macroend
+
+!macro APP_ASSOCIATE_ADDVERB FILECLASS VERB COMMANDTEXT COMMAND
+ WriteRegStr HKCR "${FILECLASS}\shell\${VERB}" "" `${COMMANDTEXT}`
+ WriteRegStr HKCR "${FILECLASS}\shell\${VERB}\command" "" `${COMMAND}`
+!macroend
+
+!macro APP_ASSOCIATE_REMOVEVERB FILECLASS VERB
+ DeleteRegKey HKCR `${FILECLASS}\shell\${VERB}`
+!macroend
+
+
+!macro APP_UNASSOCIATE EXT FILECLASS
+ ; Backup the previously associated file class
+ ReadRegStr $R0 HKCR ".${EXT}" `${FILECLASS}_backup`
+ WriteRegStr HKCR ".${EXT}" "" "$R0"
+
+ DeleteRegKey HKCR `${FILECLASS}`
+!macroend
+
+!macro APP_ASSOCIATE_GETFILECLASS OUTPUT EXT
+ ReadRegStr ${OUTPUT} HKCR ".${EXT}" ""
+!macroend
+
+
+; !defines for use with SHChangeNotify
+!ifdef SHCNE_ASSOCCHANGED
+!undef SHCNE_ASSOCCHANGED
+!endif
+!define SHCNE_ASSOCCHANGED 0x08000000
+!ifdef SHCNF_FLUSH
+!undef SHCNF_FLUSH
+!endif
+!define SHCNF_FLUSH 0x1000
+
+!macro UPDATEFILEASSOC
+; Using the system.dll plugin to call the SHChangeNotify Win32 API function so we
+; can update the shell.
+ System::Call "shell32::SHChangeNotify(i,i,i,i) (${SHCNE_ASSOCCHANGED}, ${SHCNF_FLUSH}, 0, 0)"
+!macroend
+
+;EOF
diff --git a/admin/win/nsi/page_header.bmp b/admin/win/nsi/page_header.bmp
index d10a88d38..6398cfbf8 100644
--- a/admin/win/nsi/page_header.bmp
+++ b/admin/win/nsi/page_header.bmp
Binary files differ
diff --git a/appveyor.ini b/appveyor.ini
index 658eeac24..96398423c 100644
--- a/appveyor.ini
+++ b/appveyor.ini
@@ -9,6 +9,9 @@ Command=craft
#Values need to be overwritten to create a chache
UseCache = True
CreateCache = False
+QtVersion = 5.11.1
+OpenSslVersion = 1.1.0h
+CacheVersion = Qt_${Variables:QtVersion}
# Settings applicable for all Crafts matrices
# Settings are Category/key=value
@@ -25,9 +28,10 @@ ShortPath/JunctionDir = C:\CM-SP\
Packager/CacheDir = ${Variables:Root}\cache
Packager/UseCache = ${Variables:UseCache}
Packager/CreateCache = ${Variables:CreateCache}
+Packager/CacheVersion = ${Variables:CacheVersion}
; Packager/RepositoryUrl = https://files.kde.org/craft/
Packager/PackageType = PortablePackager
-Packager/RepositoryUrl = http://ftp.acc.umu.se/mirror/kde.org/files/craft/master/
+Packager/RepositoryUrl = https://attic.owncloud.com/org/mirror/craft/
Compile/BuildType = RelWithDebInfo
ContinuousIntegration/Enabled = True
@@ -35,7 +39,8 @@ ContinuousIntegration/Enabled = True
# don't try to pip install on the ci
python-modules.ignored = True
-libs/qt5.version = 5.9.3
+libs/qt5.version = ${Variables:QtVersion}
+win32libs/openssl.version = ${Variables:OpenSslVersion}
craft/craft-core.version = master
[windows-msvc2017_64-cl]
diff --git a/appveyor.yml b/appveyor.yml
index 289f58958..bea47ace5 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -3,6 +3,7 @@ version: '{build}-{branch}'
branches:
only:
- master
+ - 2.5
clone_depth: 50
@@ -20,6 +21,7 @@ install:
& cmd /C "git clone -q --depth=1 git://anongit.kde.org/craftmaster.git C:\CraftMaster\CraftMaster 2>&1"
craft $env:TARGET -i craft
+ craft $env:TARGET --add-blueprint-repository [git]https://github.com/owncloud/craft-blueprints-owncloud.git
craft $env:TARGET --install-deps owncloud-client
build_script:
@@ -30,11 +32,6 @@ after_build:
- ps: |
craft $env:TARGET --src-dir $env:APPVEYOR_BUILD_FOLDER --package owncloud-client
-
-on_finish:
-- ps: |
- Get-ChildItem $env:USERPROFILE\.craft\* | % { Push-AppveyorArtifact $_.FullName -FileName $_.Name }
-
test_script:
- ps: |
craft $env:TARGET --src-dir $env:APPVEYOR_BUILD_FOLDER --test owncloud-client
@@ -45,6 +42,3 @@ environment:
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
- TARGET: windows-msvc2017_64-cl
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
-
-artifacts:
- - path: binaries/*
diff --git a/binary b/binary
-Subproject 3425fab2c66118ffae3e3b16751e636ca71ee45
+Subproject 09f12de3122ad1acf735d0e85b77bfba1cac2a2
diff --git a/client.qrc b/client.qrc
index 07847458e..546070187 100644
--- a/client.qrc
+++ b/client.qrc
@@ -20,7 +20,7 @@
<file>resources/lock-https.png</file>
<file>resources/lock-https@2x.png</file>
<file>resources/account.png</file>
- <file>resources/more.png</file>
+ <file>resources/more.svg</file>
<file>resources/delete.png</file>
<file>resources/bell.png</file>
</qresource>
diff --git a/cmake/modules/ECMAddAppIcon.cmake b/cmake/modules/ECMAddAppIcon.cmake
index ee2296ead..c2d07f6fb 100644
--- a/cmake/modules/ECMAddAppIcon.cmake
+++ b/cmake/modules/ECMAddAppIcon.cmake
@@ -8,8 +8,8 @@
#
# ecm_add_app_icon(<sources_var>
# ICONS <icon> [<icon> [...]]
-# [SIDEBAR_ICONS <icon> [<icon> [...]] # Since 5.4x
-# [OUTFILE_BASE <name>]) # Since 5.4x
+# [SIDEBAR_ICONS <icon> [<icon> [...]] # Since 5.49
+# [OUTFILE_BASENAME <name>]) # Since 5.49
# )
#
# The given icons, whose names must match the pattern::
@@ -27,20 +27,21 @@
#
# ``SIDEBAR_ICONS`` can be used to add Mac OS X sidebar
# icons to the generated iconset. They are used when a folder monitored by the
-# application is dragged into Finder's sidebar. Since 5.4x.
+# application is dragged into Finder's sidebar. Since 5.49.
#
-# ``OUTFILE_BASE`` will be used as the basename for the icon file. If
-# you specify it, the icon file will be called ``<OUTFILE_BASE>.icns`` on Mac OS X
-# and ``<OUTFILE_BASE>.ico`` on Windows. If you don't specify it, it defaults
-# to ``<sources_var>.<ext>``. Since 5.4x.
+# ``OUTFILE_BASENAME`` will be used as the basename for the icon file. If
+# you specify it, the icon file will be called ``<OUTFILE_BASENAME>.icns`` on Mac OS X
+# and ``<OUTFILE_BASENAME>.ico`` on Windows. If you don't specify it, it defaults
+# to ``<sources_var>.<ext>``. Since 5.49.
#
#
# Windows notes
# * Icons are compiled into the executable using a resource file.
# * Icons may not show up in Windows Explorer if the executable
# target does not have the ``WIN32_EXECUTABLE`` property set.
-# * The tool png2ico is required. See :find-module:`FindPng2Ico`.
-# * Supported sizes: 16, 32, 48, 64, 128.
+# * One of the tools png2ico (See :find-module:`FindPng2Ico`) or
+# icotool (see :find-module:`FindIcoTool`) is required.
+# * Supported sizes: 16, 24, 32, 48, 64, 128, 256, 512 and 1024.
#
# Mac OS X notes
# * The executable target must have the ``MACOSX_BUNDLE`` property set.
@@ -101,7 +102,7 @@ include(CMakeParseArguments)
function(ecm_add_app_icon appsources)
set(options)
- set(oneValueArgs OUTFILE_BASE)
+ set(oneValueArgs OUTFILE_BASENAME)
set(multiValueArgs ICONS SIDEBAR_ICONS)
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
@@ -140,7 +141,7 @@ function(ecm_add_app_icon appsources)
_ecm_add_app_icon_categorize_icons("${ARG_ICONS}" "icons" "16;32;48;64;128;256;512;1024")
if(ARG_SIDEBAR_ICONS)
- _ecm_add_app_icon_categorize_icons("${ARG_SIDEBAR_ICONS}" "sidebar_icons" "16;18;32;36;64")
+ _ecm_add_app_icon_categorize_icons("${ARG_SIDEBAR_ICONS}" "sidebar_icons" "16;32;64;128;256")
endif()
set(mac_icons
@@ -164,46 +165,41 @@ function(ecm_add_app_icon appsources)
endif()
- set(windows_icons ${icons_at_16px}
- ${icons_at_32px}
- ${icons_at_48px}
- ${icons_at_64px}
- ${icons_at_128px})
- if (NOT windows_icons)
+ set(windows_icons_classic ${icons_at_16px}
+ ${icons_at_24px}
+ ${icons_at_32px}
+ ${icons_at_48px}
+ ${icons_at_64px}
+ ${icons_at_128px})
+ set(windows_icons_modern ${windows_icons_classic}
+ ${icons_at_256px}
+ ${icons_at_512px}
+ ${icons_at_1024px})
+
+ if (NOT (windows_icons_modern OR windows_icons_classic))
message(AUTHOR_WARNING "No icons suitable for use on Windows provided")
endif()
- if (ARG_OUTFILE_BASE)
- set (_outfilebasename "${ARG_OUTFILE_BASE}")
+ if (ARG_OUTFILE_BASENAME)
+ set (_outfilebasename "${ARG_OUTFILE_BASENAME}")
else()
set (_outfilebasename "${appsources}")
endif()
set (_outfilename "${CMAKE_CURRENT_BINARY_DIR}/${_outfilebasename}")
- if (WIN32 AND windows_icons)
+ if (WIN32 AND (windows_icons_modern OR windows_icons_classic))
set(saved_CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_FIND_MODULE_DIR})
find_package(Png2Ico)
+ find_package(IcoTool)
set(CMAKE_MODULE_PATH "${saved_CMAKE_MODULE_PATH}")
- if (Png2Ico_FOUND)
- if (Png2Ico_HAS_RCFILE_ARGUMENT)
- add_custom_command(
- OUTPUT "${_outfilename}.rc" "${_outfilename}.ico"
- COMMAND Png2Ico::Png2Ico
- ARGS
- --rcfile "${_outfilename}.rc"
- "${_outfilename}.ico"
- ${windows_icons}
- DEPENDS ${windows_icons}
- WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
- )
- else()
+ function(create_windows_icon_and_rc command args deps)
add_custom_command(
OUTPUT "${_outfilename}.ico"
- COMMAND Png2Ico::Png2Ico
- ARGS "${_outfilename}.ico" ${windows_icons}
- DEPENDS ${windows_icons}
+ COMMAND ${command}
+ ARGS ${args}
+ DEPENDS ${deps}
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
)
# this bit's a little hacky to make the dependency stuff work
@@ -215,10 +211,65 @@ function(ecm_add_app_icon appsources)
DEPENDS "${_outfilename}.ico"
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
)
- endif()
+ endfunction()
+
+ if (IcoTool_FOUND)
+ list(APPEND icotool_args "-c" "-o" "${_outfilename}.ico")
+
+ # According to https://stackoverflow.com/a/40851713/2886832
+ # Windows always chooses the first icon above 255px, all other ones will be ignored
+ set(maxSize 0)
+ foreach(size 256 512 1024)
+ if(icons_at_${size}px)
+ set(maxSize "${size}")
+ endif()
+ endforeach()
+
+ foreach(size 16 32 48 64 128 ${maxSize})
+ if(NOT icons_at_${size}px)
+ continue()
+ endif()
+
+ set(icotool_icon_arg "")
+ if(size STREQUAL "${maxSize}")
+ # maxSize icon needs to be included as raw png
+ list(APPEND icotool_args "-r")
+ endif()
+
+ foreach(icon ${icons_at_${size}px})
+ list(APPEND icotool_args "${icons_at_${size}px}")
+ endforeach()
+ endforeach()
+
+ create_windows_icon_and_rc(IcoTool::IcoTool "${icotool_args}" "${windows_icons_modern}")
set(${appsources} "${${appsources}};${_outfilename}.rc" PARENT_SCOPE)
+
+ # standard png2ico has no rcfile argument
+ elseif(Png2Ico_FOUND AND NOT Png2Ico_HAS_RCFILE_ARGUMENT AND windows_icons_classic)
+ set(png2ico_args)
+ list(APPEND png2ico_args "${_outfilename}.ico")
+ list(APPEND png2ico_args "${windows_icons_classic}")
+
+ create_windows_icon_and_rc(Png2Ico::Png2Ico "${png2ico_args}" "${windows_icons_classic}")
+ set(${appsources} "${${appsources}};${_outfilename}.rc" PARENT_SCOPE)
+
+ # png2ico from kdewin provides rcfile argument
+ elseif(Png2Ico_FOUND AND windows_icons_classic)
+ add_custom_command(
+ OUTPUT "${_outfilename}.rc" "${_outfilename}.ico"
+ COMMAND Png2Ico::Png2Ico
+ ARGS
+ --rcfile "${_outfilename}.rc"
+ "${_outfilename}.ico"
+ ${windows_icons_classic}
+ DEPENDS ${windows_icons_classic}
+ WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+ )
+
+ set(${appsources} "${${appsources}};${_outfilename}.rc" PARENT_SCOPE)
+ # else none of the supported tools was found
else()
- message(WARNING "Unable to find the png2ico utility - application will not have an application icon!")
+ message(WARNING "Unable to find the png2ico or icotool utilities or icons in matching sizes - application will not have an application icon!")
endif()
elseif (APPLE AND mac_icons)
# first generate .iconset directory structure, then convert to .icns format using the Mac OS X "iconutil" utility,
@@ -247,6 +298,9 @@ function(ecm_add_app_icon appsources)
list(APPEND iconset_icons
"${_outfilename}.iconset/${type}_${sizename}.png")
endmacro()
+
+ # List of supported sizes and filenames taken from:
+ # https://developer.apple.com/library/content/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Optimizing/Optimizing.html#//apple_ref/doc/uid/TP40012302-CH7-SW4
foreach(size 16 32 128 256 512)
math(EXPR double_size "2 * ${size}")
foreach(file ${icons_at_${size}px})
@@ -257,14 +311,25 @@ function(ecm_add_app_icon appsources)
endforeach()
endforeach()
- foreach(size 16 18 32)
- math(EXPR double_size "2 * ${size}")
- foreach(file ${sidebar_icons_at_${size}px})
- copy_icon("${file}" "${size}x${size}" "sidebar")
- endforeach()
- foreach(file ${sidebar_icons_at_${double_size}px})
- copy_icon("${file}" "${size}x${size}@2x" "sidebar")
- endforeach()
+ # List of supported sizes and filenames taken from:
+ # https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/Finder.html#//apple_ref/doc/uid/TP40014214-CH15-SW15
+ foreach(file ${sidebar_icons_at_16px})
+ copy_icon("${file}" "16x16" "sidebar")
+ endforeach()
+ foreach(file ${sidebar_icons_at_32px})
+ copy_icon("${file}" "16x16@2x" "sidebar")
+ endforeach()
+ foreach(file ${sidebar_icons_at_32px})
+ copy_icon("${file}" "18x18" "sidebar")
+ endforeach()
+ foreach(file ${sidebar_icons_at_64px})
+ copy_icon("${file}" "18x18@2x" "sidebar")
+ endforeach()
+ foreach(file ${sidebar_icons_at_128px})
+ copy_icon("${file}" "32x32" "sidebar")
+ endforeach()
+ foreach(file ${sidebar_icons_at_256px})
+ copy_icon("${file}" "32x32@2x" "sidebar")
endforeach()
# generate .icns icon file
diff --git a/cmake/modules/FindIcoTool.cmake b/cmake/modules/FindIcoTool.cmake
new file mode 100644
index 000000000..3b3511eb3
--- /dev/null
+++ b/cmake/modules/FindIcoTool.cmake
@@ -0,0 +1,27 @@
+# Copyright 2017 Vincent Pinon <vpinon@kde.org>
+include(${CMAKE_CURRENT_LIST_DIR}/ECMFindModuleHelpersStub.cmake)
+ecm_find_package_version_check(IcoTool)
+find_program(IcoTool_EXECUTABLE NAMES icotool)
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(IcoTool
+ FOUND_VAR
+ IcoTool_FOUND
+ REQUIRED_VARS
+ IcoTool_EXECUTABLE
+)
+mark_as_advanced(IcoTool_EXECUTABLE)
+
+if (IcoTool_FOUND)
+ if (NOT TARGET IcoTool::IcoTool)
+ add_executable(IcoTool::IcoTool IMPORTED)
+ set_target_properties(IcoTool::IcoTool PROPERTIES
+ IMPORTED_LOCATION "${IcoTool_EXECUTABLE}"
+ )
+ endif()
+endif()
+
+include(FeatureSummary)
+set_package_properties(IcoTool PROPERTIES
+ URL "http://www.nongnu.org/icoutils/"
+ DESCRIPTION "Executable that converts a collection of PNG files into a Windows icon file"
+)
diff --git a/cmake/modules/FindSQLite3.cmake b/cmake/modules/FindSQLite3.cmake
index 2fa9e4100..4fd1ceb53 100644
--- a/cmake/modules/FindSQLite3.cmake
+++ b/cmake/modules/FindSQLite3.cmake
@@ -26,6 +26,7 @@ find_path(SQLITE3_INCLUDE_DIR
sqlite3.h
PATHS
${_SQLITE3_INCLUDEDIR}
+ ${SQLITE3_INCLUDE_DIRS}
)
find_library(SQLITE3_LIBRARY
@@ -33,6 +34,7 @@ find_library(SQLITE3_LIBRARY
sqlite3 sqlite3-0
PATHS
${_SQLITE3_LIBDIR}
+ ${SQLITE3_LIBRARIES}
)
set(SQLITE3_INCLUDE_DIRS
diff --git a/cmake/modules/MacOSXBundleInfo.plist.in b/cmake/modules/MacOSXBundleInfo.plist.in
index 5d8fd0e10..9eb0f2bc5 100644
--- a/cmake/modules/MacOSXBundleInfo.plist.in
+++ b/cmake/modules/MacOSXBundleInfo.plist.in
@@ -11,7 +11,7 @@
<key>CFBundleExecutable</key>
<string>@APPLICATION_EXECUTABLE@</string>
<key>CFBundleIconFile</key>
- <string>ownCloud.icns</string>
+ <string>@APPLICATION_EXECUTABLE@.icns</string>
<key>CFBundleIdentifier</key>
<string>@APPLICATION_REV_DOMAIN@</string>
<key>CFBundleInfoDictionaryVersion</key>
@@ -27,12 +27,47 @@
<key>CFBundleShortVersionString</key>
<string>@MIRALL_VERSION_STRING@</string>
<key>NSHumanReadableCopyright</key>
- <string>(C) 2014-2016 @APPLICATION_VENDOR@</string>
+ <string>(C) 2014-2018 @APPLICATION_VENDOR@</string>
<key>SUShowReleaseNotes</key>
<false/>
- <key>LSMinimumBundleVersion</key>
- <string>10.7.0</string>
<key>SUPublicDSAKeyFile</key>
<string>dsa_pub.pem</string>
+
+<key>UTExportedTypeDeclarations</key>
+<array>
+ <dict>
+ <key>UTTypeIdentifier</key>
+ <string>@APPLICATION_REV_DOMAIN@.VIRTUALFILE</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <string>@APPLICATION_VIRTUALFILE_SUFFIX@</string>
+ <key>public.mime-type</key>
+ <string>application/octet-stream</string>
+ </dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ </array>
+ </dict>
+</array>
+
+<key>CFBundleDocumentTypes</key>
+<array>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>@APPLICATION_EXECUTABLE@ Download Virtual File</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>@APPLICATION_REV_DOMAIN@.VIRTUALFILE</string>
+ </array>
+ </dict>
+</array>
+
+
</dict>
</plist>
diff --git a/cmake/modules/NSIS.template.in b/cmake/modules/NSIS.template.in
index 967eebdf5..0f44ab2b4 100644
--- a/cmake/modules/NSIS.template.in
+++ b/cmake/modules/NSIS.template.in
@@ -7,6 +7,8 @@
!define APPLICATION_CMD_EXECUTABLE "@APPLICATION_EXECUTABLE@cmd.exe"
!define APPLICATION_DOMAIN "@APPLICATION_DOMAIN@"
!define APPLICATION_LICENSE "@APPLICATION_LICENSE@"
+!define APPLICATION_VIRTUALFILE_SUFFIX "@APPLICATION_VIRTUALFILE_SUFFIX@"
+!define APPLICATION_VIRTUALFILE_FILECLASS "@APPLICATION_EXECUTABLE@.@APPLICATION_VIRTUALFILE_SUFFIX@"
!define WIN_SETUP_BITMAP_PATH "@WIN_SETUP_BITMAP_PATH@"
!define CRASHREPORTER_EXECUTABLE "@CRASHREPORTER_EXECUTABLE@"
@@ -100,6 +102,8 @@ ReserveFile "${NSISDIR}\Plugins\InstallOptions.dll"
!include Library.nsh ;Used by the COM registration for shell extensions
!include x64.nsh ;Used to determine the right arch for the shell extensions
+!include ${source_path}/admin/win/nsi/lib/fileassoc.nsh
+
;-----------------------------------------------------------------------------
; Memento selections stored in registry.
;-----------------------------------------------------------------------------
@@ -385,7 +389,7 @@ Section "${APPLICATION_NAME}" SEC_APPLICATION
File "${BUILD_PATH}\bin\${APPLICATION_EXECUTABLE}"
File "${BUILD_PATH}\bin\${APPLICATION_CMD_EXECUTABLE}"
File "${BUILD_PATH}\bin\lib${APPLICATION_SHORTNAME}sync.dll"
- File "${BUILD_PATH}\bin\libocsync.dll"
+ File "${BUILD_PATH}\bin\lib${APPLICATION_SHORTNAME}_csync.dll"
File "${BUILD_PATH}\src\gui\client*.qm"
; Make sure only to copy qt, not qt_help, etc
@@ -403,6 +407,8 @@ Section "${APPLICATION_NAME}" SEC_APPLICATION
File "${IMAGEFORMATS_DLL_PATH}\qgif.dll"
File "${IMAGEFORMATS_DLL_PATH}\qjpeg.dll"
File "${IMAGEFORMATS_DLL_PATH}\qico.dll"
+ File "${IMAGEFORMATS_DLL_PATH}\qsvg.dll"
+ ; PNG is built in Qt
SetOutPath "$INSTDIR\sqldrivers"
File "${SQLITE_DLL_PATH}\qsqlite.dll"
@@ -420,6 +426,7 @@ Section "${APPLICATION_NAME}" SEC_APPLICATION
File "${QT_DLL_PATH}\Qt5Gui.dll"
File "${QT_DLL_PATH}\Qt5Network.dll"
File "${QT_DLL_PATH}\Qt5PrintSupport.dll"
+ File "${QT_DLL_PATH}\Qt5Svg.dll"
File "${QT_DLL_PATH}\Qt5Qml.dll"
File "${QT_DLL_PATH}\Qt5Sql.dll"
File "${QT_DLL_PATH}\Qt5WebKit.dll"
@@ -466,6 +473,9 @@ Section "${APPLICATION_NAME}" SEC_APPLICATION
;CSync configs
File "${SOURCE_PATH}/sync-exclude.lst"
+ ;Add file association
+ !insertmacro APP_ASSOCIATE "${APPLICATION_VIRTUALFILE_SUFFIX}" "${APPLICATION_VIRTUALFILE_FILECLASS}" "Virtual File for Remote File" "$INSTDIR\${APPLICATION_EXECUTABLE},0" "Download" "$INSTDIR\${APPLICATION_EXECUTABLE} $\"%1$\""
+
SectionEnd
!ifdef OPTION_SECTION_SC_SHELL_EXT
@@ -643,6 +653,9 @@ Section Uninstall
DeleteRegKey HKCR "${APPLICATION_NAME}"
+ ;Remove file association
+ !insertmacro APP_UNASSOCIATE "${APPLICATION_VIRTUALFILE_SUFFIX}" "${APPLICATION_VIRTUALFILE_FILECLASS}"
+
;Shell extension
!ifdef OPTION_SECTION_SC_SHELL_EXT
!define LIBRARY_COM
diff --git a/cmake/modules/Warnings.cmake b/cmake/modules/Warnings.cmake
index f2c271e88..d4f7c910a 100644
--- a/cmake/modules/Warnings.cmake
+++ b/cmake/modules/Warnings.cmake
@@ -7,10 +7,11 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
# Fix sqlite compilation on macOS
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-incompatible-pointer-types-discards-qualifiers")
- # Fix sqlite compilation on MinGW
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-discarded-qualifiers")
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
+ # Fix sqlite compilation on MinGW
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-discarded-qualifiers")
+
execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
OUTPUT_VARIABLE GCC_VERSION)
if(GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)
diff --git a/config.h.in b/config.h.in
index dfd243a09..68143d943 100644
--- a/config.h.in
+++ b/config.h.in
@@ -18,12 +18,12 @@
#cmakedefine APPLICATION_EXECUTABLE "@APPLICATION_EXECUTABLE@"
#cmakedefine APPLICATION_UPDATE_URL "@APPLICATION_UPDATE_URL@"
#cmakedefine APPLICATION_ICON_NAME "@APPLICATION_ICON_NAME@"
+#cmakedefine APPLICATION_VIRTUALFILE_SUFFIX "@APPLICATION_VIRTUALFILE_SUFFIX@"
+#define APPLICATION_DOTVIRTUALFILE_SUFFIX "." APPLICATION_VIRTUALFILE_SUFFIX
#cmakedefine ZLIB_FOUND @ZLIB_FOUND@
#cmakedefine SYSCONFDIR "@SYSCONFDIR@"
#cmakedefine SHAREDIR "@SHAREDIR@"
-#cmakedefine WITH_TESTING 1
-
#endif
diff --git a/doc/.gitignore b/doc/.gitignore
new file mode 100644
index 000000000..b075b4a99
--- /dev/null
+++ b/doc/.gitignore
@@ -0,0 +1,2 @@
+conf.py
+Makefile \ No newline at end of file
diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt
index 762a42830..cd305d903 100644
--- a/doc/CMakeLists.txt
+++ b/doc/CMakeLists.txt
@@ -24,7 +24,7 @@ if(SPHINX_FOUND)
add_custom_target(doc DEPENDS doc-html COMMENT "Building documentation...")
endif(WITH_DOC)
- if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/ocdoc/_shared_assets")
+ if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/docs-themes")
add_dependencies(doc doc-html-org)
add_dependencies(doc doc-html-com)
endif()
@@ -90,4 +90,4 @@ if(SPHINX_FOUND)
${SPHINX_HTMLHELP_DIR} )
add_custom_target( doc-chm pushd ${SPHINX_HTMLHELP_DIR}; ${MSHTML_COMPILER} *.hhp; popd
DEPENDS doc-chm-sphinx )
-endif(SPHINX_FOUND) \ No newline at end of file
+endif(SPHINX_FOUND)
diff --git a/doc/Makefile b/doc/Makefile
deleted file mode 100644
index 04196f9b9..000000000
--- a/doc/Makefile
+++ /dev/null
@@ -1,174 +0,0 @@
-
-# Makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line.
-SPHINXOPTS =
-SPHINXBUILD = sphinx-build
-PAPER =
-BUILDDIR = _build
-
-# Internal variables.
-PAPEROPT_a4 = -D latex_paper_size=a4
-PAPEROPT_letter = -D latex_paper_size=letter
-ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-# the i18n builder cannot share the environment and doctrees with the others
-I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-
-.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
-
-help:
- @echo "Please use \`make <target>' where <target> is one of"
- @echo " html to make standalone HTML files"
- @echo " dirhtml to make HTML files named index.html in directories"
- @echo " singlehtml to make a single large HTML file"
- @echo " pickle to make pickle files"
- @echo " json to make JSON files"
- @echo " htmlhelp to make HTML files and a HTML help project"
- @echo " qthelp to make HTML files and a qthelp project"
- @echo " devhelp to make HTML files and a Devhelp project"
- @echo " epub to make an epub"
- @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
- @echo " latexpdf to make LaTeX files and run them through pdflatex"
- @echo " pdf to make PDF files"
- @echo " text to make text files"
- @echo " man to make manual pages"
- @echo " texinfo to make Texinfo files"
- @echo " info to make Texinfo files and run them through makeinfo"
- @echo " gettext to make PO message catalogs"
- @echo " changes to make an overview of all changed/added/deprecated items"
- @echo " linkcheck to check all external links for integrity"
- @echo " doctest to run all doctests embedded in the documentation (if enabled)"
-
-clean:
- -rm -rf $(BUILDDIR)/*
-
-html: html-org
-
-html-all: html-release html-org html-com
-
-html-release:
- $(SPHINXBUILD) -b html -D html_theme='owncloud_release' $(ALLSPHINXOPTS) $(BUILDDIR)/html/release
- @echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/html/release."
-
-html-org:
- $(SPHINXBUILD) -b html -D html_theme='owncloud_org' $(ALLSPHINXOPTS) $(BUILDDIR)/html/org
- @echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/html/org."
-
-html-com:
- $(SPHINXBUILD) -b html -D html_theme='owncloud_com' $(ALLSPHINXOPTS) $(BUILDDIR)/html/com
- @echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/html/com."
-
-dirhtml:
- $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
- @echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
-
-singlehtml:
- $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
- @echo
- @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
-
-pickle:
- $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
- @echo
- @echo "Build finished; now you can process the pickle files."
-
-json:
- $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
- @echo
- @echo "Build finished; now you can process the JSON files."
-
-htmlhelp:
- $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
- @echo
- @echo "Build finished; now you can run HTML Help Workshop with the" \
- ".hhp project file in $(BUILDDIR)/htmlhelp."
-
-qthelp:
- $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
- @echo
- @echo "Build finished; now you can run "qcollectiongenerator" with the" \
- ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
- @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/OwncloudDocumentation.qhcp"
- @echo "To view the help file:"
- @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/OwncloudDocumentation.qhc"
-
-devhelp:
- $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
- @echo
- @echo "Build finished."
- @echo "To view the help file:"
- @echo "# mkdir -p $$HOME/.local/share/devhelp/OwncloudDocumentation"
- @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/OwncloudDocumentation"
- @echo "# devhelp"
-
-epub:
- $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
- @echo
- @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
-
-latex:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo
- @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
- @echo "Run \`make' in that directory to run these through (pdf)latex" \
- "(use \`make latexpdf' here to do that automatically)."
-
-latexpdf:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo "Running LaTeX files through pdflatex..."
- $(MAKE) -C $(BUILDDIR)/latex all-pdf
- @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-pdf:
- $(SPHINXBUILD) -b pdf $(ALLSPHINXOPTS) $(BUILDDIR)/pdf
- @echo
- @echo "build finished. the text files are in $(BUILDDIR)/pdf."
-
-text:
- $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
- @echo
- @echo "build finished. the text files are in $(BUILDDIR)/text."
-
-man:
- $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
- @echo
- @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
-
-texinfo:
- $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
- @echo
- @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
- @echo "Run \`make' in that directory to run these through makeinfo" \
- "(use \`make info' here to do that automatically)."
-
-info:
- $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
- @echo "Running Texinfo files through makeinfo..."
- make -C $(BUILDDIR)/texinfo info
- @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
-
-gettext:
- $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
- @echo
- @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
-
-changes:
- $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
- @echo
- @echo "The overview file is in $(BUILDDIR)/changes."
-
-linkcheck:
- $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
- @echo
- @echo "Link check complete; look for any errors in the above output " \
- "or in $(BUILDDIR)/linkcheck/output.txt."
-
-doctest:
- $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
- @echo "Testing of doctests in the sources finished, look at the " \
- "results in $(BUILDDIR)/doctest/output.txt."
diff --git a/doc/architecture.rst b/doc/architecture.rst
index 9229ced33..d7bb156cc 100644
--- a/doc/architecture.rst
+++ b/doc/architecture.rst
@@ -138,8 +138,8 @@ under the original file name.
Example: Assume there is a conflict in message.txt because its contents have
changed both locally and remotely since the last sync run. The local file with
-the local changes will be renamed to message_conflict-20160101-153110.txt and
-the remote file will be downloaded and saved as message.txt.
+the local changes will be renamed to "message (conflicted copy 2016-01-01 153110).txt"
+and the remote file will be downloaded and saved as message.txt.
Conflict files are always created on the client and never on the server.
@@ -276,9 +276,15 @@ Some system wide file patterns that are used to exclude or ignore files are incl
By default, the ownCloud Client ignores the following files:
-* Files matched by one of the patterns defined in the Ignored Files Editor
-* Files containing characters that do not work on certain file systems ``(`\, /, :, ?, *, ", >, <, |`)``.
-* Files starting with ``._sync_xxxxxxx.db`` and the old format ``.csync_journal.db``, as these files are reserved for journalling.
+* Files matched by one of the patterns defined in the Ignored Files Editor.
+* Files starting with ``._sync_*.db*``, ``.sync_*.db*``, ``.csync_journal.db*``, ``.owncloudsync.log*``, as these files are reserved for journalling.
+* Files with a name longer than 254 characters.
+* The file ``Desktop.ini`` in the root of a synced folder.
+* Files matching the pattern ``*_conflict-*`` unless conflict file uploading is enabled.
+* Files matching the pattern ``*(conflicted copy*`` unless conflict file uploading is enabled.
+* Windows only: Files containing characters that do not work on typical Windows filesystems ``(`\, /, :, ?, *, ", >, <, |`)``.
+* Windows only: Files with a trailing space or dot.
+* Windows only: Filenames that are reserved on Windows.
If a pattern selected using a checkbox in the `ignoredFilesEditor-label` (or if
a line in the exclude file starts with the character ``]`` directly followed by
diff --git a/doc/building.rst b/doc/building.rst
index 5207b45f7..2c727946e 100644
--- a/doc/building.rst
+++ b/doc/building.rst
@@ -13,6 +13,14 @@ desktop client.
These instructions are updated to work with version |version| of the ownCloud Client.
+
+Compiling via ownBrander
+------------------------
+
+If you don't want to go through the trouble of doing all the compile work manually,
+you can use `ownBrander`_ to create installer images for all platforms.
+
+
Getting Source Code
-------------------
@@ -25,6 +33,9 @@ packages.
Linux
-----
+For the published desktop clients we link against qt5 dependencies from our ouwn repositories, os that we can have the same versions on all distributions. This chapter shows you how to build the client yourself with this setup.
+If you want to use the qt5 dependencies from your system, see the next chapter.
+
You may wish to use source packages for your Linux distribution, as these give
you the exact sources from which the binary packages are built. These are
hosted on the `ownCloud repository from OBS`_. Go to the `Index of
@@ -33,26 +44,34 @@ repositories`_ to see all the Linux client repos.
1. The source RPMs for CentOS, RHEL, Fedora, SLES, and openSUSE are at the `bottom of the page for each distribution
<https://software.opensuse.org/download/package?project=isv:ownCloud:desktop&
package=owncloud-client>`
- the sources for DEB and Ubuntu based distributions are at e.g. http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/Ubuntu_16.04/
+ the sources for DEB and Ubuntu based distributions are at e.g. http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/Ubuntu_18.04/
To get the .deb source packages add the source
- repo for your Debian or Ubuntu version, like this example for Debian 8
+ repo for your Debian or Ubuntu version, like this example for Debian 9
(run as root)::
echo 'deb-src
- http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/Debian_8.0/ /' >> /etc/apt/sources.list.d/owncloud-client.list
+ http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/Debian_9.0/ /' >> /etc/apt/sources.list.d/owncloud-client.list
2. Install the dependencies using the following commands for your specific Linux
distribution. Make sure the repositories for source packages are enabled.
- * Debian/Ubuntu: ``apt-get update; apt-get build-dep owncloud-client``
+ * Debian/Ubuntu: ``apt update; apt build-dep owncloud-client``
* openSUSE/SLES: ``zypper ref; zypper si -d owncloud-client``
* Fedora/CentOS/RHEL: ``yum install yum-utils; yum-builddep owncloud-client``
3. Follow the :ref:`generic-build-instructions`, starting with step 2.
-Mac OS X
---------
+Linux with system dependencies
+------------------------------
+1. Build sources from e.g. a github checkout with dependencies provided by your linux distribution. While this allows more freedom for development, it does not exactly represent what we ship as packages. See above for how to recreate packages from source.
+
+ * Debian/Ubuntu: ``apt install qtdeclarative5-dev libinotifytools-dev qt5keychain-dev libqt5webkit5-dev python-sphinx libsqlite3-dev``
+
+2. Follow the :ref:`generic-build-instructions`, starting with step 1.
+
+macOS
+-----
In addition to needing XCode (along with the command line tools), developing in
the Mac OS X environment requires extra dependencies. You can install these
@@ -77,29 +96,23 @@ To set up your build environment for development using HomeBrew_:
brew tap owncloud/owncloud
-5. Install a Qt5 version with qtwebkit support::
+5. Install a Qt5 version, ideally from from 5.10.1::
- brew install qt5 --with-qtwebkit
+ brew install qt5
6. Install any missing dependencies::
brew install $(brew deps owncloud-client)
-7. Add Qt from brew to the path::
-
- export PATH=/usr/local/Cellar/qt5/5.x.y/bin:$PATH
+7. Install qtkeychain from here: git clone https://github.com/frankosterfeld/qtkeychain.git
+ make sure you make the same install prefix as later while building the client e.g.
+ ``-DCMAKE_INSTALL_PREFIX=/Path/to/client/../install``
- Where ``x.y`` is the current version of Qt 5 that brew has installed
- on your machine.
-8. Install qtkeychain from here: git clone https://github.com/frankosterfeld/qtkeychain.git
- make sure you make the same install prefix as later while building the client e.g. -
- ``DCMAKE_INSTALL_PREFIX=/Path/to/client-install``
+8. For compilation of the client, follow the :ref:`generic-build-instructions`.
-9. For compilation of the client, follow the :ref:`generic-build-instructions`.
+9. Install the Packages_ package creation tool.
-10. Install the Packages_ package creation tool.
-
-11. In the build directory, run ``admin/osx/create_mac.sh <build_dir> <install_dir>``.
+10. In the build directory, run ``admin/osx/create_mac.sh <CMAKE_INSTALL_DIR> <build dir> <installer sign identity>``.
If you have a developer signing certificate, you can specify
its Common Name as a third parameter (use quotes) to have the package
signed automatically.
@@ -152,7 +165,7 @@ follow `Windows Installer Build (Cross-Compile)`_ instead.
7. Build the client::
- cmake -G "MinGW Makefiles" ../client
+ cmake -G "MinGW Makefiles" -DNO_SHIBBOLETH=1 ../client
mingw32-make
.. note:: You can try using ninja to build in parallel using
@@ -220,16 +233,14 @@ In order to make setup simple, you can use the provided Dockerfile to build your
Generic Build Instructions
--------------------------
-Compared to previous versions, building the desktop sync client has become easier. Unlike
-earlier versions, CSync, which is the sync engine library of the client, is now
-part of the client source repository and not a separate module.
-
To build the most up-to-date version of the client:
1. Clone the latest versions of the client from Git_ as follows::
git clone git://github.com/owncloud/client.git
cd client
+ # master this default, but you can also check out a tag like v2.4.1
+ git checkout master
git submodule init
git submodule update
@@ -240,19 +251,20 @@ To build the most up-to-date version of the client:
3. Configure the client build::
- cmake -DCMAKE_BUILD_TYPE="Debug" ..
-
- .. note:: You must use absolute paths for the ``include`` and ``library``
- directories.
+ cmake -DCMAKE_PREFIX_PATH=/opt/ownCloud/qt-5.10.1 -DCMAKE_INSTALL_PREFIX=/Users/path/to/client/../install/ -DNO_SHIBBOLETH=1 ..
+
+.. note:: For Linux builds (using QT5 libraries via build-dep) a typical setting is ``-DCMAKE_PREFIX_PATH=/opt/ownCloud/qt-5.10.1/`` - version number may vary. For Linux builds using system dependencies -DCMAKE_PREFIX_PATH is not needed.
+
+.. note:: You must use absolute paths for the ``include`` and ``library``
+ directories.
+
+.. note:: On Mac OS X, you need to specify ``-DCMAKE_INSTALL_PREFIX=target``,
+ where ``target`` is a private location, i.e. in parallel to your build
+ dir by specifying ``../install``.
+
+.. note:: qtkeychain must be compiled with the same prefix e.g ``-DCMAKE_INSTALL_PREFIX=/Users/path/to/client/../install/``
+
- .. note:: On Mac OS X, you need to specify ``-DCMAKE_INSTALL_PREFIX=target``,
- where ``target`` is a private location, i.e. in parallel to your build
- dir by specifying ``../install``.
-
- .. note:: qtkeychain must be compiled with the same prefix e.g ``CMAKE_INSTALL_PREFIX=/Users/path/to/client/install/ .``
-
- .. note:: Example:: ``cmake -DCMAKE_PREFIX_PATH=/usr/local/opt/qt5 -DCMAKE_INSTALL_PREFIX=/Users/path/to/client/install/ -DNO_SHIBBOLETH=1``
-
4. Call ``make``.
The owncloud binary will appear in the ``bin`` directory.
@@ -264,11 +276,10 @@ The following are known cmake parameters:
* ``QTKEYCHAIN_LIBRARY=/path/to/qtkeychain.dylib -DQTKEYCHAIN_INCLUDE_DIR=/path/to/qtkeychain/``:
Used for stored credentials. When compiling with Qt5, the library is called ``qt5keychain.dylib.``
- You need to compile QtKeychain with the same Qt version.
+ You need to compile QtKeychain with the same Qt version. If you install QtKeychain into the CMAKE_PREFIX_PATH then you don't need to specify the path manually.
* ``WITH_DOC=TRUE``: Creates doc and manpages through running ``make``; also adds install statements,
providing the ability to install using ``make install``.
-* ``CMAKE_PREFIX_PATH=/path/to/Qt5.2.0/5.2.0/yourarch/lib/cmake/``: Builds using Qt5.
-* ``BUILD_WITH_QT4=ON``: Builds using Qt4 (even if Qt5 is found).
+* ``CMAKE_PREFIX_PATH=/path/to/Qt5.10.1/5.10.1/yourarch/lib/cmake/``: Builds using that Qt version.
* ``CMAKE_INSTALL_PREFIX=path``: Set an install prefix. This is mandatory on Mac OS
.. _ownCloud repository from OBS: http://software.opensuse.org/download/package?
@@ -285,3 +296,4 @@ The following are known cmake parameters:
.. _QtKeychain: https://github.com/frankosterfeld/qtkeychain
.. _Packages: http://s.sudre.free.fr/Software/Packages/about.html
.. _Index of repositories: http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/
+.. _ownBrander: https://doc.owncloud.org/branded_clients/
diff --git a/doc/conf.py b/doc/conf.py
deleted file mode 100644
index ce5bf4279..000000000
--- a/doc/conf.py
+++ /dev/null
@@ -1,292 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# ownCloud Documentation documentation build configuration file, created by
-# sphinx-quickstart on Mon Oct 22 23:16:40 2012.
-#
-# This file is execfile()d with the current directory set to its containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-import sys, os
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#sys.path.insert(0, os.path.abspath('.'))
-
-# -- General configuration -----------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-#needs_sphinx = '1.0'
-
-# Add any Sphinx extension module names here, as strings. They can be extensions
-# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
-extensions = ['sphinx.ext.todo']
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['@CMAKE_CURRENT_SOURCE_DIR@/ocdoc/_shared_assets/templates']
-
-# The suffix of source filenames.
-source_suffix = '.rst'
-
-# The encoding of source files.
-#source_encoding = 'utf-8-sig'
-
-# The master toctree document.
-master_doc = 'index'
-
-# General information about the project.
-project = u'ownCloud Client Manual'
-copyright = u'2013-2016, The ownCloud developers'
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
-version = '2.4.0'
-# The full version, including alpha/beta/rc tags.
-release = '2.4.0'
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#language = None
-
-# There are two options for replacing |today|: either, you set today to some
-# non-false value, then it is used:
-#today = ''
-# Else, today_fmt is used as the format for a strftime call.
-#today_fmt = '%B %d, %Y'
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-exclude_patterns = ['_build','scripts/*']
-
-# The reST default role (used for this markup: `text`) to use for all documents.
-#default_role = None
-
-# If true, '()' will be appended to :func: etc. cross-reference text.
-#add_function_parentheses = True
-2
-# If true, the current module name will be prepended to all description
-# unit titles (such as .. function::).
-#add_module_names = True
-
-# If true, sectionauthor and moduleauthor directives will be shown in the
-# output. They are ignored by default.
-#show_authors = False
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
-
-# A list of ignored prefixes for module index sorting.
-#modindex_common_prefix = []
-
-
-# -- Options for HTML output ---------------------------------------------------
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further. For a list of options available for each theme, see the
-# documentation.
-#html_theme_options = {}
-
-# Add any paths that contain custom themes here, relative to this directory.
-html_theme_path = ['@CMAKE_CURRENT_SOURCE_DIR@/ocdoc/_shared_assets/themes']
-
-# The theme to use for HTML and HTML Help pages. See the documentation for
-# a list of builtin themes.
-#html_theme = 'bootstrap'
-html_theme = 'default'
-# The name for this set of Sphinx documents. If None, it defaults to
-# "<project> v<release> documentation".
-#html_title = None
-
-# A shorter title for the navigation bar. Default is the same as html_title.
-html_short_title = "Client Manual"
-
-# The name of an image file (relative to this directory) to place at the top
-# of the sidebar.
-#html_logo = None
-
-# The name of an image file (within the static path) to use as favicon of the
-# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
-# pixels large.
-#html_favicon = None
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['@CMAKE_CURRENT_SOURCE_DIR@/ocdoc/_shared_assets/static']
-
-# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
-# using the given strftime format.
-html_last_updated_fmt = '%b %d, %Y'
-
-# If true, SmartyPants will be used to convert quotes and dashes to
-# typographically correct entities.
-#html_use_smartypants = True
-
-# Custom sidebar templates, maps document names to template names.
-#html_sidebars = {}
-
-# Additional templates that should be rendered to pages, maps page names to
-# template names.
-#html_additional_pages = {}
-
-# If false, no module index is generated.
-#html_domain_indices = True
-
-# If false, no index is generated.
-#html_use_index = True
-
-# If true, the index is split into individual pages for each letter.
-#html_split_index = False
-
-# If true, links to the reST sources are added to the pages.
-#html_show_sourcelink = True
-
-# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
-html_show_sphinx = False
-
-# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
-#html_show_copyright = True
-
-# If true, an OpenSearch description file will be output, and all pages will
-# contain a <link> tag referring to it. The value of this option must be the
-# base URL from which the finished HTML is served.
-#html_use_opensearch = ''
-
-# This is the file name suffix for HTML files (e.g. ".xhtml").
-#html_file_suffix = None
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = 'ownCloudClientManual'
-
-
-# -- Options for LaTeX output --------------------------------------------------
-
-latex_elements = {
-# The paper size ('letterpaper' or 'a4paper').
-#'papersize': 'letterpaper',
-
-# The font size ('10pt', '11pt' or '12pt').
-#'pointsize': '10pt',
-
-# Additional stuff for the LaTeX preamble.
-#'preamble': '',
-}
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title, author, documentclass [howto/manual]).
-latex_documents = [
- ('index', 'ownCloudClientManual.tex', u'ownCloud Client Manual',
- u'The ownCloud developers', 'manual'),
-]
-
-# The name of an image file (relative to this directory) to place at the top of
-# the title page.
-latex_logo = 'logo-blue.pdf'
-
-# For "manual" documents, if this is true, then toplevel headings are parts,
-# not chapters.
-#latex_use_parts = False
-
-# If true, show page references after internal links.
-#latex_show_pagerefs = False
-
-# If true, show URL addresses after external links.
-#latex_show_urls = False
-
-# Documents to append as an appendix to all manuals.
-#latex_appendices = []
-
-# If false, no module index is generated.
-#latex_domain_indices = True
-
-
-# -- Options for manual page output --------------------------------------------
-
-# One entry per manual page. List of tuples
-# (source start file, name, description, authors, manual section).
-man_pages = [
- ('owncloud.1', 'owncloud', u'File synchronisation desktop utility.',
- [u'The ownCloud developers'], 1),
- ('owncloudcmd.1', 'owncloudcmd', u'Command line ownCloud client tool.',
- [u'The ownCloud developers'], 1),
-]
-
-# If true, show URL addresses after external links.
-man_show_urls = True
-
-
-# -- Options for Texinfo output ------------------------------------------------
-
-# Grouping the document tree into Texinfo files. List of tuples
-# (source start file, target name, title, author,
-# dir menu entry, description, category)
-texinfo_documents = [
- ('index', 'ownCloudClientManual', u'ownCloud Client Manual',
- u'The ownCloud developers', 'ownCloud', 'The ownCloud Client Manual.',
- 'Miscellaneous'),
-]
-
-# Documents to append as an appendix to all manuals.
-#texinfo_appendices = []
-
-# If false, no module index is generated.
-#texinfo_domain_indices = True
-
-# How to display URL addresses: 'footnote', 'no', or 'inline'.
-#texinfo_show_urls = 'footnote'
-
-
-# -- Options for Epub output ---------------------------------------------------
-
-# Bibliographic Dublin Core info.
-epub_title = u'ownCloud Client Manual'
-epub_author = u'The ownCloud developers'
-epub_publisher = u'The ownCloud developers'
-epub_copyright = u'2013-2016, The ownCloud developers'
-
-# The language of the text. It defaults to the language option
-# or en if the language is not set.
-#epub_language = ''
-
-# The scheme of the identifier. Typical schemes are ISBN or URL.
-#epub_scheme = ''
-
-# The unique identifier of the text. This can be a ISBN number
-# or the project homepage.
-#epub_identifier = ''
-
-# A unique identification for the text.
-#epub_uid = ''
-
-# A tuple containing the cover image and cover page html template filenames.
-#epub_cover = ()
-
-# HTML files that should be inserted before the pages created by sphinx.
-# The format is a list of tuples containing the path and title.
-#epub_pre_files = []
-
-# HTML files shat should be inserted after the pages created by sphinx.
-# The format is a list of tuples containing the path and title.
-#epub_post_files = []
-
-# A list of files that should not be packed into the epub file.
-#epub_exclude_files = []
-
-# The depth of the table of contents in toc.ncx.
-#epub_tocdepth = 3
-
-# Allow duplicate toc entries.
-#epub_tocdup = True
-
-# Include todos?
-todo_include_todos = True
-
-rst_epilog = '.. |version| replace:: %s' % version
diff --git a/doc/conf.py.in b/doc/conf.py.in
index f4062ada4..9a7ff47e2 100644
--- a/doc/conf.py.in
+++ b/doc/conf.py.in
@@ -12,6 +12,7 @@
# serve to show the default.
import sys, os
+from datetime import datetime
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
@@ -28,7 +29,7 @@ import sys, os
extensions = ['sphinx.ext.todo']
# Add any paths that contain templates here, relative to this directory.
-templates_path = ['@CMAKE_CURRENT_SOURCE_DIR@/ocdoc/_shared_assets/templates']
+templates_path = ['@CMAKE_CURRENT_SOURCE_DIR@/docs-themes/templates']
# The suffix of source filenames.
source_suffix = '.rst'
@@ -41,7 +42,7 @@ master_doc = 'index'
# General information about the project.
project = u'ownCloud Client Manual'
-copyright = u'2013-2016, The ownCloud developers'
+copyright = u'2013-{:%Y}, The ownCloud developers'.format(datetime.now())
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
@@ -95,7 +96,7 @@ pygments_style = 'sphinx'
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
-html_theme_path = ['@CMAKE_CURRENT_SOURCE_DIR@/ocdoc/_shared_assets/themes']
+html_theme_path = ['@CMAKE_CURRENT_SOURCE_DIR@/docs-themes/themes']
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
@@ -120,7 +121,7 @@ html_short_title = "Client Manual"
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['@CMAKE_CURRENT_SOURCE_DIR@/ocdoc/_shared_assets/static']
+html_static_path = ['@CMAKE_CURRENT_SOURCE_DIR@/docs-themes/static']
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
@@ -250,7 +251,7 @@ texinfo_documents = [
epub_title = u'ownCloud Client Manual'
epub_author = u'The ownCloud developers'
epub_publisher = u'The ownCloud developers'
-epub_copyright = u'2013-2016, The ownCloud developers'
+epub_copyright = u'2013-{:%Y}, The ownCloud developers'.format(datetime.now())
# The language of the text. It defaults to the language option
# or en if the language is not set.
diff --git a/doc/conffile.rst b/doc/conffile.rst
index 8cef1d272..468ab68c2 100644
--- a/doc/conffile.rst
+++ b/doc/conffile.rst
@@ -49,6 +49,10 @@ Some interesting values that can be set on the configuration file are:
| ``moveToTrash`` | ``false`` | If non-locally deleted files should be moved to trash instead of deleting them completely. |
| | | This option only works on linux |
+---------------------------------+---------------+--------------------------------------------------------------------------------------------------------+
+| ``showExperimentalOptions`` | ``false`` | Whether to show experimental options that are still undergoing testing in the user interface. |
+| | | Turning this on does not enable experimental behavior on its own. It does enable user inferface |
+| | | options that can be used to opt in to experimental features. |
++---------------------------------+---------------+--------------------------------------------------------------------------------------------------------+
+----------------------------------------------------------------------------------------------------------------------------------------------------------+
diff --git a/doc/conflicts.rst b/doc/conflicts.rst
new file mode 100644
index 000000000..b74be6ec1
--- /dev/null
+++ b/doc/conflicts.rst
@@ -0,0 +1,61 @@
+=========
+Conflicts
+=========
+
+.. index:: conflicts
+
+Overview
+--------
+
+The ownCloud desktop client uploads local changes and downloads remote changes.
+When a file has changed on the local side and on the remote between synchronization
+runs the client will be unable to resolve the situation on its own. It will
+create a conflict file with the local version, download the remote version and
+notify the user that a conflict occured which needs attention.
+
+Example
+-------
+
+Imagine there is a file called ``mydata.txt`` your synchronized folder. It has
+not changed for a while and contains the text "contents" locally and remotely.
+Now, nearly at the same time you update it locally to say "local contents" while
+the file on the server gets updated to contain "remote contents" by someone else.
+
+When attempting to upload your local changes the desktop client will notice that
+the server version has also changed. It creates a conflict and you will now have
+two files on your local machine:
+
+- ``mydata.txt`` containing "remote contents"
+- ``mydata (conflicted copy 2018-04-10 093612).txt`` containing "local contents"
+
+In this situation the file ``mydata.txt`` has the remote changes (and will continue
+to be updated with further remote changes when they happen), but your local
+adjustments have not been sent to the server (unless the server enables conflict
+uploading, see below).
+
+The desktop client notifies you of this situation via system notifications, the
+system tray icon and a yellow "unresolved conflicts" badge in the account settings
+window. Clicking this badge shows a list that includes the unresolved conflicts
+and clicking one of them opens an explorer window pointing at the relevant file.
+
+To resolve this conflict, open both files, compare the differences and copy your
+local changes from the "conflicted copy" file into the base file where applicable.
+In this example you might change ``mydata.txt`` to say "local and remote contents"
+and delete the file with "conflicted copy" in its name. With that, the conflict
+is resolved.
+
+Uploading conflicts (experimental)
+----------------------------------
+
+By default the conflict file (the file with "conflicted copy" in its name that
+contains your local conflicting changes) is not uploaded to the server. The idea
+is that you, the author of the changes, are the best person for resolving the
+conflict and showing the conflict to other users might create confusion.
+
+However, in some scenarios it makes a lot of sense to upload these conflicting
+changes such that local work can become visible even if the conflict won't be
+resolved immediately.
+
+In the future there might be a server-wide switch for this behavior. For now it
+can already be tested by setting the environment variable
+``OWNCLOUD_UPLOAD_CONFLICT_FILES=1``.
diff --git a/doc/docs-themes b/doc/docs-themes
new file mode 160000
+Subproject 90bd26b1189de95eb7bf5e023b5f0de3691216d
diff --git a/doc/faq.rst b/doc/faq.rst
index af9582def..5b1a18bf8 100644
--- a/doc/faq.rst
+++ b/doc/faq.rst
@@ -21,6 +21,25 @@ When a deeply nested directory is excluded from synchronization it will be
listed with other ignored files and directories in the "Not synced" tab of
the "Activity" pane.
+There Was A Warning About Changes In Synchronized Folders Not Being Tracked Reliably.
+-------------------------------------------------------------------------------------
+
+On linux when the synchronized folder contains very many subfolders the
+operating system may not allow for enough inotify watches to monitor the
+changes in all of them.
+
+In this case the client will not be able to immediately start the
+synchronization process when a file in one of the unmonitored folders changes.
+Instead, the client will show the warning and manually scan folders for changes
+in a regular interval (two hours by default).
+
+This problem can be solved by setting the fs.inotify.max_user_watches
+sysctl to a higher value. This can usually be done either temporarily::
+
+ echo 524288 > /proc/sys/fs/inotify/max_user_watches
+
+or permanently by adjusting ``/etc/sysctl.conf``.
+
I Want To Move My Local Sync Folder
-----------------------------------
diff --git a/doc/images/client-4.png b/doc/images/client-4.png
deleted file mode 100644
index 6401ab4db..000000000
--- a/doc/images/client-4.png
+++ /dev/null
Binary files differ
diff --git a/doc/images/log_output_window.png b/doc/images/log_output_window.png
index 29aaf9ed5..3d679e156 100644
--- a/doc/images/log_output_window.png
+++ b/doc/images/log_output_window.png
Binary files differ
diff --git a/doc/images/save_log_file.png b/doc/images/save_log_file.png
deleted file mode 100644
index 9f3abee01..000000000
--- a/doc/images/save_log_file.png
+++ /dev/null
Binary files differ
diff --git a/doc/index.rst b/doc/index.rst
index 90fed6132..4bf5dfcd4 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -9,6 +9,7 @@ ownCloud Desktop Client Manual
introduction
installing
navigating
+ conflicts
advancedusage
autoupdate
building
@@ -16,4 +17,4 @@ ownCloud Desktop Client Manual
troubleshooting
faq
glossary
- \ No newline at end of file
+
diff --git a/doc/installing.rst b/doc/installing.rst
index 29aacfebf..75e72bd41 100644
--- a/doc/installing.rst
+++ b/doc/installing.rst
@@ -2,77 +2,203 @@
Installing the Desktop Synchronization Client
=============================================
-You can download the latest version of the ownCloud Desktop Synchronization
-Client from the `ownCloud download page`_.
-There are clients for Linux, Mac OS X, and Microsoft Windows.
+You can download the latest version of the ownCloud Desktop Synchronization Client from the `ownCloud download page`_.
+There are clients for *Linux*, *macOS*, and *Microsoft Windows*.
-Installation on Mac OS X and Windows is the same as for any software
-application: download the program and then double-click it to launch the
-installation, and then follow the installation wizard. After it is installed and
-configured the sync client will automatically keep itself updated; see
-:doc:`autoupdate` for more information.
+Installation on Mac OS X and Windows is the same as for any software application: download the program and then double-click it to launch the installation, and then follow the installation wizard.
+After it is installed and configured the sync client will automatically keep itself updated; see :doc:`autoupdate` for more information.
-Linux users must follow the instructions on the download page to add the
-appropriate repository for their Linux distribution, install the signing key,
-and then use their package managers to install the desktop sync client. Linux
-users will also update their sync clients via package manager, and the client
-will display a notification when an update is available.
+Linux users must follow the instructions on the download page to add the appropriate repository for their Linux distribution, install the signing key, and then use their package managers to install the desktop sync client.
+Linux users will also update their sync clients via package manager, and the client will display a notification when an update is available.
-Linux users must also have a password manager enabled, such as GNOME Keyring or
-KWallet, so that the sync client can login automatically.
+Linux users must also have a password manager enabled, such as `GNOME Keyring`_ or `KWallet`_, so that the sync client can login automatically.
-You will also find links to source code archives and older versions on the
-download page.
+You will also find links to source code archives and older versions on the download page.
System Requirements
-----------------------------------
+-------------------
- Windows 7+
- Mac OS X 10.7+ (**64-bit only**)
- CentOS 6 & 7 (64-bit only)
-- Debian 7.0 & 8.0 & 9.0
-- Fedora 24 & 25 & 26
-- Ubuntu 16.04 & 16.10 & 17.04
-- openSUSE Leap 42.1 & 42.2 & 42.3
+- Debian 8.0 & 9.0
+- Fedora 25 & 26 & 27
+- Ubuntu 16.04 & 17.04 & 17.10
+- openSUSE Leap 42.2 & 42.3
.. note::
- For Linux distributions, we support, if technically feasible, the latest 2 versions per platform and the previous `LTS`_.
+ For Linux distributions, we support, if technically feasible, the latest 2 versions per platform and the previous Ubuntu `LTS`_.
+
+Customizing the Windows installation
+------------------------------------
+
+If you just want to install ownCloud Desktop Synchronization Client on your local system, you can simply launch the .msi file and configure it in the wizard that pops up.
+
+Features
+^^^^^^^^
+
+The MSI installer provides several features that can be installed or removed individually, which you can also control via command-line, if you are automating the installation, then run the following command:
+
+::
+
+ msiexec /passive /i ownCloud-x.y.z.msi
+
+The command will install the ownCloud Desktop Synchronization Client into the default location with the default features enabled.
+If you want to disable, e.g., desktop shortcut icons you can simply change the above command to the following:
+
+::
+
+ msiexec /passive /i ownCloud-x.y.z.msi REMOVE=DesktopShortcut
+
+See the following table for a list of available features:
+
++--------------------+--------------------+----------------------------------+-----------------------------+
+| Feature | Enabled by default | Description |Property to disable |
++====================+====================+==================================+=============================+
+| Client | Yes, required | The actual client | |
++--------------------+--------------------+----------------------------------+-----------------------------+
+| DesktopShortcut | Yes | Adds a shortcut to the desktop |``NO_DESKTOP_SHORTCUT`` |
++--------------------+--------------------+----------------------------------+-----------------------------+
+| StartMenuShortcuts | Yes | Adds shortcuts to the start menu |``NO_START_MENU_SHORTCUTS``|
++--------------------+--------------------+----------------------------------+-----------------------------+
+| ShellExtensions | Yes | Adds Explorer integration |``NO_SHELL_EXTENSIONS`` |
++--------------------+--------------------+----------------------------------+-----------------------------+
+
+Installation
+~~~~~~~~~~~~
+
+You can also choose to only install the client itself by using the following command:
+
+::
+
+ msiexec /passive /i ownCloud-x.y.z.msi ADDDEFAULT=Client
+
+If you for instance want to install everything but the ``DesktopShortcut`` and the ``ShellExtensions`` feature, you have two possibilities:
+
+1. You explicitly name all the features you actually want to install (whitelist) where ``Client`` is always installed anyway:
+
+ ::
+
+ msiexec /passive /i ownCloud-x.y.z.msi ADDDEFAULT=StartMenuShortcuts
+
+2. You pass the ``NO_DESKTOP_SHORTCUT`` and ``NO_SHELL_EXTENSIONS`` properties:
+
+ ::
+
+ msiexec /passive /i ownCloud-x.y.z.msi NO_DESKTOP_SHORTCUT="1" NO_SHELL_EXTENSIONS="1"
+
+.. note:: The ownCloud .msi remembers these properties, so you don't need to specify them on upgrades.
+
+.. note:: You cannot use these to change the installed features, if you want to do that, see the next section.
+
+Changing Installed Features
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+You can change the installed features later by using ``REMOVE`` and ``ADDDEFAULT`` properties.
+
+1. If you want to add the desktop shortcut later, run the following command:
+
+ ::
+
+ msiexec /passive /i ownCloud-x.y.z.msi ADDDEFAULT="DesktopShortcut"
+
+2. If you want to remove it, simply run the following command:
+
+ ::
+
+ msiexec /passive /i ownCloud-x.y.z.msi REMOVE="DesktopShortcut"
+
+Windows keeps track of the installed features and using ``REMOVE`` or ``ADDDEFAULT`` will only affect the mentioned features.
+
+Compare `REMOVE <https://msdn.microsoft.com/en-us/library/windows/desktop/aa371194(v=vs.85).aspx>`_ and `ADDDEFAULT <https://msdn.microsoft.com/en-us/library/windows/desktop/aa367518(v=vs.85).aspx>`_ on the Windows Installer Guide.
+
+.. note:: You cannot specify `REMOVE` on initial installation as it will disable all features.
+
+Installation Folder
+^^^^^^^^^^^^^^^^^^^
+
+You can adjust the installation folder by specifying the ``INSTALLDIR`` property like this
+
+::
+
+ msiexec /passive /i ownCloud-x.y.z.msi INSTALLDIR="C:\Program Files (x86)\Non Standard ownCloud Client Folder"
+
+Be careful when using PowerShell instead of ``cmd.exe``, it can be tricky to get the whitespace escaping right there.
+Specifying the ``INSTALLDIR`` like this only works on first installation, you cannot simply re-invoke the .msi with a different path.
+If you still need to change it, uninstall it first and reinstall it with the new path.
+
+Disabling Automatic Updates
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To disable automatic updates, you can pass the ``SKIPAUTOUPDATE`` property.
+
+::
+
+ msiexec /passive /i ownCloud-x.y.z.msi SKIPAUTOUPDATE="1"
+
+Launch After Installation
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To launch the client automatically after installation, you can pass the ``LAUNCH`` property.
+
+::
+
+ msiexec /i ownCloud-x.y.z.msi LAUNCH="1"
+
+This option also removes the checkbox to let users decide if they want to launch the client for non passive/quiet mode.
+
+.. note:: This option does not have any effect without GUI.
+
+No Reboot After Installation
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The ownCloud Client schedules a reboot after installation to make sure the Explorer extension is correctly (un)loaded.
+If you're taking care of the reboot yourself, you can set the ``REBOOT`` property
+
+::
+
+ msiexec /i ownCloud-x.y.z.msi REBOOT=ReallySuppress
+
+This will make `msiexec` exit with error `ERROR_SUCCESS_REBOOT_REQUIRED` (3010).
+If your deployment tooling interprets this as an actual error and you want to avoid that, you may want to set the ``DO_NOT_SCHEDULE_REBOOT`` instead
+
+::
+
+ msiexec /i ownCloud-x.y.z.msi DO_NOT_SCHEDULE_REBOOT="1"
Installation Wizard
-------------------
-The installation wizard takes you step-by-step through configuration options and
-account setup. First you need to enter the URL of your ownCloud server.
+The installation wizard takes you step-by-step through configuration options and account setup.
+First you need to enter the URL of your ownCloud server.
.. image:: images/client-1.png
:alt: form for entering ownCloud server URL
-
+
Enter your ownCloud login on the next screen.
.. image:: images/client-2.png
:alt: form for entering your ownCloud login
-On the Local Folder Option screen you may sync
-all of your files on the ownCloud server, or select individual folders. The
-default local sync folder is ``ownCloud``, in your home directory. You may
-change this as well.
+On the *"Local Folder Option"* screen you may sync all of your files on the ownCloud server, or select individual folders.
+The default local sync folder is ``ownCloud``, in your home directory.
+You may change this as well.
.. image:: images/client-3.png
- :alt: Select which remote folders to sync, and which local folder to store
+ :alt: Select which remote folders to sync, and which local folder to store
them in.
-
-When you have completed selecting your sync folders, click the Connect button
-at the bottom right. The client will attempt to connect to your ownCloud
-server, and when it is successful you'll see two buttons: one to connect to
-your ownCloud Web GUI, and one to open your local folder. It will also start
-synchronizing your files.
-.. image:: images/client-4.png
- :alt: A successful server connection, showing a button to connect to your
- Web GUI, and one to open your local ownCloud folder
+When you have completed selecting your sync folders, click the *"Connect"* button at the bottom right.
+The client will attempt to connect to your ownCloud server, and when it is successful you'll see two buttons:
+
+- one to connect to your ownCloud Web GUI
+- one to open your local folder
-Click the Finish button, and you're all done.
+It will also start synchronizing your files.
.. Links
-
+
.. _ownCloud download page: https://owncloud.com/download/#desktop-clients
+.. _LTS: https://wiki.ubuntu.com/LTS
+.. _GNOME Keyring: https://wiki.gnome.org/Projects/GnomeKeyring/
+.. _KWallet: https://utils.kde.org/projects/kwalletmanager/
diff --git a/doc/introduction.rst b/doc/introduction.rst
index eb6bfbf56..f509604ad 100644
--- a/doc/introduction.rst
+++ b/doc/introduction.rst
@@ -23,11 +23,3 @@ The |version| release of the ownCloud desktop sync client has many new features
improvements. (See the `complete changelog
<https://owncloud.org/changelog/desktop/>`_.)
- * Show server notifications on the client
- * Improved sync speed
- * Improved handling of Win32 file locks and network files
- * Improved user notifications about ignored files and conflicts
- * Add warnings for old server versions
- * Update of QtKeyChain to support Windows credential store
- * Packaging of dolphin overlay icon module for bleeding edge distributions
-
diff --git a/doc/navigating.rst b/doc/navigating.rst
index 3d119d2eb..ada8b2b20 100644
--- a/doc/navigating.rst
+++ b/doc/navigating.rst
@@ -5,7 +5,7 @@ Using the Synchronization Client
.. index:: navigating, usage
The ownCloud Desktop Client remains in the background and is visible as an icon
-in the system tray (Windows, KDE), status bar (Mac OS X), or notification area
+in the system tray (Windows, KDE), menu bar (macOS), or notification area
(Linux).
.. figure:: images/icon.png
diff --git a/doc/options.rst b/doc/options.rst
index 1aab3d08d..4dfc29156 100644
--- a/doc/options.rst
+++ b/doc/options.rst
@@ -24,7 +24,9 @@ The other options are:
``--logflush``
Clears (flushes) the log file after each write action.
+``--logdebug``
+ Also output debug-level messages in the log (equivalent to setting the env var QT_LOGGING_RULES="qt.*=true;*.debug=true").
+)
+
``--confdir`` `<dirname>`
Uses the specified configuration directory.
-
-
diff --git a/doc/troubleshooting.rst b/doc/troubleshooting.rst
index 860149321..1dc7b77ca 100644
--- a/doc/troubleshooting.rst
+++ b/doc/troubleshooting.rst
@@ -107,14 +107,25 @@ Log Files
Effectively debugging software requires as much relevant information as can be
obtained. To assist the ownCloud support personnel, please try to provide as
-many relevant logs as possible. Log output can help with tracking down
+many relevant logs as possible. Log output can help with tracking down
problems and, if you report a bug, log output can help to resolve an issue more
quickly.
+The client log file is often the most helpful log to provide.
+
Obtaining the Client Log File
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-To obtain the client log file:
+There are several ways to produce log files. The most commonly useful is enabling
+logging to a temporary directory, described first.
+
+Note: Client log files contain file and folder names, metadata, server urls and
+other private information. Only upload them if you are comfortable sharing the
+information. Logs are often essential for tracking down a problem though, so
+please consider providing them to developers privately.
+
+Logging to a Temporary Directory
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1. Open the ownCloud Desktop Client.
@@ -124,37 +135,22 @@ To obtain the client log file:
.. image:: images/log_output_window.png
-3. Click the 'Save' button.
-
- The Save Log File window opens.
+3. Enable the 'Permanently save logs' checkbox.
- .. image:: images/save_log_file.png
+4. Look at its tooltip and take note of the directory the logs will be saved to.
-4. Migrate to a location on your system where you want to save your log file.
+5. Navigate to this directory.
-5. Name the log file and click the 'Save' button.
+6. Select the logs for the timeframe in which the issue occurred.
- The log file is saved in the location specified.
-
-Alternatively, you can launch the ownCloud Log Output window using the
-``--logwindow`` command. After issuing this command, the Log Output window
-opens to show the current log. You can then follow the same procedures
-mentioned above to save the log to a file.
-
- .. note:: You can also open a log window for an already running session, by
- restarting the client using the following command:
-
- * Windows: ``C:\Program Files (x86)\ownCloud\owncloud.exe --logwindow``
- * Mac OS X: ``/Applications/owncloud.app/Contents/MacOS/owncloud --logwindow``
- * Linux: ``owncloud --logwindow``
+Note that the choice to enable logging will be persist across client restarts.
Saving Files Directly
-~~~~~~~~~~~~~~~~~~~~~
+^^^^^^^^^^^^^^^^^^^^^
-The ownCloud client enables you to save log files directly to a predefined file
-or directory. This is a useful option for troubleshooting sporadic issues as
-it enables you to log large amounts of data and bypasses the limited buffer
-settings associated with the log window.
+The ownCloud client allows you to save log files directly to a custom file
+or directory. This is a useful option for easily reproducible problems, as well
+as for cases where you want logs to be saved to a different location.
To save log files to a file or a directory:
@@ -170,6 +166,8 @@ the amount of data that accumulates over time, you can specify the
the client automatically erases saved log data in the directory that is older
than the specified number of hours.
+Adding the ``--logdebug`` flag increases the verbosity of the generated log files.
+
As an example, to define a test where you keep log data for two days, you can
issue the following command:
diff --git a/man/CMakeLists.txt b/man/CMakeLists.txt
index f99b0dee6..86782966b 100644
--- a/man/CMakeLists.txt
+++ b/man/CMakeLists.txt
@@ -7,7 +7,7 @@ if(SPHINX_FOUND)
set(SPHINX_MAN_DIR "${CMAKE_CURRENT_BINARY_DIR}/man1")
install(DIRECTORY ${SPHINX_MAN_DIR} DESTINATION ${CMAKE_INSTALL_MANDIR} OPTIONAL)
add_custom_target( doc-man ${SPHINX_EXECUTABLE}
- -c ${CMAKE_SOURCE_DIR}/doc -b man
+ -c ${CMAKE_BINARY_DIR}/doc -b man
-d ${SPHINX_CACHE_DIR}/man
${CMAKE_CURRENT_SOURCE_DIR}
${SPHINX_MAN_DIR} )
diff --git a/mirall.desktop.in b/mirall.desktop.in
index b7cf6bf30..1def86e01 100644
--- a/mirall.desktop.in
+++ b/mirall.desktop.in
@@ -8,68 +8,7 @@ GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
-# Translations
-
-
-# Translations
-
-
-# Translations
-
-
-# Translations
-
-
-# Translations
-
-
-# Translations
-
-
-# Translations
-
-
-# Translations
-
-
-# Translations
-
-
-# Translations
-
-
-# Translations
-
-
-# Translations
-
-
-# Translations
-
-
-# Translations
-
-
-# Translations
-
-
-# Translations
-
-
-# Translations
-
-
-# Translations
-
-
-# Translations
-
-
-# Translations
-
-
-# Translations
-
+MimeType=application/vnd.@APPLICATION_EXECUTABLE@;
# Translations
@@ -246,7 +185,7 @@ Icon[eu]=@APPLICATION_EXECUTABLE@
GenericName[fa]=همسان سازی پوشه‌ها
Name[fa]=@APPLICATION_EXECUTABLE@ نسخه‌ی همسان سازی مشتری
Icon[fa]=@APPLICATION_EXECUTABLE@
-Comment[fr]=Synchronisez vos dossiers avec un serveur @APPLICATION_NAME@
+Comment[fr]=Client de synchronisation @APPLICATION_NAME@
GenericName[fr]=Synchronisation de dossier
Name[fr]=Client de synchronisation @APPLICATION_NAME@
Icon[fr]=@APPLICATION_EXECUTABLE@
@@ -278,9 +217,17 @@ Comment[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
GenericName[ko]=폴더 동기화
Name[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
Icon[ko]=@APPLICATION_EXECUTABLE@
+Comment[lo]=@APPLICATION_NAME@ ການປະສານຂໍ້ມູນຄອມພິວເຕີລູກຂ່າຍ
+GenericName[lo]=ໂຟນເດີຊິງ
+Name[lo]=@APPLICATION_NAME@ ຊິງຄອມພິວເຕີລູກຂ່າຍ
+Icon[lo]=@APPLICATION_EXECUTABLE@
+Comment[mk]=@APPLICATION_NAME@ десктор клиент за синхронизација
+GenericName[mk]=Папка за синхронизација
+Name[mk]=@APPLICATION_NAME@ десктор клиент за синхронизација
+Icon[mk]=@APPLICATION_EXECUTABLE@
Comment[hu_HU]=@APPLICATION_NAME@ asztali szinkronizációs kliens
-GenericName[hu_HU]=Könyvtár szinkronizálás
-Name[hu_HU]=@APPLICATION_NAME@ asztali szinkr. kliens
+GenericName[hu_HU]=Mappaszinkronizálás
+Name[hu_HU]=@APPLICATION_NAME@ asztali szinkronizációs kliens
Icon[hu_HU]=@APPLICATION_EXECUTABLE@
Comment[af_ZA]=@APPLICATION_NAME@ werkskermsinchroniseerkliënt
GenericName[af_ZA]=Vouersinchronisering
@@ -355,9 +302,9 @@ Comment[lt_LT]=@APPLICATION_NAME@ darbalaukio sinchronizavimo programa
GenericName[lt_LT]=Katalogo sinchnorizacija
Name[lt_LT]=@APPLICATION_NAME@ darbalaukio programa
Icon[lt_LT]=@APPLICATION_EXECUTABLE@
-Comment[th_TH]=@APPLICATION_NAME@ ไคลเอนต์ประสานข้อมูลเดสก์ท็อป
+Comment[th_TH]=@APPLICATION_NAME@ ประสานข้อมูลด้วยโปรแกรมบนเดสก์ท็อป
GenericName[th_TH]=ประสานข้อมูลโฟลเดอร์
-Name[th_TH]= @APPLICATION_NAME@ ไคลเอนต์ประสานข้อมูลเดสก์ท็อป
+Name[th_TH]= @APPLICATION_NAME@ ประสานข้อมูลด้วยโปรแกรมบนเดสก์ท็อป
Icon[th_TH]=@APPLICATION_EXECUTABLE@
Comment[es_MX]=Cliente de escritorio para sincronziación de @APPLICATION_NAME@
GenericName[es_MX]=Sincronización de Carpetas
diff --git a/resources/more.png b/resources/more.png
deleted file mode 100644
index 880d5dccc..000000000
--- a/resources/more.png
+++ /dev/null
Binary files differ
diff --git a/resources/more.svg b/resources/more.svg
new file mode 100644
index 000000000..9ab5d4243
--- /dev/null
+++ b/resources/more.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.0" xmlns:cc="http://creativecommons.org/ns#" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <rect style="color:#000000" fill-opacity="0" height="97.986" width="163.31" y="-32.993" x="-62.897"/>
+ <path d="m3 6c-1.1046 0-2 0.8954-2 2s0.8954 2 2 2 2-0.8954 2-2-0.8954-2-2-2zm5 0c-1.1046 0-2 0.8954-2 2s0.8954 2 2 2 2-0.8954 2-2-0.8954-2-2-2zm5 0c-1.105 0-2 0.8954-2 2s0.895 2 2 2 2-0.8954 2-2-0.895-2-2-2z" fill-rule="evenodd"/>
+</svg>
diff --git a/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/FinderSync.h b/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/FinderSync.h
index 67a436094..803c5270f 100644
--- a/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/FinderSync.h
+++ b/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/FinderSync.h
@@ -23,6 +23,7 @@
NSMutableSet *_registeredDirectories;
NSString *_shareMenuTitle;
NSMutableDictionary *_strings;
+ NSMutableArray *_menuItems;
}
@end
diff --git a/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/FinderSync.m b/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/FinderSync.m
index 2e917d132..a0f791882 100644
--- a/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/FinderSync.m
+++ b/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/FinderSync.m
@@ -21,7 +21,7 @@
- (instancetype)init
{
self = [super init];
-
+
FIFinderSyncController *syncController = [FIFinderSyncController defaultController];
NSBundle *extBundle = [NSBundle bundleForClass:[self class]];
// This was added to the bundle's Info.plist to get it from the build system
@@ -43,7 +43,7 @@
[syncController setBadgeImage:sync label:@"Synchronizing" forBadgeIdentifier:@"NEW+SWM"];
[syncController setBadgeImage:warning label:@"Ignored" forBadgeIdentifier:@"IGNORE+SWM"];
[syncController setBadgeImage:error label:@"Error" forBadgeIdentifier:@"ERROR+SWM"];
-
+
// The Mach port name needs to:
// - Be prefixed with the code signing Team ID
// - Then infixed with the sandbox App Group
@@ -55,12 +55,12 @@
// the sandboxed App Extension needs.
// https://developer.apple.com/library/mac/documentation/Security/Conceptual/AppSandboxDesignGuide/AppSandboxInDepth/AppSandboxInDepth.html#//apple_ref/doc/uid/TP40011183-CH3-SW24
NSString *serverName = [socketApiPrefix stringByAppendingString:@".socketApi"];
- // NSLog(@"FinderSync serverName %@", serverName);
+ //NSLog(@"FinderSync serverName %@", serverName);
_syncClientProxy = [[SyncClientProxy alloc] initWithDelegate:self serverName:serverName];
_registeredDirectories = [[NSMutableSet alloc] init];
_strings = [[NSMutableDictionary alloc] init];
-
+
[_syncClientProxy start];
return self;
}
@@ -74,13 +74,27 @@
NSLog(@"ERROR: Could not determine file type of %@", [url path]);
isDir = NO;
}
-
+
NSString* normalizedPath = [[url path] decomposedStringWithCanonicalMapping];
[_syncClientProxy askForIcon:normalizedPath isDirectory:isDir];
}
#pragma mark - Menu and toolbar item support
+- (NSString*) selectedPathsSeparatedByRecordSeparator
+{
+ FIFinderSyncController *syncController = [FIFinderSyncController defaultController];
+ NSMutableString *string = [[NSMutableString alloc] init];
+ [syncController.selectedItemURLs enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) {
+ if (string.length > 0) {
+ [string appendString:@"\x1e"]; // record separator
+ }
+ NSString* normalizedPath = [[obj path] decomposedStringWithCanonicalMapping];
+ [string appendString:normalizedPath];
+ }];
+ return string;
+}
+
- (NSMenu *)menuForMenuKind:(FIMenuKind)whichMenu
{
FIFinderSyncController *syncController = [FIFinderSyncController defaultController];
@@ -101,54 +115,43 @@
}
}];
+ NSString *paths = [self selectedPathsSeparatedByRecordSeparator];
+ // calling this IPC calls us back from client with several MENU_ITEM entries and then our askOnSocket returns again
+ [_syncClientProxy askOnSocket:paths query:@"GET_MENU_ITEMS"];
+
id contextMenuTitle = [_strings objectForKey:@"CONTEXT_MENU_TITLE"];
- id shareTitle = [_strings objectForKey:@"SHARE_MENU_TITLE"];
- id copyLinkTitle = [_strings objectForKey:@"COPY_PRIVATE_LINK_MENU_TITLE"];
- id emailLinkTitle = [_strings objectForKey:@"EMAIL_PRIVATE_LINK_MENU_TITLE"];
if (contextMenuTitle && !onlyRootsSelected) {
- NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
- NSMenu *subMenu = [[NSMenu alloc] initWithTitle:@""];
- NSMenuItem *subMenuItem = [menu addItemWithTitle:contextMenuTitle action:nil keyEquivalent:@""];
- subMenuItem.submenu = subMenu;
- subMenuItem.image = [[NSBundle mainBundle] imageForResource:@"app.icns"];
-
- [subMenu addItemWithTitle:shareTitle action:@selector(shareMenuAction:) keyEquivalent:@""];
- [subMenu addItemWithTitle:copyLinkTitle action:@selector(copyLinkMenuAction:) keyEquivalent:@""];
- [subMenu addItemWithTitle:emailLinkTitle action:@selector(emailLinkMenuAction:) keyEquivalent:@""];
-
+ NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
+ NSMenu *subMenu = [[NSMenu alloc] initWithTitle:@""];
+ NSMenuItem *subMenuItem = [menu addItemWithTitle:contextMenuTitle action:nil keyEquivalent:@""];
+ subMenuItem.submenu = subMenu;
+ subMenuItem.image = [[NSBundle mainBundle] imageForResource:@"app.icns"];
+
+ // There is an annoying bug in macOS (at least 10.13.3), it does not use/copy over the representedObject of a menu item
+ // So we have to use tag instead.
+ int idx = 0;
+ for (NSArray* item in _menuItems) {
+ NSMenuItem *actionItem = [subMenu addItemWithTitle:[item valueForKey:@"text"]
+ action:@selector(subMenuActionClicked:)
+ keyEquivalent:@""];
+ [actionItem setTag:idx];
+ [actionItem setTarget:self];
+ NSString *flags = [item valueForKey:@"flags"]; // e.g. "d"
+ if ([flags rangeOfString:@"d"].location != NSNotFound) {
+ [actionItem setEnabled:false];
+ }
+ idx++;
+ }
return menu;
}
return nil;
}
-- (IBAction)shareMenuAction:(id)sender
-{
- NSArray* items = [[FIFinderSyncController defaultController] selectedItemURLs];
-
- [items enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) {
- NSString* normalizedPath = [[obj path] decomposedStringWithCanonicalMapping];
- [_syncClientProxy askOnSocket:normalizedPath query:@"SHARE"];
- }];
-}
-
-- (IBAction)copyLinkMenuAction:(id)sender
-{
- NSArray* items = [[FIFinderSyncController defaultController] selectedItemURLs];
-
- [items enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) {
- NSString* normalizedPath = [[obj path] decomposedStringWithCanonicalMapping];
- [_syncClientProxy askOnSocket:normalizedPath query:@"COPY_PRIVATE_LINK"];
- }];
-}
-
-- (IBAction)emailLinkMenuAction:(id)sender
-{
- NSArray* items = [[FIFinderSyncController defaultController] selectedItemURLs];
-
- [items enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) {
- NSString* normalizedPath = [[obj path] decomposedStringWithCanonicalMapping];
- [_syncClientProxy askOnSocket:normalizedPath query:@"EMAIL_PRIVATE_LINK"];
- }];
+- (void)subMenuActionClicked:(id)sender {
+ long idx = [(NSMenuItem*)sender tag];
+ NSString *command = [[_menuItems objectAtIndex:idx] valueForKey:@"command"];
+ NSString *paths = [self selectedPathsSeparatedByRecordSeparator];
+ [_syncClientProxy askOnSocket:paths query:command];
}
#pragma mark - SyncClientProxyDelegate implementation
@@ -181,6 +184,14 @@
[_strings setObject:value forKey:key];
}
+- (void)resetMenuItems
+{
+ _menuItems = [[NSMutableArray alloc] init];
+}
+- (void)addMenuItem:(NSDictionary *)item {
+ [_menuItems addObject:item];
+}
+
- (void)connectionDidDie
{
[_strings removeAllObjects];
diff --git a/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/SyncClientProxy.h b/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/SyncClientProxy.h
index 8f9633416..1d0fd74b8 100644
--- a/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/SyncClientProxy.h
+++ b/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/SyncClientProxy.h
@@ -21,6 +21,8 @@
- (void)registerPath:(NSString*)path;
- (void)unregisterPath:(NSString*)path;
- (void)setString:(NSString*)key value:(NSString*)value;
+- (void)resetMenuItems;
+- (void)addMenuItem:(NSDictionary *)item;
- (void)connectionDidDie;
@end
diff --git a/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/SyncClientProxy.m b/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/SyncClientProxy.m
index b7b64571f..656f77003 100644
--- a/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/SyncClientProxy.m
+++ b/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/SyncClientProxy.m
@@ -27,7 +27,7 @@
- (instancetype)initWithDelegate:(id)arg1 serverName:(NSString*)serverName
{
self = [super init];
-
+
self.delegate = arg1;
_serverName = serverName;
_remoteEnd = nil;
@@ -41,20 +41,20 @@
{
if (_remoteEnd)
return;
-
+
// Lookup the server connection
NSConnection *conn = [NSConnection connectionWithRegisteredName:_serverName host:nil];
-
+
if (!conn) {
// Could not connect to the sync client
[self scheduleRetry];
return;
}
-
+
[[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(connectionDidDie:)
- name:NSConnectionDidDieNotification
- object:conn];
+ selector:@selector(connectionDidDie:)
+ name:NSConnectionDidDieNotification
+ object:conn];
NSDistantObject <ServerProtocol> *server = (NSDistantObject <ServerProtocol> *)[conn rootProxy];
assert(server);
@@ -71,7 +71,7 @@
// The server replied with the distant object that we will use for tx
_remoteEnd = (NSDistantObject <ChannelProtocol> *)tx;
[_remoteEnd setProtocolForProxy:@protocol(ChannelProtocol)];
-
+
// Everything is set up, start querying
[self askOnSocket:@"" query:@"GET_STRINGS"];
}
@@ -83,7 +83,7 @@
- (void)connectionDidDie:(NSNotification*)notification
{
-#pragma unused(notification)
+#pragma unused(notification)
_remoteEnd = nil;
[_delegate connectionDidDie];
@@ -95,11 +95,11 @@
- (void)sendMessage:(NSData*)msg
{
NSString *answer = [[NSString alloc] initWithData:msg encoding:NSUTF8StringEncoding];
-
- // Cut the trailing newline
+
+ // Cut the trailing newline. We always only receive one line from the client.
answer = [answer substringToIndex:[answer length] - 1];
NSArray *chunks = [answer componentsSeparatedByString: @":"];
-
+
if( [[chunks objectAtIndex:0] isEqualToString:@"STATUS"] ) {
NSString *result = [chunks objectAtIndex:1];
NSString *path = [chunks objectAtIndex:2];
@@ -123,6 +123,18 @@
// BEGIN and END messages, do nothing.
} else if( [[chunks objectAtIndex:0 ] isEqualToString:@"STRING"] ) {
[_delegate setString:[chunks objectAtIndex:1] value:[chunks objectAtIndex:2]];
+ } else if( [[chunks objectAtIndex:0 ] isEqualToString:@"GET_MENU_ITEMS"] ) {
+ if ([[chunks objectAtIndex:1] isEqualToString:@"BEGIN"]) {
+ [_delegate resetMenuItems];
+ } else if ([[chunks objectAtIndex:1] isEqualToString:@"END"]) {
+ // Don't do anything special, the askOnSocket call in FinderSync menuForMenuKind will return after this line
+ }
+ } else if( [[chunks objectAtIndex:0 ] isEqualToString:@"MENU_ITEM"] ) {
+ NSMutableDictionary *item = [[NSMutableDictionary alloc] init];
+ [item setValue:[chunks objectAtIndex:1] forKey:@"command"]; // e.g. "COPY_PRIVATE_LINK"
+ [item setValue:[chunks objectAtIndex:2] forKey:@"flags"]; // e.g. "d"
+ [item setValue:[chunks objectAtIndex:3] forKey:@"text"]; // e.g. "Copy private link to clipboard"
+ [_delegate addMenuItem:item];
} else {
NSLog(@"SyncState: Unknown command %@", [chunks objectAtIndex:0]);
}
@@ -131,7 +143,7 @@
- (void)askOnSocket:(NSString*)path query:(NSString*)verb
{
NSString *query = [NSString stringWithFormat:@"%@:%@\n", verb,path];
-
+
@try {
[_remoteEnd sendMessage:[query dataUsingEncoding:NSUTF8StringEncoding]];
} @catch(NSException* e) {
diff --git a/shell_integration/dolphin/ownclouddolphinpluginhelper.cpp b/shell_integration/dolphin/ownclouddolphinpluginhelper.cpp
index 248aa06cf..1bb10e6c5 100644
--- a/shell_integration/dolphin/ownclouddolphinpluginhelper.cpp
+++ b/shell_integration/dolphin/ownclouddolphinpluginhelper.cpp
@@ -19,6 +19,7 @@
#include <QtNetwork/QLocalSocket>
#include <qcoreevent.h>
+#include <QStandardPaths>
#include <QFile>
#include "ownclouddolphinpluginhelper.h"
#include "config.h"
@@ -68,12 +69,14 @@ void OwncloudDolphinPluginHelper::tryConnect()
if (_socket.state() != QLocalSocket::UnconnectedState) {
return;
}
- QString runtimeDir = QFile::decodeName(qgetenv("XDG_RUNTIME_DIR"));
- runtimeDir.append( QChar('/'));
- runtimeDir.append( QLatin1String(APPLICATION_SHORTNAME) );
+
+ QString socketPath = QStandardPaths::locate(QStandardPaths::RuntimeLocation,
+ APPLICATION_SHORTNAME,
+ QStandardPaths::LocateDirectory);
+ if(socketPath.isEmpty())
+ return;
- const QString socketPath = runtimeDir + QLatin1String("/socket");
- _socket.connectToServer(socketPath);
+ _socket.connectToServer(socketPath + QLatin1String("/socket"));
}
void OwncloudDolphinPluginHelper::slotReadyRead()
diff --git a/shell_integration/nautilus/setappname.sh b/shell_integration/nautilus/setappname.sh
index 1ca085941..ed01328bd 100755
--- a/shell_integration/nautilus/setappname.sh
+++ b/shell_integration/nautilus/setappname.sh
@@ -3,4 +3,6 @@
# this script replaces the line
# appname = 'ownCloud'
# with the correct branding name in the syncstate.py script
-sed -i.org -e 's/appname\s*=\s*'"'"'ownCloud'"'/appname = '$1'/" syncstate.py
+# It also replaces the occurences in the class name so several
+# branding can be loaded (see #6524)
+sed -i.org -e "s/ownCloud/$1/g" syncstate.py
diff --git a/shell_integration/nautilus/syncstate.py b/shell_integration/nautilus/syncstate.py
index 6253c07e4..d32cb5e71 100644
--- a/shell_integration/nautilus/syncstate.py
+++ b/shell_integration/nautilus/syncstate.py
@@ -28,19 +28,20 @@ import time
from gi.repository import GObject, Nautilus
-# Please do not touch the following line.
-# The reason is that we use a script to adopt this file for branding
-# by replacing this line with the branding app name. If the following
-# line is changed, the script can not match the pattern and fails.
+# Note: setappname.sh will search and replace 'ownCloud' on this file to update this line and other
+# occurrences of the name
appname = 'ownCloud'
print("Initializing "+appname+"-client-nautilus extension")
+print("Using python version {}".format(sys.version_info))
def get_local_path(url):
if url[0:7] == 'file://':
url = url[7:]
- unquote = urllib.parse.unquote if python3 else urllib.unquote
- return unquote(url)
+ if python3:
+ return urllib.parse.unquote(url)
+ else:
+ return urllib.unquote(url).decode('utf-8')
def get_runtime_dir():
"""Returns the value of $XDG_RUNTIME_DIR, a directory path.
@@ -62,7 +63,7 @@ class SocketConnect(GObject.GObject):
self._watch_id = 0
self._sock = None
self._listeners = [self._update_registered_paths, self._get_version]
- self._remainder = ''.encode()
+ self._remainder = ''.encode('utf-8')
self.protocolVersion = '1.0'
self.nautilusVFSFile_table = {} # not needed in this object actually but shared
# all over the other objects.
@@ -81,7 +82,7 @@ class SocketConnect(GObject.GObject):
# print("Server command: " + cmd)
if self.connected:
try:
- self._sock.send(cmd.encode())
+ self._sock.send(cmd.encode('utf-8'))
except:
print("Sending failed.")
self.reconnect()
@@ -96,19 +97,16 @@ class SocketConnect(GObject.GObject):
self._sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock_file = os.path.join(get_runtime_dir(), appname, "socket")
try:
- print("Socket File: " + sock_file)
self._sock.connect(sock_file) # fails if sock_file doesn't exist
self.connected = True
- print("Setting connected to %r." % self.connected )
self._watch_id = GObject.io_add_watch(self._sock, GObject.IO_IN, self._handle_notify)
- print("Socket watch id: " + str(self._watch_id))
self.sendCommand('VERSION:\n')
self.sendCommand('GET_STRINGS:\n')
return False # Don't run again
except Exception as e:
- print("Could not connect to unix socket. " + str(e))
+ print("Could not connect to unix socket " + sock_file + ". " + str(e))
except Exception as e: # Bad habbit
print("Connect could not be established, try again later.")
self._sock.close()
@@ -131,12 +129,12 @@ class SocketConnect(GObject.GObject):
# Parses response lines out of collected data, returns list of strings
def get_available_responses(self):
- end = self._remainder.rfind('\n'.encode())
+ end = self._remainder.rfind(b'\n')
if end == -1:
return []
data = self._remainder[:end]
self._remainder = self._remainder[end+1:]
- return data.decode().split('\n')
+ return data.decode('utf-8').split('\n')
# Notify is the raw answer from the socket
def _handle_notify(self, source, condition):
@@ -152,7 +150,7 @@ class SocketConnect(GObject.GObject):
return True # Run again
def handle_server_response(self, line):
- print("Server response: " + line)
+ # print("Server response: " + line)
parts = line.split(':')
action = parts[0]
args = parts[1:]
@@ -178,7 +176,7 @@ class SocketConnect(GObject.GObject):
socketConnect = SocketConnect()
-class MenuExtension(GObject.GObject, Nautilus.MenuProvider):
+class MenuExtension_ownCloud(GObject.GObject, Nautilus.MenuProvider):
def __init__(self):
GObject.GObject.__init__(self)
@@ -235,7 +233,7 @@ class MenuExtension(GObject.GObject, Nautilus.MenuProvider):
def ask_for_menu_items(self, files):
record_separator = '\x1e'
filesstring = record_separator.join(files)
- socketConnect.sendCommand('GET_MENU_ITEMS:{}\n'.format(filesstring))
+ socketConnect.sendCommand(u'GET_MENU_ITEMS:{}\n'.format(filesstring))
done = False
start = time.time()
@@ -295,8 +293,8 @@ class MenuExtension(GObject.GObject, Nautilus.MenuProvider):
# and we definitely don't want to show them for IGNORED.
shareable = False
state = entry['state']
- state_ok = state.startswith('OK')
- state_sync = state.startswith('SYNC')
+ state_ok = state and state.startswith('OK')
+ state_sync = state and state.startswith('SYNC')
if state_ok:
shareable = True
elif state_sync and isDir:
@@ -342,11 +340,11 @@ class MenuExtension(GObject.GObject, Nautilus.MenuProvider):
def context_menu_action(self, menu, action, filename):
- print("Context menu: " + action + ' ' + filename)
+ # print("Context menu: " + action + ' ' + filename)
socketConnect.sendCommand(action + ":" + filename + "\n")
-class SyncStateExtension(GObject.GObject, Nautilus.ColumnProvider, Nautilus.InfoProvider):
+class SyncStateExtension_ownCloud(GObject.GObject, Nautilus.InfoProvider):
def __init__(self):
GObject.GObject.__init__(self)
diff --git a/shell_integration/windows/OCContextMenu/OCContextMenu.cpp b/shell_integration/windows/OCContextMenu/OCContextMenu.cpp
index bd305da65..9356187fe 100644
--- a/shell_integration/windows/OCContextMenu/OCContextMenu.cpp
+++ b/shell_integration/windows/OCContextMenu/OCContextMenu.cpp
@@ -162,7 +162,7 @@ IFACEMETHODIMP OCContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT
MENUITEMINFO mii = { sizeof(mii) };
mii.fMask = MIIM_ID | MIIM_FTYPE | MIIM_STRING | MIIM_STATE;
- mii.wID = indexSubMenu;
+ mii.wID = idCmdFirst + indexSubMenu;
mii.fType = MFT_STRING;
mii.dwTypeData = &item.title[0];
mii.fState = disabled ? MFS_DISABLED : MFS_ENABLED;
@@ -192,7 +192,7 @@ IFACEMETHODIMP OCContextMenu::InvokeCommand(LPCMINVOKECOMMANDINFO pici)
// check the identifier offset.
auto offset = LOWORD(pici->lpVerb);
- if (offset < m_info.menuItems.size())
+ if (offset >= m_info.menuItems.size())
return E_FAIL;
command = m_info.menuItems[offset].command;
diff --git a/shell_integration/windows/OCContextMenu/OCContextMenu.rc b/shell_integration/windows/OCContextMenu/OCContextMenu.rc
index ab3041ee1..c09944f14 100644
--- a/shell_integration/windows/OCContextMenu/OCContextMenu.rc
+++ b/shell_integration/windows/OCContextMenu/OCContextMenu.rc
Binary files differ
diff --git a/shell_integration/windows/OCOverlays/OCOverlay.rc b/shell_integration/windows/OCOverlays/OCOverlay.rc
index fb298e242..c8f0ef988 100644
--- a/shell_integration/windows/OCOverlays/OCOverlay.rc
+++ b/shell_integration/windows/OCOverlays/OCOverlay.rc
Binary files differ
diff --git a/shell_integration/windows/OCUtil/CMakeLists.txt b/shell_integration/windows/OCUtil/CMakeLists.txt
index 718a6c327..fe00b31a6 100644
--- a/shell_integration/windows/OCUtil/CMakeLists.txt
+++ b/shell_integration/windows/OCUtil/CMakeLists.txt
@@ -5,6 +5,7 @@ add_library(OCUtil SHARED
RemotePathChecker.cpp
stdafx.cpp
StringUtil.cpp
+ OCUtil.rc
)
target_include_directories(OCUtil
diff --git a/shell_integration/windows/OCUtil/OCUtil.rc b/shell_integration/windows/OCUtil/OCUtil.rc
new file mode 100644
index 000000000..4fa556679
--- /dev/null
+++ b/shell_integration/windows/OCUtil/OCUtil.rc
Binary files differ
diff --git a/shell_integration/windows/OCUtil/OCUtil.vcxproj b/shell_integration/windows/OCUtil/OCUtil.vcxproj
index 4ea28d6b3..6b798ea4e 100644
--- a/shell_integration/windows/OCUtil/OCUtil.vcxproj
+++ b/shell_integration/windows/OCUtil/OCUtil.vcxproj
@@ -170,7 +170,10 @@
</ClCompile>
<ClCompile Include="StringUtil.cpp" />
</ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="OCUtil.rc" />
+ </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
-</Project> \ No newline at end of file
+</Project>
diff --git a/shell_integration/windows/OCUtil/resource.h b/shell_integration/windows/OCUtil/resource.h
new file mode 100644
index 000000000..b9407b5bc
--- /dev/null
+++ b/shell_integration/windows/OCUtil/resource.h
@@ -0,0 +1,14 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by OCContextMenu.rc
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 101
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1001
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/src/3rdparty/libcrashreporter-qt b/src/3rdparty/libcrashreporter-qt
-Subproject 7df66f72aac595295dffcf4dc8a536822008c51
+Subproject 293bdfb92c9be0ee71e90476e9cf5558c434431
diff --git a/src/3rdparty/sqlite3/sqlite3.c b/src/3rdparty/sqlite3/sqlite3.c
index 4bb7b461f..ce4f343fd 100644
--- a/src/3rdparty/sqlite3/sqlite3.c
+++ b/src/3rdparty/sqlite3/sqlite3.c
@@ -1,6 +1,6 @@
/******************************************************************************
** This file is an amalgamation of many separate C source files from SQLite
-** version 3.21.0. By combining all the individual C code files into this
+** version 3.24.0. By combining all the individual C code files into this
** single large file, the entire code can be compiled as a single translation
** unit. This allows many compilers to do optimizations that would not be
** possible if the files were compiled separately. Performance improvements
@@ -213,7 +213,7 @@ static const char * const sqlite3azCompileOpt[] = {
"ENABLE_BATCH_ATOMIC_WRITE",
#endif
#if SQLITE_ENABLE_CEROD
- "ENABLE_CEROD",
+ "ENABLE_CEROD=" CTIMEOPT_VAL(SQLITE_ENABLE_CEROD),
#endif
#if SQLITE_ENABLE_COLUMN_METADATA
"ENABLE_COLUMN_METADATA",
@@ -311,6 +311,9 @@ static const char * const sqlite3azCompileOpt[] = {
#if SQLITE_ENABLE_SNAPSHOT
"ENABLE_SNAPSHOT",
#endif
+#if SQLITE_ENABLE_SORTER_REFERENCES
+ "ENABLE_SORTER_REFERENCES",
+#endif
#if SQLITE_ENABLE_SQLLOG
"ENABLE_SQLLOG",
#endif
@@ -1147,9 +1150,9 @@ extern "C" {
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()].
*/
-#define SQLITE_VERSION "3.21.0"
-#define SQLITE_VERSION_NUMBER 3021000
-#define SQLITE_SOURCE_ID "2017-10-24 18:55:49 1a584e499906b5c87ec7d43d4abce641fdf017c42125b083109bc77c4de48827"
+#define SQLITE_VERSION "3.24.0"
+#define SQLITE_VERSION_NUMBER 3024000
+#define SQLITE_SOURCE_ID "2018-06-04 19:24:41 c7ee0833225bfd8c5ec2f9bf62b97c4e04d03bd9566366d5221ac8fb199a87ca"
/*
** CAPI3REF: Run-Time Library Version Numbers
@@ -1494,6 +1497,8 @@ SQLITE_API int sqlite3_exec(
** the most recent error can be obtained using
** [sqlite3_extended_errcode()].
*/
+#define SQLITE_ERROR_MISSING_COLLSEQ (SQLITE_ERROR | (1<<8))
+#define SQLITE_ERROR_RETRY (SQLITE_ERROR | (2<<8))
#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8))
#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8))
#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8))
@@ -1526,6 +1531,7 @@ SQLITE_API int sqlite3_exec(
#define SQLITE_IOERR_COMMIT_ATOMIC (SQLITE_IOERR | (30<<8))
#define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8))
#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8))
+#define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8))
#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8))
#define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8))
#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8))
@@ -1533,10 +1539,13 @@ SQLITE_API int sqlite3_exec(
#define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8))
#define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8))
#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8))
+#define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8))
#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8))
#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8))
#define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8))
#define SQLITE_READONLY_DBMOVED (SQLITE_READONLY | (4<<8))
+#define SQLITE_READONLY_CANTINIT (SQLITE_READONLY | (5<<8))
+#define SQLITE_READONLY_DIRECTORY (SQLITE_READONLY | (6<<8))
#define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8))
#define SQLITE_CONSTRAINT_CHECK (SQLITE_CONSTRAINT | (1<<8))
#define SQLITE_CONSTRAINT_COMMITHOOK (SQLITE_CONSTRAINT | (2<<8))
@@ -2084,6 +2093,12 @@ struct sqlite3_io_methods {
** so that all subsequent write operations are independent.
** ^SQLite will never invoke SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE without
** a prior successful call to [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE].
+**
+** <li>[[SQLITE_FCNTL_LOCK_TIMEOUT]]
+** The [SQLITE_FCNTL_LOCK_TIMEOUT] opcode causes attempts to obtain
+** a file lock using the xLock or xShmLock methods of the VFS to wait
+** for up to M milliseconds before failing, where M is the single
+** unsigned integer parameter.
** </ul>
*/
#define SQLITE_FCNTL_LOCKSTATE 1
@@ -2118,6 +2133,7 @@ struct sqlite3_io_methods {
#define SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 31
#define SQLITE_FCNTL_COMMIT_ATOMIC_WRITE 32
#define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33
+#define SQLITE_FCNTL_LOCK_TIMEOUT 34
/* deprecated names */
#define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE
@@ -2155,12 +2171,18 @@ typedef struct sqlite3_api_routines sqlite3_api_routines;
** in the name of the object stands for "virtual file system". See
** the [VFS | VFS documentation] for further information.
**
-** The value of the iVersion field is initially 1 but may be larger in
-** future versions of SQLite. Additional fields may be appended to this
-** object when the iVersion value is increased. Note that the structure
-** of the sqlite3_vfs object changes in the transaction between
-** SQLite version 3.5.9 and 3.6.0 and yet the iVersion field was not
-** modified.
+** The VFS interface is sometimes extended by adding new methods onto
+** the end. Each time such an extension occurs, the iVersion field
+** is incremented. The iVersion value started out as 1 in
+** SQLite [version 3.5.0] on [dateof:3.5.0], then increased to 2
+** with SQLite [version 3.7.0] on [dateof:3.7.0], and then increased
+** to 3 with SQLite [version 3.7.6] on [dateof:3.7.6]. Additional fields
+** may be appended to the sqlite3_vfs object and the iVersion value
+** may increase again in future versions of SQLite.
+** Note that the structure
+** of the sqlite3_vfs object changes in the transition from
+** SQLite [version 3.5.9] to [version 3.6.0] on [dateof:3.6.0]
+** and yet the iVersion field was not modified.
**
** The szOsFile field is the size of the subclassed [sqlite3_file]
** structure used by this VFS. mxPathname is the maximum length of
@@ -2937,6 +2959,22 @@ struct sqlite3_mem_methods {
** I/O required to support statement rollback.
** The default value for this setting is controlled by the
** [SQLITE_STMTJRNL_SPILL] compile-time option.
+**
+** [[SQLITE_CONFIG_SORTERREF_SIZE]]
+** <dt>SQLITE_CONFIG_SORTERREF_SIZE
+** <dd>The SQLITE_CONFIG_SORTERREF_SIZE option accepts a single parameter
+** of type (int) - the new value of the sorter-reference size threshold.
+** Usually, when SQLite uses an external sort to order records according
+** to an ORDER BY clause, all fields required by the caller are present in the
+** sorted records. However, if SQLite determines based on the declared type
+** of a table column that its values are likely to be very large - larger
+** than the configured sorter-reference size threshold - then a reference
+** is stored in each sorted record and the required column values loaded
+** from the database as records are returned in sorted order. The default
+** value for this option is to never use this optimization. Specifying a
+** negative value for this option restores the default behaviour.
+** This option is only available if SQLite is compiled with the
+** [SQLITE_ENABLE_SORTER_REFERENCES] compile-time option.
** </dl>
*/
#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */
@@ -2966,6 +3004,7 @@ struct sqlite3_mem_methods {
#define SQLITE_CONFIG_PMASZ 25 /* unsigned int szPma */
#define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */
#define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */
+#define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */
/*
** CAPI3REF: Database Connection Configuration Options
@@ -3068,8 +3107,9 @@ struct sqlite3_mem_methods {
** connections at all to the database. If so, it performs a checkpoint
** operation before closing the connection. This option may be used to
** override this behaviour. The first parameter passed to this operation
-** is an integer - non-zero to disable checkpoints-on-close, or zero (the
-** default) to enable them. The second parameter is a pointer to an integer
+** is an integer - positive to disable checkpoints-on-close, or zero (the
+** default) to enable them, and negative to leave the setting unchanged.
+** The second parameter is a pointer to an integer
** into which is written 0 or 1 to indicate whether checkpoints-on-close
** have been disabled - 0 if they are not disabled, 1 if they are.
** </dd>
@@ -3083,8 +3123,39 @@ struct sqlite3_mem_methods {
** slower. But the QPSG has the advantage of more predictable behavior. With
** the QPSG active, SQLite will always use the same query plan in the field as
** was used during testing in the lab.
+** The first argument to this setting is an integer which is 0 to disable
+** the QPSG, positive to enable QPSG, or negative to leave the setting
+** unchanged. The second parameter is a pointer to an integer into which
+** is written 0 or 1 to indicate whether the QPSG is disabled or enabled
+** following this call.
+** </dd>
+**
+** <dt>SQLITE_DBCONFIG_TRIGGER_EQP</dt>
+** <dd> By default, the output of EXPLAIN QUERY PLAN commands does not
+** include output for any operations performed by trigger programs. This
+** option is used to set or clear (the default) a flag that governs this
+** behavior. The first parameter passed to this operation is an integer -
+** positive to enable output for trigger programs, or zero to disable it,
+** or negative to leave the setting unchanged.
+** The second parameter is a pointer to an integer into which is written
+** 0 or 1 to indicate whether output-for-triggers has been disabled - 0 if
+** it is not disabled, 1 if it is.
** </dd>
**
+** <dt>SQLITE_DBCONFIG_RESET_DATABASE</dt>
+** <dd> Set the SQLITE_DBCONFIG_RESET_DATABASE flag and then run
+** [VACUUM] in order to reset a database back to an empty database
+** with no schema and no content. The following process works even for
+** a badly corrupted database file:
+** <ol>
+** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0);
+** <li> [sqlite3_exec](db, "[VACUUM]", 0, 0, 0);
+** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0);
+** </ol>
+** Because resetting a database is destructive and irreversible, the
+** process requires the use of this obscure API and multiple steps to help
+** ensure that it does not happen by accident.
+** </dd>
** </dl>
*/
#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */
@@ -3095,7 +3166,9 @@ struct sqlite3_mem_methods {
#define SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION 1005 /* int int* */
#define SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE 1006 /* int int* */
#define SQLITE_DBCONFIG_ENABLE_QPSG 1007 /* int int* */
-
+#define SQLITE_DBCONFIG_TRIGGER_EQP 1008 /* int int* */
+#define SQLITE_DBCONFIG_RESET_DATABASE 1009 /* int int* */
+#define SQLITE_DBCONFIG_MAX 1009 /* Largest DBCONFIG */
/*
** CAPI3REF: Enable Or Disable Extended Result Codes
@@ -3501,16 +3574,16 @@ SQLITE_API void sqlite3_free_table(char **result);
**
** These routines are work-alikes of the "printf()" family of functions
** from the standard C library.
-** These routines understand most of the common K&R formatting options,
-** plus some additional non-standard formats, detailed below.
-** Note that some of the more obscure formatting options from recent
-** C-library standards are omitted from this implementation.
+** These routines understand most of the common formatting options from
+** the standard library printf()
+** plus some additional non-standard formats ([%q], [%Q], [%w], and [%z]).
+** See the [built-in printf()] documentation for details.
**
** ^The sqlite3_mprintf() and sqlite3_vmprintf() routines write their
-** results into memory obtained from [sqlite3_malloc()].
+** results into memory obtained from [sqlite3_malloc64()].
** The strings returned by these two routines should be
** released by [sqlite3_free()]. ^Both routines return a
-** NULL pointer if [sqlite3_malloc()] is unable to allocate enough
+** NULL pointer if [sqlite3_malloc64()] is unable to allocate enough
** memory to hold the resulting string.
**
** ^(The sqlite3_snprintf() routine is similar to "snprintf()" from
@@ -3534,71 +3607,7 @@ SQLITE_API void sqlite3_free_table(char **result);
**
** ^The sqlite3_vsnprintf() routine is a varargs version of sqlite3_snprintf().
**
-** These routines all implement some additional formatting
-** options that are useful for constructing SQL statements.
-** All of the usual printf() formatting options apply. In addition, there
-** is are "%q", "%Q", "%w" and "%z" options.
-**
-** ^(The %q option works like %s in that it substitutes a nul-terminated
-** string from the argument list. But %q also doubles every '\'' character.
-** %q is designed for use inside a string literal.)^ By doubling each '\''
-** character it escapes that character and allows it to be inserted into
-** the string.
-**
-** For example, assume the string variable zText contains text as follows:
-**
-** <blockquote><pre>
-** char *zText = "It's a happy day!";
-** </pre></blockquote>
-**
-** One can use this text in an SQL statement as follows:
-**
-** <blockquote><pre>
-** char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText);
-** sqlite3_exec(db, zSQL, 0, 0, 0);
-** sqlite3_free(zSQL);
-** </pre></blockquote>
-**
-** Because the %q format string is used, the '\'' character in zText
-** is escaped and the SQL generated is as follows:
-**
-** <blockquote><pre>
-** INSERT INTO table1 VALUES('It''s a happy day!')
-** </pre></blockquote>
-**
-** This is correct. Had we used %s instead of %q, the generated SQL
-** would have looked like this:
-**
-** <blockquote><pre>
-** INSERT INTO table1 VALUES('It's a happy day!');
-** </pre></blockquote>
-**
-** This second example is an SQL syntax error. As a general rule you should
-** always use %q instead of %s when inserting text into a string literal.
-**
-** ^(The %Q option works like %q except it also adds single quotes around
-** the outside of the total string. Additionally, if the parameter in the
-** argument list is a NULL pointer, %Q substitutes the text "NULL" (without
-** single quotes).)^ So, for example, one could say:
-**
-** <blockquote><pre>
-** char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
-** sqlite3_exec(db, zSQL, 0, 0, 0);
-** sqlite3_free(zSQL);
-** </pre></blockquote>
-**
-** The code above will render a correct SQL statement in the zSQL
-** variable even if the zText variable is a NULL pointer.
-**
-** ^(The "%w" formatting option is like "%q" except that it expects to
-** be contained within double-quotes instead of single quotes, and it
-** escapes the double-quote character instead of the single-quote
-** character.)^ The "%w" formatting option is intended for safely inserting
-** table and column names into a constructed SQL statement.
-**
-** ^(The "%z" formatting option works like "%s" but with the
-** addition that after the string has been read and copied into
-** the result, [sqlite3_free()] is called on the input string.)^
+** See also: [built-in printf()], [printf() SQL function]
*/
SQLITE_API char *sqlite3_mprintf(const char*,...);
SQLITE_API char *sqlite3_vmprintf(const char*, va_list);
@@ -3956,8 +3965,8 @@ SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*,
** KEYWORDS: SQLITE_TRACE
**
** These constants identify classes of events that can be monitored
-** using the [sqlite3_trace_v2()] tracing logic. The third argument
-** to [sqlite3_trace_v2()] is an OR-ed combination of one or more of
+** using the [sqlite3_trace_v2()] tracing logic. The M argument
+** to [sqlite3_trace_v2(D,M,X,P)] is an OR-ed combination of one or more of
** the following constants. ^The first argument to the trace callback
** is one of the following constants.
**
@@ -4664,13 +4673,13 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal);
** or [GLOB] operator or if the parameter is compared to an indexed column
** and the [SQLITE_ENABLE_STAT3] compile-time option is enabled.
** </li>
+** </ol>
**
** <p>^sqlite3_prepare_v3() differs from sqlite3_prepare_v2() only in having
** the extra prepFlags parameter, which is a bit array consisting of zero or
** more of the [SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_*] flags. ^The
** sqlite3_prepare_v2() interface works exactly the same as
** sqlite3_prepare_v3() with a zero prepFlags parameter.
-** </ol>
*/
SQLITE_API int sqlite3_prepare(
sqlite3 *db, /* Database handle */
@@ -5803,6 +5812,9 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6
** datatype of the value
** <tr><td><b>sqlite3_value_numeric_type&nbsp;&nbsp;</b>
** <td>&rarr;&nbsp;&nbsp;<td>Best numeric datatype of the value
+** <tr><td><b>sqlite3_value_nochange&nbsp;&nbsp;</b>
+** <td>&rarr;&nbsp;&nbsp;<td>True if the column is unchanged in an UPDATE
+** against a virtual table.
** </table></blockquote>
**
** <b>Details:</b>
@@ -5851,6 +5863,19 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6
** then the conversion is performed. Otherwise no conversion occurs.
** The [SQLITE_INTEGER | datatype] after conversion is returned.)^
**
+** ^Within the [xUpdate] method of a [virtual table], the
+** sqlite3_value_nochange(X) interface returns true if and only if
+** the column corresponding to X is unchanged by the UPDATE operation
+** that the xUpdate method call was invoked to implement and if
+** and the prior [xColumn] method call that was invoked to extracted
+** the value for that column returned without setting a result (probably
+** because it queried [sqlite3_vtab_nochange()] and found that the column
+** was unchanging). ^Within an [xUpdate] method, any value for which
+** sqlite3_value_nochange(X) is true will in all other respects appear
+** to be a NULL value. If sqlite3_value_nochange(X) is invoked anywhere other
+** than within an [xUpdate] method call for an UPDATE statement, then
+** the return value is arbitrary and meaningless.
+**
** Please pay particular attention to the fact that the pointer returned
** from [sqlite3_value_blob()], [sqlite3_value_text()], or
** [sqlite3_value_text16()] can be invalidated by a subsequent call to
@@ -5873,6 +5898,7 @@ SQLITE_API int sqlite3_value_bytes(sqlite3_value*);
SQLITE_API int sqlite3_value_bytes16(sqlite3_value*);
SQLITE_API int sqlite3_value_type(sqlite3_value*);
SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*);
+SQLITE_API int sqlite3_value_nochange(sqlite3_value*);
/*
** CAPI3REF: Finding The Subtype Of SQL Values
@@ -6529,6 +6555,41 @@ SQLITE_API char *sqlite3_temp_directory;
SQLITE_API char *sqlite3_data_directory;
/*
+** CAPI3REF: Win32 Specific Interface
+**
+** These interfaces are available only on Windows. The
+** [sqlite3_win32_set_directory] interface is used to set the value associated
+** with the [sqlite3_temp_directory] or [sqlite3_data_directory] variable, to
+** zValue, depending on the value of the type parameter. The zValue parameter
+** should be NULL to cause the previous value to be freed via [sqlite3_free];
+** a non-NULL value will be copied into memory obtained from [sqlite3_malloc]
+** prior to being used. The [sqlite3_win32_set_directory] interface returns
+** [SQLITE_OK] to indicate success, [SQLITE_ERROR] if the type is unsupported,
+** or [SQLITE_NOMEM] if memory could not be allocated. The value of the
+** [sqlite3_data_directory] variable is intended to act as a replacement for
+** the current directory on the sub-platforms of Win32 where that concept is
+** not present, e.g. WinRT and UWP. The [sqlite3_win32_set_directory8] and
+** [sqlite3_win32_set_directory16] interfaces behave exactly the same as the
+** sqlite3_win32_set_directory interface except the string parameter must be
+** UTF-8 or UTF-16, respectively.
+*/
+SQLITE_API int sqlite3_win32_set_directory(
+ unsigned long type, /* Identifier for directory being set or reset */
+ void *zValue /* New value for directory being set or reset */
+);
+SQLITE_API int sqlite3_win32_set_directory8(unsigned long type, const char *zValue);
+SQLITE_API int sqlite3_win32_set_directory16(unsigned long type, const void *zValue);
+
+/*
+** CAPI3REF: Win32 Directory Types
+**
+** These macros are only available on Windows. They define the allowed values
+** for the type argument to the [sqlite3_win32_set_directory] interface.
+*/
+#define SQLITE_WIN32_DATA_DIRECTORY_TYPE 1
+#define SQLITE_WIN32_TEMP_DIRECTORY_TYPE 2
+
+/*
** CAPI3REF: Test For Auto-Commit Mode
** KEYWORDS: {autocommit mode}
** METHOD: sqlite3
@@ -7260,6 +7321,10 @@ struct sqlite3_index_info {
/*
** CAPI3REF: Virtual Table Scan Flags
+**
+** Virtual table implementations are allowed to set the
+** [sqlite3_index_info].idxFlags field to some combination of
+** these bits.
*/
#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */
@@ -7975,9 +8040,9 @@ SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*);
** the xFileControl method. ^The return value of the xFileControl
** method becomes the return value of this routine.
**
-** ^The SQLITE_FCNTL_FILE_POINTER value for the op parameter causes
+** ^The [SQLITE_FCNTL_FILE_POINTER] value for the op parameter causes
** a pointer to the underlying [sqlite3_file] object to be written into
-** the space pointed to by the 4th parameter. ^The SQLITE_FCNTL_FILE_POINTER
+** the space pointed to by the 4th parameter. ^The [SQLITE_FCNTL_FILE_POINTER]
** case is a short-circuit path which does not actually invoke the
** underlying sqlite3_io_methods.xFileControl method.
**
@@ -7989,7 +8054,7 @@ SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*);
** an incorrect zDbName and an SQLITE_ERROR return from the underlying
** xFileControl method.
**
-** See also: [SQLITE_FCNTL_LOCKSTATE]
+** See also: [file control opcodes]
*/
SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*);
@@ -8035,7 +8100,7 @@ SQLITE_API int sqlite3_test_control(int op, ...);
#define SQLITE_TESTCTRL_ALWAYS 13
#define SQLITE_TESTCTRL_RESERVE 14
#define SQLITE_TESTCTRL_OPTIMIZATIONS 15
-#define SQLITE_TESTCTRL_ISKEYWORD 16
+#define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */
#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */
#define SQLITE_TESTCTRL_LOCALTIME_FAULT 18
#define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */
@@ -8046,7 +8111,191 @@ SQLITE_API int sqlite3_test_control(int op, ...);
#define SQLITE_TESTCTRL_ISINIT 23
#define SQLITE_TESTCTRL_SORTER_MMAP 24
#define SQLITE_TESTCTRL_IMPOSTER 25
-#define SQLITE_TESTCTRL_LAST 25
+#define SQLITE_TESTCTRL_PARSER_COVERAGE 26
+#define SQLITE_TESTCTRL_LAST 26 /* Largest TESTCTRL */
+
+/*
+** CAPI3REF: SQL Keyword Checking
+**
+** These routines provide access to the set of SQL language keywords
+** recognized by SQLite. Applications can uses these routines to determine
+** whether or not a specific identifier needs to be escaped (for example,
+** by enclosing in double-quotes) so as not to confuse the parser.
+**
+** The sqlite3_keyword_count() interface returns the number of distinct
+** keywords understood by SQLite.
+**
+** The sqlite3_keyword_name(N,Z,L) interface finds the N-th keyword and
+** makes *Z point to that keyword expressed as UTF8 and writes the number
+** of bytes in the keyword into *L. The string that *Z points to is not
+** zero-terminated. The sqlite3_keyword_name(N,Z,L) routine returns
+** SQLITE_OK if N is within bounds and SQLITE_ERROR if not. If either Z
+** or L are NULL or invalid pointers then calls to
+** sqlite3_keyword_name(N,Z,L) result in undefined behavior.
+**
+** The sqlite3_keyword_check(Z,L) interface checks to see whether or not
+** the L-byte UTF8 identifier that Z points to is a keyword, returning non-zero
+** if it is and zero if not.
+**
+** The parser used by SQLite is forgiving. It is often possible to use
+** a keyword as an identifier as long as such use does not result in a
+** parsing ambiguity. For example, the statement
+** "CREATE TABLE BEGIN(REPLACE,PRAGMA,END);" is accepted by SQLite, and
+** creates a new table named "BEGIN" with three columns named
+** "REPLACE", "PRAGMA", and "END". Nevertheless, best practice is to avoid
+** using keywords as identifiers. Common techniques used to avoid keyword
+** name collisions include:
+** <ul>
+** <li> Put all identifier names inside double-quotes. This is the official
+** SQL way to escape identifier names.
+** <li> Put identifier names inside &#91;...&#93;. This is not standard SQL,
+** but it is what SQL Server does and so lots of programmers use this
+** technique.
+** <li> Begin every identifier with the letter "Z" as no SQL keywords start
+** with "Z".
+** <li> Include a digit somewhere in every identifier name.
+** </ul>
+**
+** Note that the number of keywords understood by SQLite can depend on
+** compile-time options. For example, "VACUUM" is not a keyword if
+** SQLite is compiled with the [-DSQLITE_OMIT_VACUUM] option. Also,
+** new keywords may be added to future releases of SQLite.
+*/
+SQLITE_API int sqlite3_keyword_count(void);
+SQLITE_API int sqlite3_keyword_name(int,const char**,int*);
+SQLITE_API int sqlite3_keyword_check(const char*,int);
+
+/*
+** CAPI3REF: Dynamic String Object
+** KEYWORDS: {dynamic string}
+**
+** An instance of the sqlite3_str object contains a dynamically-sized
+** string under construction.
+**
+** The lifecycle of an sqlite3_str object is as follows:
+** <ol>
+** <li> ^The sqlite3_str object is created using [sqlite3_str_new()].
+** <li> ^Text is appended to the sqlite3_str object using various
+** methods, such as [sqlite3_str_appendf()].
+** <li> ^The sqlite3_str object is destroyed and the string it created
+** is returned using the [sqlite3_str_finish()] interface.
+** </ol>
+*/
+typedef struct sqlite3_str sqlite3_str;
+
+/*
+** CAPI3REF: Create A New Dynamic String Object
+** CONSTRUCTOR: sqlite3_str
+**
+** ^The [sqlite3_str_new(D)] interface allocates and initializes
+** a new [sqlite3_str] object. To avoid memory leaks, the object returned by
+** [sqlite3_str_new()] must be freed by a subsequent call to
+** [sqlite3_str_finish(X)].
+**
+** ^The [sqlite3_str_new(D)] interface always returns a pointer to a
+** valid [sqlite3_str] object, though in the event of an out-of-memory
+** error the returned object might be a special singleton that will
+** silently reject new text, always return SQLITE_NOMEM from
+** [sqlite3_str_errcode()], always return 0 for
+** [sqlite3_str_length()], and always return NULL from
+** [sqlite3_str_finish(X)]. It is always safe to use the value
+** returned by [sqlite3_str_new(D)] as the sqlite3_str parameter
+** to any of the other [sqlite3_str] methods.
+**
+** The D parameter to [sqlite3_str_new(D)] may be NULL. If the
+** D parameter in [sqlite3_str_new(D)] is not NULL, then the maximum
+** length of the string contained in the [sqlite3_str] object will be
+** the value set for [sqlite3_limit](D,[SQLITE_LIMIT_LENGTH]) instead
+** of [SQLITE_MAX_LENGTH].
+*/
+SQLITE_API sqlite3_str *sqlite3_str_new(sqlite3*);
+
+/*
+** CAPI3REF: Finalize A Dynamic String
+** DESTRUCTOR: sqlite3_str
+**
+** ^The [sqlite3_str_finish(X)] interface destroys the sqlite3_str object X
+** and returns a pointer to a memory buffer obtained from [sqlite3_malloc64()]
+** that contains the constructed string. The calling application should
+** pass the returned value to [sqlite3_free()] to avoid a memory leak.
+** ^The [sqlite3_str_finish(X)] interface may return a NULL pointer if any
+** errors were encountered during construction of the string. ^The
+** [sqlite3_str_finish(X)] interface will also return a NULL pointer if the
+** string in [sqlite3_str] object X is zero bytes long.
+*/
+SQLITE_API char *sqlite3_str_finish(sqlite3_str*);
+
+/*
+** CAPI3REF: Add Content To A Dynamic String
+** METHOD: sqlite3_str
+**
+** These interfaces add content to an sqlite3_str object previously obtained
+** from [sqlite3_str_new()].
+**
+** ^The [sqlite3_str_appendf(X,F,...)] and
+** [sqlite3_str_vappendf(X,F,V)] interfaces uses the [built-in printf]
+** functionality of SQLite to append formatted text onto the end of
+** [sqlite3_str] object X.
+**
+** ^The [sqlite3_str_append(X,S,N)] method appends exactly N bytes from string S
+** onto the end of the [sqlite3_str] object X. N must be non-negative.
+** S must contain at least N non-zero bytes of content. To append a
+** zero-terminated string in its entirety, use the [sqlite3_str_appendall()]
+** method instead.
+**
+** ^The [sqlite3_str_appendall(X,S)] method appends the complete content of
+** zero-terminated string S onto the end of [sqlite3_str] object X.
+**
+** ^The [sqlite3_str_appendchar(X,N,C)] method appends N copies of the
+** single-byte character C onto the end of [sqlite3_str] object X.
+** ^This method can be used, for example, to add whitespace indentation.
+**
+** ^The [sqlite3_str_reset(X)] method resets the string under construction
+** inside [sqlite3_str] object X back to zero bytes in length.
+**
+** These methods do not return a result code. ^If an error occurs, that fact
+** is recorded in the [sqlite3_str] object and can be recovered by a
+** subsequent call to [sqlite3_str_errcode(X)].
+*/
+SQLITE_API void sqlite3_str_appendf(sqlite3_str*, const char *zFormat, ...);
+SQLITE_API void sqlite3_str_vappendf(sqlite3_str*, const char *zFormat, va_list);
+SQLITE_API void sqlite3_str_append(sqlite3_str*, const char *zIn, int N);
+SQLITE_API void sqlite3_str_appendall(sqlite3_str*, const char *zIn);
+SQLITE_API void sqlite3_str_appendchar(sqlite3_str*, int N, char C);
+SQLITE_API void sqlite3_str_reset(sqlite3_str*);
+
+/*
+** CAPI3REF: Status Of A Dynamic String
+** METHOD: sqlite3_str
+**
+** These interfaces return the current status of an [sqlite3_str] object.
+**
+** ^If any prior errors have occurred while constructing the dynamic string
+** in sqlite3_str X, then the [sqlite3_str_errcode(X)] method will return
+** an appropriate error code. ^The [sqlite3_str_errcode(X)] method returns
+** [SQLITE_NOMEM] following any out-of-memory error, or
+** [SQLITE_TOOBIG] if the size of the dynamic string exceeds
+** [SQLITE_MAX_LENGTH], or [SQLITE_OK] if there have been no errors.
+**
+** ^The [sqlite3_str_length(X)] method returns the current length, in bytes,
+** of the dynamic string under construction in [sqlite3_str] object X.
+** ^The length returned by [sqlite3_str_length(X)] does not include the
+** zero-termination byte.
+**
+** ^The [sqlite3_str_value(X)] method returns a pointer to the current
+** content of the dynamic string under construction in X. The value
+** returned by [sqlite3_str_value(X)] is managed by the sqlite3_str object X
+** and might be freed or altered by any subsequent method on the same
+** [sqlite3_str] object. Applications must not used the pointer returned
+** [sqlite3_str_value(X)] after any subsequent method call on the same
+** object. ^Applications may change the content of the string returned
+** by [sqlite3_str_value(X)] as long as they do not write into any bytes
+** outside the range of 0 to [sqlite3_str_length(X)] and do not read or
+** write any byte after any subsequent sqlite3_str method call.
+*/
+SQLITE_API int sqlite3_str_errcode(sqlite3_str*);
+SQLITE_API int sqlite3_str_length(sqlite3_str*);
+SQLITE_API char *sqlite3_str_value(sqlite3_str*);
/*
** CAPI3REF: SQLite Runtime Status
@@ -8281,6 +8530,15 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r
** highwater mark associated with SQLITE_DBSTATUS_CACHE_WRITE is always 0.
** </dd>
**
+** [[SQLITE_DBSTATUS_CACHE_SPILL]] ^(<dt>SQLITE_DBSTATUS_CACHE_SPILL</dt>
+** <dd>This parameter returns the number of dirty cache entries that have
+** been written to disk in the middle of a transaction due to the page
+** cache overflowing. Transactions are more efficient if they are written
+** to disk all at once. When pages spill mid-transaction, that introduces
+** additional overhead. This parameter can be used help identify
+** inefficiencies that can be resolve by increasing the cache size.
+** </dd>
+**
** [[SQLITE_DBSTATUS_DEFERRED_FKS]] ^(<dt>SQLITE_DBSTATUS_DEFERRED_FKS</dt>
** <dd>This parameter returns zero for the current value if and only if
** all foreign key constraints (deferred or immediate) have been
@@ -8300,7 +8558,8 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r
#define SQLITE_DBSTATUS_CACHE_WRITE 9
#define SQLITE_DBSTATUS_DEFERRED_FKS 10
#define SQLITE_DBSTATUS_CACHE_USED_SHARED 11
-#define SQLITE_DBSTATUS_MAX 11 /* Largest defined DBSTATUS */
+#define SQLITE_DBSTATUS_CACHE_SPILL 12
+#define SQLITE_DBSTATUS_MAX 12 /* Largest defined DBSTATUS */
/*
@@ -9301,6 +9560,40 @@ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...);
SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *);
/*
+** CAPI3REF: Determine If Virtual Table Column Access Is For UPDATE
+**
+** If the sqlite3_vtab_nochange(X) routine is called within the [xColumn]
+** method of a [virtual table], then it returns true if and only if the
+** column is being fetched as part of an UPDATE operation during which the
+** column value will not change. Applications might use this to substitute
+** a return value that is less expensive to compute and that the corresponding
+** [xUpdate] method understands as a "no-change" value.
+**
+** If the [xColumn] method calls sqlite3_vtab_nochange() and finds that
+** the column is not changed by the UPDATE statement, then the xColumn
+** method can optionally return without setting a result, without calling
+** any of the [sqlite3_result_int|sqlite3_result_xxxxx() interfaces].
+** In that case, [sqlite3_value_nochange(X)] will return true for the
+** same column in the [xUpdate] method.
+*/
+SQLITE_API int sqlite3_vtab_nochange(sqlite3_context*);
+
+/*
+** CAPI3REF: Determine The Collation For a Virtual Table Constraint
+**
+** This function may only be called from within a call to the [xBestIndex]
+** method of a [virtual table].
+**
+** The first argument must be the sqlite3_index_info object that is the
+** first parameter to the xBestIndex() method. The second argument must be
+** an index into the aConstraint[] array belonging to the sqlite3_index_info
+** structure passed to xBestIndex. This function returns a pointer to a buffer
+** containing the name of the collation sequence for the corresponding
+** constraint.
+*/
+SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_info*,int);
+
+/*
** CAPI3REF: Conflict resolution modes
** KEYWORDS: {conflict resolution mode}
**
@@ -9747,6 +10040,128 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp(
SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb);
/*
+** CAPI3REF: Serialize a database
+**
+** The sqlite3_serialize(D,S,P,F) interface returns a pointer to memory
+** that is a serialization of the S database on [database connection] D.
+** If P is not a NULL pointer, then the size of the database in bytes
+** is written into *P.
+**
+** For an ordinary on-disk database file, the serialization is just a
+** copy of the disk file. For an in-memory database or a "TEMP" database,
+** the serialization is the same sequence of bytes which would be written
+** to disk if that database where backed up to disk.
+**
+** The usual case is that sqlite3_serialize() copies the serialization of
+** the database into memory obtained from [sqlite3_malloc64()] and returns
+** a pointer to that memory. The caller is responsible for freeing the
+** returned value to avoid a memory leak. However, if the F argument
+** contains the SQLITE_SERIALIZE_NOCOPY bit, then no memory allocations
+** are made, and the sqlite3_serialize() function will return a pointer
+** to the contiguous memory representation of the database that SQLite
+** is currently using for that database, or NULL if the no such contiguous
+** memory representation of the database exists. A contiguous memory
+** representation of the database will usually only exist if there has
+** been a prior call to [sqlite3_deserialize(D,S,...)] with the same
+** values of D and S.
+** The size of the database is written into *P even if the
+** SQLITE_SERIALIZE_NOCOPY bit is set but no contiguous copy
+** of the database exists.
+**
+** A call to sqlite3_serialize(D,S,P,F) might return NULL even if the
+** SQLITE_SERIALIZE_NOCOPY bit is omitted from argument F if a memory
+** allocation error occurs.
+**
+** This interface is only available if SQLite is compiled with the
+** [SQLITE_ENABLE_DESERIALIZE] option.
+*/
+SQLITE_API unsigned char *sqlite3_serialize(
+ sqlite3 *db, /* The database connection */
+ const char *zSchema, /* Which DB to serialize. ex: "main", "temp", ... */
+ sqlite3_int64 *piSize, /* Write size of the DB here, if not NULL */
+ unsigned int mFlags /* Zero or more SQLITE_SERIALIZE_* flags */
+);
+
+/*
+** CAPI3REF: Flags for sqlite3_serialize
+**
+** Zero or more of the following constants can be OR-ed together for
+** the F argument to [sqlite3_serialize(D,S,P,F)].
+**
+** SQLITE_SERIALIZE_NOCOPY means that [sqlite3_serialize()] will return
+** a pointer to contiguous in-memory database that it is currently using,
+** without making a copy of the database. If SQLite is not currently using
+** a contiguous in-memory database, then this option causes
+** [sqlite3_serialize()] to return a NULL pointer. SQLite will only be
+** using a contiguous in-memory database if it has been initialized by a
+** prior call to [sqlite3_deserialize()].
+*/
+#define SQLITE_SERIALIZE_NOCOPY 0x001 /* Do no memory allocations */
+
+/*
+** CAPI3REF: Deserialize a database
+**
+** The sqlite3_deserialize(D,S,P,N,M,F) interface causes the
+** [database connection] D to disconnect from database S and then
+** reopen S as an in-memory database based on the serialization contained
+** in P. The serialized database P is N bytes in size. M is the size of
+** the buffer P, which might be larger than N. If M is larger than N, and
+** the SQLITE_DESERIALIZE_READONLY bit is not set in F, then SQLite is
+** permitted to add content to the in-memory database as long as the total
+** size does not exceed M bytes.
+**
+** If the SQLITE_DESERIALIZE_FREEONCLOSE bit is set in F, then SQLite will
+** invoke sqlite3_free() on the serialization buffer when the database
+** connection closes. If the SQLITE_DESERIALIZE_RESIZEABLE bit is set, then
+** SQLite will try to increase the buffer size using sqlite3_realloc64()
+** if writes on the database cause it to grow larger than M bytes.
+**
+** The sqlite3_deserialize() interface will fail with SQLITE_BUSY if the
+** database is currently in a read transaction or is involved in a backup
+** operation.
+**
+** If sqlite3_deserialize(D,S,P,N,M,F) fails for any reason and if the
+** SQLITE_DESERIALIZE_FREEONCLOSE bit is set in argument F, then
+** [sqlite3_free()] is invoked on argument P prior to returning.
+**
+** This interface is only available if SQLite is compiled with the
+** [SQLITE_ENABLE_DESERIALIZE] option.
+*/
+SQLITE_API int sqlite3_deserialize(
+ sqlite3 *db, /* The database connection */
+ const char *zSchema, /* Which DB to reopen with the deserialization */
+ unsigned char *pData, /* The serialized database content */
+ sqlite3_int64 szDb, /* Number bytes in the deserialization */
+ sqlite3_int64 szBuf, /* Total size of buffer pData[] */
+ unsigned mFlags /* Zero or more SQLITE_DESERIALIZE_* flags */
+);
+
+/*
+** CAPI3REF: Flags for sqlite3_deserialize()
+**
+** The following are allowed values for 6th argument (the F argument) to
+** the [sqlite3_deserialize(D,S,P,N,M,F)] interface.
+**
+** The SQLITE_DESERIALIZE_FREEONCLOSE means that the database serialization
+** in the P argument is held in memory obtained from [sqlite3_malloc64()]
+** and that SQLite should take ownership of this memory and automatically
+** free it when it has finished using it. Without this flag, the caller
+** is resposible for freeing any dynamically allocated memory.
+**
+** The SQLITE_DESERIALIZE_RESIZEABLE flag means that SQLite is allowed to
+** grow the size of the database using calls to [sqlite3_realloc64()]. This
+** flag should only be used if SQLITE_DESERIALIZE_FREEONCLOSE is also used.
+** Without this flag, the deserialized database cannot increase in size beyond
+** the number of bytes specified by the M parameter.
+**
+** The SQLITE_DESERIALIZE_READONLY flag means that the deserialized database
+** should be treated as read-only.
+*/
+#define SQLITE_DESERIALIZE_FREEONCLOSE 1 /* Call sqlite3_free() on close */
+#define SQLITE_DESERIALIZE_RESIZEABLE 2 /* Resize using sqlite3_realloc64() */
+#define SQLITE_DESERIALIZE_READONLY 4 /* Database is read-only */
+
+/*
** Undo the hack that converts floating point types to integer for
** builds on processors without floating point support.
*/
@@ -9893,16 +10308,23 @@ extern "C" {
/*
** CAPI3REF: Session Object Handle
+**
+** An instance of this object is a [session] that can be used to
+** record changes to a database.
*/
typedef struct sqlite3_session sqlite3_session;
/*
** CAPI3REF: Changeset Iterator Handle
+**
+** An instance of this object acts as a cursor for iterating
+** over the elements of a [changeset] or [patchset].
*/
typedef struct sqlite3_changeset_iter sqlite3_changeset_iter;
/*
** CAPI3REF: Create A New Session Object
+** CONSTRUCTOR: sqlite3_session
**
** Create a new session object attached to database handle db. If successful,
** a pointer to the new object is written to *ppSession and SQLITE_OK is
@@ -9939,6 +10361,7 @@ SQLITE_API int sqlite3session_create(
/*
** CAPI3REF: Delete A Session Object
+** DESTRUCTOR: sqlite3_session
**
** Delete a session object previously allocated using
** [sqlite3session_create()]. Once a session object has been deleted, the
@@ -9954,6 +10377,7 @@ SQLITE_API void sqlite3session_delete(sqlite3_session *pSession);
/*
** CAPI3REF: Enable Or Disable A Session Object
+** METHOD: sqlite3_session
**
** Enable or disable the recording of changes by a session object. When
** enabled, a session object records changes made to the database. When
@@ -9973,6 +10397,7 @@ SQLITE_API int sqlite3session_enable(sqlite3_session *pSession, int bEnable);
/*
** CAPI3REF: Set Or Clear the Indirect Change Flag
+** METHOD: sqlite3_session
**
** Each change recorded by a session object is marked as either direct or
** indirect. A change is marked as indirect if either:
@@ -10002,6 +10427,7 @@ SQLITE_API int sqlite3session_indirect(sqlite3_session *pSession, int bIndirect)
/*
** CAPI3REF: Attach A Table To A Session Object
+** METHOD: sqlite3_session
**
** If argument zTab is not NULL, then it is the name of a table to attach
** to the session object passed as the first argument. All subsequent changes
@@ -10027,6 +10453,35 @@ SQLITE_API int sqlite3session_indirect(sqlite3_session *pSession, int bIndirect)
**
** SQLITE_OK is returned if the call completes without error. Or, if an error
** occurs, an SQLite error code (e.g. SQLITE_NOMEM) is returned.
+**
+** <h3>Special sqlite_stat1 Handling</h3>
+**
+** As of SQLite version 3.22.0, the "sqlite_stat1" table is an exception to
+** some of the rules above. In SQLite, the schema of sqlite_stat1 is:
+** <pre>
+** &nbsp; CREATE TABLE sqlite_stat1(tbl,idx,stat)
+** </pre>
+**
+** Even though sqlite_stat1 does not have a PRIMARY KEY, changes are
+** recorded for it as if the PRIMARY KEY is (tbl,idx). Additionally, changes
+** are recorded for rows for which (idx IS NULL) is true. However, for such
+** rows a zero-length blob (SQL value X'') is stored in the changeset or
+** patchset instead of a NULL value. This allows such changesets to be
+** manipulated by legacy implementations of sqlite3changeset_invert(),
+** concat() and similar.
+**
+** The sqlite3changeset_apply() function automatically converts the
+** zero-length blob back to a NULL value when updating the sqlite_stat1
+** table. However, if the application calls sqlite3changeset_new(),
+** sqlite3changeset_old() or sqlite3changeset_conflict on a changeset
+** iterator directly (including on a changeset iterator passed to a
+** conflict-handler callback) then the X'' value is returned. The application
+** must translate X'' to NULL itself if required.
+**
+** Legacy (older than 3.22.0) versions of the sessions module cannot capture
+** changes made to the sqlite_stat1 table. Legacy versions of the
+** sqlite3changeset_apply() function silently ignore any modifications to the
+** sqlite_stat1 table that are part of a changeset or patchset.
*/
SQLITE_API int sqlite3session_attach(
sqlite3_session *pSession, /* Session object */
@@ -10035,6 +10490,7 @@ SQLITE_API int sqlite3session_attach(
/*
** CAPI3REF: Set a table filter on a Session Object.
+** METHOD: sqlite3_session
**
** The second argument (xFilter) is the "filter callback". For changes to rows
** in tables that are not attached to the Session object, the filter is called
@@ -10053,6 +10509,7 @@ SQLITE_API void sqlite3session_table_filter(
/*
** CAPI3REF: Generate A Changeset From A Session Object
+** METHOD: sqlite3_session
**
** Obtain a changeset containing changes to the tables attached to the
** session object passed as the first argument. If successful,
@@ -10162,7 +10619,8 @@ SQLITE_API int sqlite3session_changeset(
);
/*
-** CAPI3REF: Load The Difference Between Tables Into A Session
+** CAPI3REF: Load The Difference Between Tables Into A Session
+** METHOD: sqlite3_session
**
** If it is not already attached to the session object passed as the first
** argument, this function attaches table zTbl in the same manner as the
@@ -10227,6 +10685,7 @@ SQLITE_API int sqlite3session_diff(
/*
** CAPI3REF: Generate A Patchset From A Session Object
+** METHOD: sqlite3_session
**
** The differences between a patchset and a changeset are that:
**
@@ -10278,6 +10737,7 @@ SQLITE_API int sqlite3session_isempty(sqlite3_session *pSession);
/*
** CAPI3REF: Create An Iterator To Traverse A Changeset
+** CONSTRUCTOR: sqlite3_changeset_iter
**
** Create an iterator used to iterate through the contents of a changeset.
** If successful, *pp is set to point to the iterator handle and SQLITE_OK
@@ -10318,6 +10778,7 @@ SQLITE_API int sqlite3changeset_start(
/*
** CAPI3REF: Advance A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** This function may only be used with iterators created by function
** [sqlite3changeset_start()]. If it is called on an iterator passed to
@@ -10342,6 +10803,7 @@ SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *pIter);
/*
** CAPI3REF: Obtain The Current Operation From A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** The pIter argument passed to this function may either be an iterator
** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator
@@ -10376,6 +10838,7 @@ SQLITE_API int sqlite3changeset_op(
/*
** CAPI3REF: Obtain The Primary Key Definition Of A Table
+** METHOD: sqlite3_changeset_iter
**
** For each modified table, a changeset includes the following:
**
@@ -10407,6 +10870,7 @@ SQLITE_API int sqlite3changeset_pk(
/*
** CAPI3REF: Obtain old.* Values From A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** The pIter argument passed to this function may either be an iterator
** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator
@@ -10437,6 +10901,7 @@ SQLITE_API int sqlite3changeset_old(
/*
** CAPI3REF: Obtain new.* Values From A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** The pIter argument passed to this function may either be an iterator
** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator
@@ -10470,6 +10935,7 @@ SQLITE_API int sqlite3changeset_new(
/*
** CAPI3REF: Obtain Conflicting Row Values From A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** This function should only be used with iterator objects passed to a
** conflict-handler callback by [sqlite3changeset_apply()] with either
@@ -10497,6 +10963,7 @@ SQLITE_API int sqlite3changeset_conflict(
/*
** CAPI3REF: Determine The Number Of Foreign Key Constraint Violations
+** METHOD: sqlite3_changeset_iter
**
** This function may only be called with an iterator passed to an
** SQLITE_CHANGESET_FOREIGN_KEY conflict handler callback. In this case
@@ -10513,6 +10980,7 @@ SQLITE_API int sqlite3changeset_fk_conflicts(
/*
** CAPI3REF: Finalize A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** This function is used to finalize an iterator allocated with
** [sqlite3changeset_start()].
@@ -10529,6 +10997,7 @@ SQLITE_API int sqlite3changeset_fk_conflicts(
** to that error is returned by this function. Otherwise, SQLITE_OK is
** returned. This is to allow the following pattern (pseudo-code):
**
+** <pre>
** sqlite3changeset_start();
** while( SQLITE_ROW==sqlite3changeset_next() ){
** // Do something with change.
@@ -10537,6 +11006,7 @@ SQLITE_API int sqlite3changeset_fk_conflicts(
** if( rc!=SQLITE_OK ){
** // An error has occurred
** }
+** </pre>
*/
SQLITE_API int sqlite3changeset_finalize(sqlite3_changeset_iter *pIter);
@@ -10584,6 +11054,7 @@ SQLITE_API int sqlite3changeset_invert(
** sqlite3_changegroup object. Calling it produces similar results as the
** following code fragment:
**
+** <pre>
** sqlite3_changegroup *pGrp;
** rc = sqlite3_changegroup_new(&pGrp);
** if( rc==SQLITE_OK ) rc = sqlite3changegroup_add(pGrp, nA, pA);
@@ -10594,6 +11065,7 @@ SQLITE_API int sqlite3changeset_invert(
** *ppOut = 0;
** *pnOut = 0;
** }
+** </pre>
**
** Refer to the sqlite3_changegroup documentation below for details.
*/
@@ -10609,11 +11081,15 @@ SQLITE_API int sqlite3changeset_concat(
/*
** CAPI3REF: Changegroup Handle
+**
+** A changegroup is an object used to combine two or more
+** [changesets] or [patchsets]
*/
typedef struct sqlite3_changegroup sqlite3_changegroup;
/*
** CAPI3REF: Create A New Changegroup Object
+** CONSTRUCTOR: sqlite3_changegroup
**
** An sqlite3_changegroup object is used to combine two or more changesets
** (or patchsets) into a single changeset (or patchset). A single changegroup
@@ -10651,6 +11127,7 @@ SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp);
/*
** CAPI3REF: Add A Changeset To A Changegroup
+** METHOD: sqlite3_changegroup
**
** Add all changes within the changeset (or patchset) in buffer pData (size
** nData bytes) to the changegroup.
@@ -10728,6 +11205,7 @@ SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pDa
/*
** CAPI3REF: Obtain A Composite Changeset From A Changegroup
+** METHOD: sqlite3_changegroup
**
** Obtain a buffer containing a changeset (or patchset) representing the
** current contents of the changegroup. If the inputs to the changegroup
@@ -10758,25 +11236,25 @@ SQLITE_API int sqlite3changegroup_output(
/*
** CAPI3REF: Delete A Changegroup Object
+** DESTRUCTOR: sqlite3_changegroup
*/
SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*);
/*
** CAPI3REF: Apply A Changeset To A Database
**
-** Apply a changeset to a database. This function attempts to update the
-** "main" database attached to handle db with the changes found in the
-** changeset passed via the second and third arguments.
+** Apply a changeset or patchset to a database. These functions attempt to
+** update the "main" database attached to handle db with the changes found in
+** the changeset passed via the second and third arguments.
**
-** The fourth argument (xFilter) passed to this function is the "filter
+** The fourth argument (xFilter) passed to these functions is the "filter
** callback". If it is not NULL, then for each table affected by at least one
** change in the changeset, the filter callback is invoked with
** the table name as the second argument, and a copy of the context pointer
-** passed as the sixth argument to this function as the first. If the "filter
-** callback" returns zero, then no attempt is made to apply any changes to
-** the table. Otherwise, if the return value is non-zero or the xFilter
-** argument to this function is NULL, all changes related to the table are
-** attempted.
+** passed as the sixth argument as the first. If the "filter callback"
+** returns zero, then no attempt is made to apply any changes to the table.
+** Otherwise, if the return value is non-zero or the xFilter argument to
+** is NULL, all changes related to the table are attempted.
**
** For each table that is not excluded by the filter callback, this function
** tests that the target database contains a compatible table. A table is
@@ -10821,7 +11299,7 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*);
**
** <dl>
** <dt>DELETE Changes<dd>
-** For each DELETE change, this function checks if the target database
+** For each DELETE change, the function checks if the target database
** contains a row with the same primary key value (or values) as the
** original row values stored in the changeset. If it does, and the values
** stored in all non-primary key columns also match the values stored in
@@ -10866,7 +11344,7 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*);
** [SQLITE_CHANGESET_REPLACE].
**
** <dt>UPDATE Changes<dd>
-** For each UPDATE change, this function checks if the target database
+** For each UPDATE change, the function checks if the target database
** contains a row with the same primary key value (or values) as the
** original row values stored in the changeset. If it does, and the values
** stored in all modified non-primary key columns also match the values
@@ -10897,11 +11375,28 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*);
** This can be used to further customize the applications conflict
** resolution strategy.
**
-** All changes made by this function are enclosed in a savepoint transaction.
+** All changes made by these functions are enclosed in a savepoint transaction.
** If any other error (aside from a constraint failure when attempting to
** write to the target database) occurs, then the savepoint transaction is
** rolled back, restoring the target database to its original state, and an
** SQLite error code returned.
+**
+** If the output parameters (ppRebase) and (pnRebase) are non-NULL and
+** the input is a changeset (not a patchset), then sqlite3changeset_apply_v2()
+** may set (*ppRebase) to point to a "rebase" that may be used with the
+** sqlite3_rebaser APIs buffer before returning. In this case (*pnRebase)
+** is set to the size of the buffer in bytes. It is the responsibility of the
+** caller to eventually free any such buffer using sqlite3_free(). The buffer
+** is only allocated and populated if one or more conflicts were encountered
+** while applying the patchset. See comments surrounding the sqlite3_rebaser
+** APIs for further details.
+**
+** The behavior of sqlite3changeset_apply_v2() and its streaming equivalent
+** may be modified by passing a combination of
+** [SQLITE_CHANGESETAPPLY_NOSAVEPOINT | supported flags] as the 9th parameter.
+**
+** Note that the sqlite3changeset_apply_v2() API is still <b>experimental</b>
+** and therefore subject to change.
*/
SQLITE_API int sqlite3changeset_apply(
sqlite3 *db, /* Apply change to "main" db of this handle */
@@ -10918,6 +11413,41 @@ SQLITE_API int sqlite3changeset_apply(
),
void *pCtx /* First argument passed to xConflict */
);
+SQLITE_API int sqlite3changeset_apply_v2(
+ sqlite3 *db, /* Apply change to "main" db of this handle */
+ int nChangeset, /* Size of changeset in bytes */
+ void *pChangeset, /* Changeset blob */
+ int(*xFilter)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ const char *zTab /* Table name */
+ ),
+ int(*xConflict)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */
+ sqlite3_changeset_iter *p /* Handle describing change and conflict */
+ ),
+ void *pCtx, /* First argument passed to xConflict */
+ void **ppRebase, int *pnRebase, /* OUT: Rebase data */
+ int flags /* Combination of SESSION_APPLY_* flags */
+);
+
+/*
+** CAPI3REF: Flags for sqlite3changeset_apply_v2
+**
+** The following flags may passed via the 9th parameter to
+** [sqlite3changeset_apply_v2] and [sqlite3changeset_apply_v2_strm]:
+**
+** <dl>
+** <dt>SQLITE_CHANGESETAPPLY_NOSAVEPOINT <dd>
+** Usually, the sessions module encloses all operations performed by
+** a single call to apply_v2() or apply_v2_strm() in a [SAVEPOINT]. The
+** SAVEPOINT is committed if the changeset or patchset is successfully
+** applied, or rolled back if an error occurs. Specifying this flag
+** causes the sessions module to omit this savepoint. In this case, if the
+** caller has an open transaction or savepoint when apply_v2() is called,
+** it may revert the partially applied changeset by rolling it back.
+*/
+#define SQLITE_CHANGESETAPPLY_NOSAVEPOINT 0x0001
/*
** CAPI3REF: Constants Passed To The Conflict Handler
@@ -11015,6 +11545,161 @@ SQLITE_API int sqlite3changeset_apply(
#define SQLITE_CHANGESET_REPLACE 1
#define SQLITE_CHANGESET_ABORT 2
+/*
+** CAPI3REF: Rebasing changesets
+** EXPERIMENTAL
+**
+** Suppose there is a site hosting a database in state S0. And that
+** modifications are made that move that database to state S1 and a
+** changeset recorded (the "local" changeset). Then, a changeset based
+** on S0 is received from another site (the "remote" changeset) and
+** applied to the database. The database is then in state
+** (S1+"remote"), where the exact state depends on any conflict
+** resolution decisions (OMIT or REPLACE) made while applying "remote".
+** Rebasing a changeset is to update it to take those conflict
+** resolution decisions into account, so that the same conflicts
+** do not have to be resolved elsewhere in the network.
+**
+** For example, if both the local and remote changesets contain an
+** INSERT of the same key on "CREATE TABLE t1(a PRIMARY KEY, b)":
+**
+** local: INSERT INTO t1 VALUES(1, 'v1');
+** remote: INSERT INTO t1 VALUES(1, 'v2');
+**
+** and the conflict resolution is REPLACE, then the INSERT change is
+** removed from the local changeset (it was overridden). Or, if the
+** conflict resolution was "OMIT", then the local changeset is modified
+** to instead contain:
+**
+** UPDATE t1 SET b = 'v2' WHERE a=1;
+**
+** Changes within the local changeset are rebased as follows:
+**
+** <dl>
+** <dt>Local INSERT<dd>
+** This may only conflict with a remote INSERT. If the conflict
+** resolution was OMIT, then add an UPDATE change to the rebased
+** changeset. Or, if the conflict resolution was REPLACE, add
+** nothing to the rebased changeset.
+**
+** <dt>Local DELETE<dd>
+** This may conflict with a remote UPDATE or DELETE. In both cases the
+** only possible resolution is OMIT. If the remote operation was a
+** DELETE, then add no change to the rebased changeset. If the remote
+** operation was an UPDATE, then the old.* fields of change are updated
+** to reflect the new.* values in the UPDATE.
+**
+** <dt>Local UPDATE<dd>
+** This may conflict with a remote UPDATE or DELETE. If it conflicts
+** with a DELETE, and the conflict resolution was OMIT, then the update
+** is changed into an INSERT. Any undefined values in the new.* record
+** from the update change are filled in using the old.* values from
+** the conflicting DELETE. Or, if the conflict resolution was REPLACE,
+** the UPDATE change is simply omitted from the rebased changeset.
+**
+** If conflict is with a remote UPDATE and the resolution is OMIT, then
+** the old.* values are rebased using the new.* values in the remote
+** change. Or, if the resolution is REPLACE, then the change is copied
+** into the rebased changeset with updates to columns also updated by
+** the conflicting remote UPDATE removed. If this means no columns would
+** be updated, the change is omitted.
+** </dl>
+**
+** A local change may be rebased against multiple remote changes
+** simultaneously. If a single key is modified by multiple remote
+** changesets, they are combined as follows before the local changeset
+** is rebased:
+**
+** <ul>
+** <li> If there has been one or more REPLACE resolutions on a
+** key, it is rebased according to a REPLACE.
+**
+** <li> If there have been no REPLACE resolutions on a key, then
+** the local changeset is rebased according to the most recent
+** of the OMIT resolutions.
+** </ul>
+**
+** Note that conflict resolutions from multiple remote changesets are
+** combined on a per-field basis, not per-row. This means that in the
+** case of multiple remote UPDATE operations, some fields of a single
+** local change may be rebased for REPLACE while others are rebased for
+** OMIT.
+**
+** In order to rebase a local changeset, the remote changeset must first
+** be applied to the local database using sqlite3changeset_apply_v2() and
+** the buffer of rebase information captured. Then:
+**
+** <ol>
+** <li> An sqlite3_rebaser object is created by calling
+** sqlite3rebaser_create().
+** <li> The new object is configured with the rebase buffer obtained from
+** sqlite3changeset_apply_v2() by calling sqlite3rebaser_configure().
+** If the local changeset is to be rebased against multiple remote
+** changesets, then sqlite3rebaser_configure() should be called
+** multiple times, in the same order that the multiple
+** sqlite3changeset_apply_v2() calls were made.
+** <li> Each local changeset is rebased by calling sqlite3rebaser_rebase().
+** <li> The sqlite3_rebaser object is deleted by calling
+** sqlite3rebaser_delete().
+** </ol>
+*/
+typedef struct sqlite3_rebaser sqlite3_rebaser;
+
+/*
+** CAPI3REF: Create a changeset rebaser object.
+** EXPERIMENTAL
+**
+** Allocate a new changeset rebaser object. If successful, set (*ppNew) to
+** point to the new object and return SQLITE_OK. Otherwise, if an error
+** occurs, return an SQLite error code (e.g. SQLITE_NOMEM) and set (*ppNew)
+** to NULL.
+*/
+SQLITE_API int sqlite3rebaser_create(sqlite3_rebaser **ppNew);
+
+/*
+** CAPI3REF: Configure a changeset rebaser object.
+** EXPERIMENTAL
+**
+** Configure the changeset rebaser object to rebase changesets according
+** to the conflict resolutions described by buffer pRebase (size nRebase
+** bytes), which must have been obtained from a previous call to
+** sqlite3changeset_apply_v2().
+*/
+SQLITE_API int sqlite3rebaser_configure(
+ sqlite3_rebaser*,
+ int nRebase, const void *pRebase
+);
+
+/*
+** CAPI3REF: Rebase a changeset
+** EXPERIMENTAL
+**
+** Argument pIn must point to a buffer containing a changeset nIn bytes
+** in size. This function allocates and populates a buffer with a copy
+** of the changeset rebased rebased according to the configuration of the
+** rebaser object passed as the first argument. If successful, (*ppOut)
+** is set to point to the new buffer containing the rebased changset and
+** (*pnOut) to its size in bytes and SQLITE_OK returned. It is the
+** responsibility of the caller to eventually free the new buffer using
+** sqlite3_free(). Otherwise, if an error occurs, (*ppOut) and (*pnOut)
+** are set to zero and an SQLite error code returned.
+*/
+SQLITE_API int sqlite3rebaser_rebase(
+ sqlite3_rebaser*,
+ int nIn, const void *pIn,
+ int *pnOut, void **ppOut
+);
+
+/*
+** CAPI3REF: Delete a changeset rebaser object.
+** EXPERIMENTAL
+**
+** Delete the changeset rebaser object and all associated resources. There
+** should be one call to this function for each successful invocation
+** of sqlite3rebaser_create().
+*/
+SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p);
+
/*
** CAPI3REF: Streaming Versions of API functions.
**
@@ -11024,6 +11709,7 @@ SQLITE_API int sqlite3changeset_apply(
** <table border=1 style="margin-left:8ex;margin-right:8ex">
** <tr><th>Streaming function<th>Non-streaming equivalent</th>
** <tr><td>sqlite3changeset_apply_strm<td>[sqlite3changeset_apply]
+** <tr><td>sqlite3changeset_apply_strm_v2<td>[sqlite3changeset_apply_v2]
** <tr><td>sqlite3changeset_concat_strm<td>[sqlite3changeset_concat]
** <tr><td>sqlite3changeset_invert_strm<td>[sqlite3changeset_invert]
** <tr><td>sqlite3changeset_start_strm<td>[sqlite3changeset_start]
@@ -11119,6 +11805,23 @@ SQLITE_API int sqlite3changeset_apply_strm(
),
void *pCtx /* First argument passed to xConflict */
);
+SQLITE_API int sqlite3changeset_apply_v2_strm(
+ sqlite3 *db, /* Apply change to "main" db of this handle */
+ int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */
+ void *pIn, /* First arg for xInput */
+ int(*xFilter)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ const char *zTab /* Table name */
+ ),
+ int(*xConflict)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */
+ sqlite3_changeset_iter *p /* Handle describing change and conflict */
+ ),
+ void *pCtx, /* First argument passed to xConflict */
+ void **ppRebase, int *pnRebase,
+ int flags
+);
SQLITE_API int sqlite3changeset_concat_strm(
int (*xInputA)(void *pIn, void *pData, int *pnData),
void *pInA,
@@ -11156,6 +11859,13 @@ SQLITE_API int sqlite3changegroup_output_strm(sqlite3_changegroup*,
int (*xOutput)(void *pOut, const void *pData, int nData),
void *pOut
);
+SQLITE_API int sqlite3rebaser_rebase_strm(
+ sqlite3_rebaser *pRebaser,
+ int (*xInput)(void *pIn, void *pData, int *pnData),
+ void *pIn,
+ int (*xOutput)(void *pOut, const void *pData, int nData),
+ void *pOut
+);
/*
@@ -12491,105 +13201,109 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*);
#define TK_ESCAPE 58
#define TK_ID 59
#define TK_COLUMNKW 60
-#define TK_FOR 61
-#define TK_IGNORE 62
-#define TK_INITIALLY 63
-#define TK_INSTEAD 64
-#define TK_NO 65
-#define TK_KEY 66
-#define TK_OF 67
-#define TK_OFFSET 68
-#define TK_PRAGMA 69
-#define TK_RAISE 70
-#define TK_RECURSIVE 71
-#define TK_REPLACE 72
-#define TK_RESTRICT 73
-#define TK_ROW 74
-#define TK_TRIGGER 75
-#define TK_VACUUM 76
-#define TK_VIEW 77
-#define TK_VIRTUAL 78
-#define TK_WITH 79
-#define TK_REINDEX 80
-#define TK_RENAME 81
-#define TK_CTIME_KW 82
-#define TK_ANY 83
-#define TK_BITAND 84
-#define TK_BITOR 85
-#define TK_LSHIFT 86
-#define TK_RSHIFT 87
-#define TK_PLUS 88
-#define TK_MINUS 89
-#define TK_STAR 90
-#define TK_SLASH 91
-#define TK_REM 92
-#define TK_CONCAT 93
-#define TK_COLLATE 94
-#define TK_BITNOT 95
-#define TK_INDEXED 96
-#define TK_STRING 97
-#define TK_JOIN_KW 98
-#define TK_CONSTRAINT 99
-#define TK_DEFAULT 100
-#define TK_NULL 101
-#define TK_PRIMARY 102
-#define TK_UNIQUE 103
-#define TK_CHECK 104
-#define TK_REFERENCES 105
-#define TK_AUTOINCR 106
-#define TK_ON 107
-#define TK_INSERT 108
-#define TK_DELETE 109
-#define TK_UPDATE 110
-#define TK_SET 111
-#define TK_DEFERRABLE 112
-#define TK_FOREIGN 113
-#define TK_DROP 114
-#define TK_UNION 115
-#define TK_ALL 116
-#define TK_EXCEPT 117
-#define TK_INTERSECT 118
-#define TK_SELECT 119
-#define TK_VALUES 120
-#define TK_DISTINCT 121
-#define TK_DOT 122
-#define TK_FROM 123
-#define TK_JOIN 124
-#define TK_USING 125
-#define TK_ORDER 126
-#define TK_GROUP 127
-#define TK_HAVING 128
-#define TK_LIMIT 129
-#define TK_WHERE 130
-#define TK_INTO 131
-#define TK_FLOAT 132
-#define TK_BLOB 133
-#define TK_INTEGER 134
-#define TK_VARIABLE 135
-#define TK_CASE 136
-#define TK_WHEN 137
-#define TK_THEN 138
-#define TK_ELSE 139
-#define TK_INDEX 140
-#define TK_ALTER 141
-#define TK_ADD 142
-#define TK_ISNOT 143
-#define TK_FUNCTION 144
-#define TK_COLUMN 145
-#define TK_AGG_FUNCTION 146
-#define TK_AGG_COLUMN 147
-#define TK_UMINUS 148
-#define TK_UPLUS 149
-#define TK_REGISTER 150
-#define TK_VECTOR 151
-#define TK_SELECT_COLUMN 152
-#define TK_IF_NULL_ROW 153
-#define TK_ASTERISK 154
-#define TK_SPAN 155
-#define TK_END_OF_FILE 156
-#define TK_UNCLOSED_STRING 157
-#define TK_SPACE 158
-#define TK_ILLEGAL 159
+#define TK_DO 61
+#define TK_FOR 62
+#define TK_IGNORE 63
+#define TK_INITIALLY 64
+#define TK_INSTEAD 65
+#define TK_NO 66
+#define TK_KEY 67
+#define TK_OF 68
+#define TK_OFFSET 69
+#define TK_PRAGMA 70
+#define TK_RAISE 71
+#define TK_RECURSIVE 72
+#define TK_REPLACE 73
+#define TK_RESTRICT 74
+#define TK_ROW 75
+#define TK_TRIGGER 76
+#define TK_VACUUM 77
+#define TK_VIEW 78
+#define TK_VIRTUAL 79
+#define TK_WITH 80
+#define TK_REINDEX 81
+#define TK_RENAME 82
+#define TK_CTIME_KW 83
+#define TK_ANY 84
+#define TK_BITAND 85
+#define TK_BITOR 86
+#define TK_LSHIFT 87
+#define TK_RSHIFT 88
+#define TK_PLUS 89
+#define TK_MINUS 90
+#define TK_STAR 91
+#define TK_SLASH 92
+#define TK_REM 93
+#define TK_CONCAT 94
+#define TK_COLLATE 95
+#define TK_BITNOT 96
+#define TK_ON 97
+#define TK_INDEXED 98
+#define TK_STRING 99
+#define TK_JOIN_KW 100
+#define TK_CONSTRAINT 101
+#define TK_DEFAULT 102
+#define TK_NULL 103
+#define TK_PRIMARY 104
+#define TK_UNIQUE 105
+#define TK_CHECK 106
+#define TK_REFERENCES 107
+#define TK_AUTOINCR 108
+#define TK_INSERT 109
+#define TK_DELETE 110
+#define TK_UPDATE 111
+#define TK_SET 112
+#define TK_DEFERRABLE 113
+#define TK_FOREIGN 114
+#define TK_DROP 115
+#define TK_UNION 116
+#define TK_ALL 117
+#define TK_EXCEPT 118
+#define TK_INTERSECT 119
+#define TK_SELECT 120
+#define TK_VALUES 121
+#define TK_DISTINCT 122
+#define TK_DOT 123
+#define TK_FROM 124
+#define TK_JOIN 125
+#define TK_USING 126
+#define TK_ORDER 127
+#define TK_GROUP 128
+#define TK_HAVING 129
+#define TK_LIMIT 130
+#define TK_WHERE 131
+#define TK_INTO 132
+#define TK_NOTHING 133
+#define TK_FLOAT 134
+#define TK_BLOB 135
+#define TK_INTEGER 136
+#define TK_VARIABLE 137
+#define TK_CASE 138
+#define TK_WHEN 139
+#define TK_THEN 140
+#define TK_ELSE 141
+#define TK_INDEX 142
+#define TK_ALTER 143
+#define TK_ADD 144
+#define TK_TRUEFALSE 145
+#define TK_ISNOT 146
+#define TK_FUNCTION 147
+#define TK_COLUMN 148
+#define TK_AGG_FUNCTION 149
+#define TK_AGG_COLUMN 150
+#define TK_UMINUS 151
+#define TK_UPLUS 152
+#define TK_TRUTH 153
+#define TK_REGISTER 154
+#define TK_VECTOR 155
+#define TK_SELECT_COLUMN 156
+#define TK_IF_NULL_ROW 157
+#define TK_ASTERISK 158
+#define TK_SPAN 159
+#define TK_END_OF_FILE 160
+#define TK_UNCLOSED_STRING 161
+#define TK_SPACE 162
+#define TK_ILLEGAL 163
/* The token codes above must all fit in 8 bits */
#define TKFLG_MASK 0xff
@@ -12710,6 +13424,13 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*);
#endif
/*
+** Default value for the SQLITE_CONFIG_SORTERREF_SIZE option.
+*/
+#ifndef SQLITE_DEFAULT_SORTERREF_SIZE
+# define SQLITE_DEFAULT_SORTERREF_SIZE 0x7fffffff
+#endif
+
+/*
** The compile-time options SQLITE_MMAP_READWRITE and
** SQLITE_ENABLE_BATCH_ATOMIC_WRITE are not compatible with one another.
** You must choose one or the other (or neither) but not both.
@@ -13033,9 +13754,10 @@ typedef INT16_TYPE LogEst;
*/
typedef struct BusyHandler BusyHandler;
struct BusyHandler {
- int (*xFunc)(void *,int); /* The busy callback */
- void *pArg; /* First arg to busy callback */
- int nBusy; /* Incremented with each busy call */
+ int (*xBusyHandler)(void *,int); /* The busy callback */
+ void *pBusyArg; /* First arg to busy callback */
+ int nBusy; /* Incremented with each busy call */
+ u8 bExtraFileArg; /* Include sqlite3_file as callback arg */
};
/*
@@ -13135,7 +13857,6 @@ typedef struct Db Db;
typedef struct Schema Schema;
typedef struct Expr Expr;
typedef struct ExprList ExprList;
-typedef struct ExprSpan ExprSpan;
typedef struct FKey FKey;
typedef struct FuncDestructor FuncDestructor;
typedef struct FuncDef FuncDef;
@@ -13158,7 +13879,7 @@ typedef struct Select Select;
typedef struct SQLiteThread SQLiteThread;
typedef struct SelectDest SelectDest;
typedef struct SrcList SrcList;
-typedef struct StrAccum StrAccum;
+typedef struct sqlite3_str StrAccum; /* Internal alias for sqlite3_str */
typedef struct Table Table;
typedef struct TableLock TableLock;
typedef struct Token Token;
@@ -13167,6 +13888,7 @@ typedef struct Trigger Trigger;
typedef struct TriggerPrg TriggerPrg;
typedef struct TriggerStep TriggerStep;
typedef struct UnpackedRecord UnpackedRecord;
+typedef struct Upsert Upsert;
typedef struct VTable VTable;
typedef struct VtabCtx VtabCtx;
typedef struct Walker Walker;
@@ -13449,13 +14171,28 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor*, u8 flags);
** entry in either an index or table btree.
**
** Index btrees (used for indexes and also WITHOUT ROWID tables) contain
-** an arbitrary key and no data. These btrees have pKey,nKey set to their
-** key and pData,nData,nZero set to zero.
+** an arbitrary key and no data. These btrees have pKey,nKey set to the
+** key and the pData,nData,nZero fields are uninitialized. The aMem,nMem
+** fields give an array of Mem objects that are a decomposition of the key.
+** The nMem field might be zero, indicating that no decomposition is available.
**
** Table btrees (used for rowid tables) contain an integer rowid used as
** the key and passed in the nKey field. The pKey field is zero.
** pData,nData hold the content of the new entry. nZero extra zero bytes
** are appended to the end of the content when constructing the entry.
+** The aMem,nMem fields are uninitialized for table btrees.
+**
+** Field usage summary:
+**
+** Table BTrees Index Btrees
+**
+** pKey always NULL encoded key
+** nKey the ROWID length of pKey
+** pData data not used
+** aMem not used decomposed key value
+** nMem not used entries in aMem
+** nData length of pData not used
+** nZero extra zeros after pData not used
**
** This object is used to pass information into sqlite3BtreeInsert(). The
** same information used to be passed as five separate parameters. But placing
@@ -13466,7 +14203,7 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor*, u8 flags);
struct BtreePayload {
const void *pKey; /* Key content for indexes. NULL for tables */
sqlite3_int64 nKey; /* Size of pKey for indexes. PRIMARY KEY for tabs */
- const void *pData; /* Data for tables. NULL for indexes */
+ const void *pData; /* Data for tables. */
sqlite3_value *aMem; /* First of nMem value in the unpacked pKey */
u16 nMem; /* Number of aMem[] value. Might be zero */
int nData; /* Size of pData. 0 if none. */
@@ -13481,6 +14218,9 @@ SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor*, int flags);
SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor*);
SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor*, int flags);
SQLITE_PRIVATE i64 sqlite3BtreeIntegerKey(BtCursor*);
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+SQLITE_PRIVATE i64 sqlite3BtreeOffset(BtCursor*);
+#endif
SQLITE_PRIVATE int sqlite3BtreePayload(BtCursor*, u32 offset, u32 amt, void*);
SQLITE_PRIVATE const void *sqlite3BtreePayloadFetch(BtCursor*, u32 *pAmt);
SQLITE_PRIVATE u32 sqlite3BtreePayloadSize(BtCursor*);
@@ -13694,6 +14434,7 @@ typedef struct VdbeOpList VdbeOpList;
#define P4_INT64 (-14) /* P4 is a 64-bit signed integer */
#define P4_INTARRAY (-15) /* P4 is a vector of 32-bit integers */
#define P4_FUNCCTX (-16) /* P4 is a pointer to an sqlite3_context object */
+#define P4_DYNBLOB (-17) /* Pointer to memory from sqliteMalloc() */
/* Error message codes for OP_Halt */
#define P5_ConstraintNotNull 1
@@ -13820,90 +14561,94 @@ typedef struct VdbeOpList VdbeOpList;
#define OP_RealAffinity 81
#define OP_Cast 82 /* synopsis: affinity(r[P1]) */
#define OP_Permutation 83
-#define OP_BitAnd 84 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */
-#define OP_BitOr 85 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */
-#define OP_ShiftLeft 86 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<<r[P1] */
-#define OP_ShiftRight 87 /* same as TK_RSHIFT, synopsis: r[P3]=r[P2]>>r[P1] */
-#define OP_Add 88 /* same as TK_PLUS, synopsis: r[P3]=r[P1]+r[P2] */
-#define OP_Subtract 89 /* same as TK_MINUS, synopsis: r[P3]=r[P2]-r[P1] */
-#define OP_Multiply 90 /* same as TK_STAR, synopsis: r[P3]=r[P1]*r[P2] */
-#define OP_Divide 91 /* same as TK_SLASH, synopsis: r[P3]=r[P2]/r[P1] */
-#define OP_Remainder 92 /* same as TK_REM, synopsis: r[P3]=r[P2]%r[P1] */
-#define OP_Concat 93 /* same as TK_CONCAT, synopsis: r[P3]=r[P2]+r[P1] */
-#define OP_Compare 94 /* synopsis: r[P1@P3] <-> r[P2@P3] */
-#define OP_BitNot 95 /* same as TK_BITNOT, synopsis: r[P1]= ~r[P1] */
-#define OP_Column 96 /* synopsis: r[P3]=PX */
-#define OP_String8 97 /* same as TK_STRING, synopsis: r[P2]='P4' */
-#define OP_Affinity 98 /* synopsis: affinity(r[P1@P2]) */
-#define OP_MakeRecord 99 /* synopsis: r[P3]=mkrec(r[P1@P2]) */
-#define OP_Count 100 /* synopsis: r[P2]=count() */
-#define OP_ReadCookie 101
-#define OP_SetCookie 102
-#define OP_ReopenIdx 103 /* synopsis: root=P2 iDb=P3 */
-#define OP_OpenRead 104 /* synopsis: root=P2 iDb=P3 */
-#define OP_OpenWrite 105 /* synopsis: root=P2 iDb=P3 */
-#define OP_OpenDup 106
-#define OP_OpenAutoindex 107 /* synopsis: nColumn=P2 */
-#define OP_OpenEphemeral 108 /* synopsis: nColumn=P2 */
-#define OP_SorterOpen 109
-#define OP_SequenceTest 110 /* synopsis: if( cursor[P1].ctr++ ) pc = P2 */
-#define OP_OpenPseudo 111 /* synopsis: P3 columns in r[P2] */
-#define OP_Close 112
-#define OP_ColumnsUsed 113
-#define OP_Sequence 114 /* synopsis: r[P2]=cursor[P1].ctr++ */
-#define OP_NewRowid 115 /* synopsis: r[P2]=rowid */
-#define OP_Insert 116 /* synopsis: intkey=r[P3] data=r[P2] */
-#define OP_InsertInt 117 /* synopsis: intkey=P3 data=r[P2] */
-#define OP_Delete 118
-#define OP_ResetCount 119
-#define OP_SorterCompare 120 /* synopsis: if key(P1)!=trim(r[P3],P4) goto P2 */
-#define OP_SorterData 121 /* synopsis: r[P2]=data */
-#define OP_RowData 122 /* synopsis: r[P2]=data */
-#define OP_Rowid 123 /* synopsis: r[P2]=rowid */
-#define OP_NullRow 124
-#define OP_SeekEnd 125
-#define OP_SorterInsert 126 /* synopsis: key=r[P2] */
-#define OP_IdxInsert 127 /* synopsis: key=r[P2] */
-#define OP_IdxDelete 128 /* synopsis: key=r[P2@P3] */
-#define OP_DeferredSeek 129 /* synopsis: Move P3 to P1.rowid if needed */
-#define OP_IdxRowid 130 /* synopsis: r[P2]=rowid */
-#define OP_Destroy 131
-#define OP_Real 132 /* same as TK_FLOAT, synopsis: r[P2]=P4 */
-#define OP_Clear 133
-#define OP_ResetSorter 134
-#define OP_CreateBtree 135 /* synopsis: r[P2]=root iDb=P1 flags=P3 */
-#define OP_SqlExec 136
-#define OP_ParseSchema 137
-#define OP_LoadAnalysis 138
-#define OP_DropTable 139
-#define OP_DropIndex 140
-#define OP_DropTrigger 141
-#define OP_IntegrityCk 142
-#define OP_RowSetAdd 143 /* synopsis: rowset(P1)=r[P2] */
-#define OP_Param 144
-#define OP_FkCounter 145 /* synopsis: fkctr[P1]+=P2 */
-#define OP_MemMax 146 /* synopsis: r[P1]=max(r[P1],r[P2]) */
-#define OP_OffsetLimit 147 /* synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */
-#define OP_AggStep0 148 /* synopsis: accum=r[P3] step(r[P2@P5]) */
-#define OP_AggStep 149 /* synopsis: accum=r[P3] step(r[P2@P5]) */
-#define OP_AggFinal 150 /* synopsis: accum=r[P1] N=P2 */
-#define OP_Expire 151
-#define OP_TableLock 152 /* synopsis: iDb=P1 root=P2 write=P3 */
-#define OP_VBegin 153
-#define OP_VCreate 154
-#define OP_VDestroy 155
-#define OP_VOpen 156
-#define OP_VColumn 157 /* synopsis: r[P3]=vcolumn(P2) */
-#define OP_VRename 158
-#define OP_Pagecount 159
-#define OP_MaxPgcnt 160
-#define OP_PureFunc0 161
-#define OP_Function0 162 /* synopsis: r[P3]=func(r[P2@P5]) */
-#define OP_PureFunc 163
-#define OP_Function 164 /* synopsis: r[P3]=func(r[P2@P5]) */
-#define OP_CursorHint 165
-#define OP_Noop 166
-#define OP_Explain 167
+#define OP_Compare 84 /* synopsis: r[P1@P3] <-> r[P2@P3] */
+#define OP_BitAnd 85 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */
+#define OP_BitOr 86 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */
+#define OP_ShiftLeft 87 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<<r[P1] */
+#define OP_ShiftRight 88 /* same as TK_RSHIFT, synopsis: r[P3]=r[P2]>>r[P1] */
+#define OP_Add 89 /* same as TK_PLUS, synopsis: r[P3]=r[P1]+r[P2] */
+#define OP_Subtract 90 /* same as TK_MINUS, synopsis: r[P3]=r[P2]-r[P1] */
+#define OP_Multiply 91 /* same as TK_STAR, synopsis: r[P3]=r[P1]*r[P2] */
+#define OP_Divide 92 /* same as TK_SLASH, synopsis: r[P3]=r[P2]/r[P1] */
+#define OP_Remainder 93 /* same as TK_REM, synopsis: r[P3]=r[P2]%r[P1] */
+#define OP_Concat 94 /* same as TK_CONCAT, synopsis: r[P3]=r[P2]+r[P1] */
+#define OP_IsTrue 95 /* synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4 */
+#define OP_BitNot 96 /* same as TK_BITNOT, synopsis: r[P1]= ~r[P1] */
+#define OP_Offset 97 /* synopsis: r[P3] = sqlite_offset(P1) */
+#define OP_Column 98 /* synopsis: r[P3]=PX */
+#define OP_String8 99 /* same as TK_STRING, synopsis: r[P2]='P4' */
+#define OP_Affinity 100 /* synopsis: affinity(r[P1@P2]) */
+#define OP_MakeRecord 101 /* synopsis: r[P3]=mkrec(r[P1@P2]) */
+#define OP_Count 102 /* synopsis: r[P2]=count() */
+#define OP_ReadCookie 103
+#define OP_SetCookie 104
+#define OP_ReopenIdx 105 /* synopsis: root=P2 iDb=P3 */
+#define OP_OpenRead 106 /* synopsis: root=P2 iDb=P3 */
+#define OP_OpenWrite 107 /* synopsis: root=P2 iDb=P3 */
+#define OP_OpenDup 108
+#define OP_OpenAutoindex 109 /* synopsis: nColumn=P2 */
+#define OP_OpenEphemeral 110 /* synopsis: nColumn=P2 */
+#define OP_SorterOpen 111
+#define OP_SequenceTest 112 /* synopsis: if( cursor[P1].ctr++ ) pc = P2 */
+#define OP_OpenPseudo 113 /* synopsis: P3 columns in r[P2] */
+#define OP_Close 114
+#define OP_ColumnsUsed 115
+#define OP_Sequence 116 /* synopsis: r[P2]=cursor[P1].ctr++ */
+#define OP_NewRowid 117 /* synopsis: r[P2]=rowid */
+#define OP_Insert 118 /* synopsis: intkey=r[P3] data=r[P2] */
+#define OP_InsertInt 119 /* synopsis: intkey=P3 data=r[P2] */
+#define OP_Delete 120
+#define OP_ResetCount 121
+#define OP_SorterCompare 122 /* synopsis: if key(P1)!=trim(r[P3],P4) goto P2 */
+#define OP_SorterData 123 /* synopsis: r[P2]=data */
+#define OP_RowData 124 /* synopsis: r[P2]=data */
+#define OP_Rowid 125 /* synopsis: r[P2]=rowid */
+#define OP_NullRow 126
+#define OP_SeekEnd 127
+#define OP_SorterInsert 128 /* synopsis: key=r[P2] */
+#define OP_IdxInsert 129 /* synopsis: key=r[P2] */
+#define OP_IdxDelete 130 /* synopsis: key=r[P2@P3] */
+#define OP_DeferredSeek 131 /* synopsis: Move P3 to P1.rowid if needed */
+#define OP_IdxRowid 132 /* synopsis: r[P2]=rowid */
+#define OP_Destroy 133
+#define OP_Real 134 /* same as TK_FLOAT, synopsis: r[P2]=P4 */
+#define OP_Clear 135
+#define OP_ResetSorter 136
+#define OP_CreateBtree 137 /* synopsis: r[P2]=root iDb=P1 flags=P3 */
+#define OP_SqlExec 138
+#define OP_ParseSchema 139
+#define OP_LoadAnalysis 140
+#define OP_DropTable 141
+#define OP_DropIndex 142
+#define OP_DropTrigger 143
+#define OP_IntegrityCk 144
+#define OP_RowSetAdd 145 /* synopsis: rowset(P1)=r[P2] */
+#define OP_Param 146
+#define OP_FkCounter 147 /* synopsis: fkctr[P1]+=P2 */
+#define OP_MemMax 148 /* synopsis: r[P1]=max(r[P1],r[P2]) */
+#define OP_OffsetLimit 149 /* synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */
+#define OP_AggStep0 150 /* synopsis: accum=r[P3] step(r[P2@P5]) */
+#define OP_AggStep 151 /* synopsis: accum=r[P3] step(r[P2@P5]) */
+#define OP_AggFinal 152 /* synopsis: accum=r[P1] N=P2 */
+#define OP_Expire 153
+#define OP_TableLock 154 /* synopsis: iDb=P1 root=P2 write=P3 */
+#define OP_VBegin 155
+#define OP_VCreate 156
+#define OP_VDestroy 157
+#define OP_VOpen 158
+#define OP_VColumn 159 /* synopsis: r[P3]=vcolumn(P2) */
+#define OP_VRename 160
+#define OP_Pagecount 161
+#define OP_MaxPgcnt 162
+#define OP_PureFunc0 163
+#define OP_Function0 164 /* synopsis: r[P3]=func(r[P2@P5]) */
+#define OP_PureFunc 165
+#define OP_Function 166 /* synopsis: r[P3]=func(r[P2@P5]) */
+#define OP_Trace 167
+#define OP_CursorHint 168
+#define OP_Noop 169
+#define OP_Explain 170
+#define OP_Abortable 171
/* Properties such as "out2" or "jump" that are specified in
** comments following the "case" for each opcode in the vdbe.c
@@ -13926,18 +14671,18 @@ typedef struct VdbeOpList VdbeOpList;
/* 56 */ 0x0b, 0x0b, 0x01, 0x03, 0x01, 0x01, 0x01, 0x02,\
/* 64 */ 0x02, 0x08, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00,\
/* 72 */ 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\
-/* 80 */ 0x02, 0x02, 0x02, 0x00, 0x26, 0x26, 0x26, 0x26,\
-/* 88 */ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x00, 0x12,\
-/* 96 */ 0x00, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\
+/* 80 */ 0x02, 0x02, 0x02, 0x00, 0x00, 0x26, 0x26, 0x26,\
+/* 88 */ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x12,\
+/* 96 */ 0x12, 0x20, 0x00, 0x10, 0x00, 0x00, 0x10, 0x10,\
/* 104 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
-/* 112 */ 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,\
-/* 120 */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x04, 0x04,\
-/* 128 */ 0x00, 0x00, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10,\
-/* 136 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,\
-/* 144 */ 0x10, 0x00, 0x04, 0x1a, 0x00, 0x00, 0x00, 0x00,\
-/* 152 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,\
-/* 160 */ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
-}
+/* 112 */ 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\
+/* 120 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,\
+/* 128 */ 0x04, 0x04, 0x00, 0x00, 0x10, 0x10, 0x10, 0x00,\
+/* 136 */ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
+/* 144 */ 0x00, 0x06, 0x10, 0x00, 0x04, 0x1a, 0x00, 0x00,\
+/* 152 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
+/* 160 */ 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,\
+/* 168 */ 0x00, 0x00, 0x00, 0x00,}
/* The sqlite3P2Values() routine is able to run faster if it knows
** the value of the largest JUMP opcode. The smaller the maximum
@@ -13979,7 +14724,24 @@ SQLITE_PRIVATE void sqlite3VdbeVerifyNoResultRow(Vdbe *p);
# define sqlite3VdbeVerifyNoMallocRequired(A,B)
# define sqlite3VdbeVerifyNoResultRow(A)
#endif
-SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp, int iLineno);
+#if defined(SQLITE_DEBUG)
+SQLITE_PRIVATE void sqlite3VdbeVerifyAbortable(Vdbe *p, int);
+#else
+# define sqlite3VdbeVerifyAbortable(A,B)
+#endif
+SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp,int iLineno);
+#ifndef SQLITE_OMIT_EXPLAIN
+SQLITE_PRIVATE void sqlite3VdbeExplain(Parse*,u8,const char*,...);
+SQLITE_PRIVATE void sqlite3VdbeExplainPop(Parse*);
+SQLITE_PRIVATE int sqlite3VdbeExplainParent(Parse*);
+# define ExplainQueryPlan(P) sqlite3VdbeExplain P
+# define ExplainQueryPlanPop(P) sqlite3VdbeExplainPop(P)
+# define ExplainQueryPlanParent(P) sqlite3VdbeExplainParent(P)
+#else
+# define ExplainQueryPlan(P)
+# define ExplainQueryPlanPop(P)
+# define ExplainQueryPlanParent(P) 0
+#endif
SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*);
SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe*, u32 addr, u8);
SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, u32 addr, int P1);
@@ -14002,6 +14764,9 @@ SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3*,Vdbe*);
SQLITE_PRIVATE void sqlite3VdbeMakeReady(Vdbe*,Parse*);
SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe*);
SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe*, int);
+#ifdef SQLITE_COVERAGE_TEST
+SQLITE_PRIVATE int sqlite3VdbeLabelHasBeenResolved(Vdbe*,int);
+#endif
SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe*);
#ifdef SQLITE_DEBUG
SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *, int);
@@ -14238,7 +15003,7 @@ SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager, sqlite3*);
SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager*, int, unsigned char*);
/* Functions used to configure a Pager object. */
-SQLITE_PRIVATE void sqlite3PagerSetBusyhandler(Pager*, int(*)(void *), void *);
+SQLITE_PRIVATE void sqlite3PagerSetBusyHandler(Pager*, int(*)(void *), void *);
SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager*, u32*, int);
#ifdef SQLITE_HAS_CODEC
SQLITE_PRIVATE void sqlite3PagerAlignReserve(Pager*,Pager*);
@@ -14324,6 +15089,11 @@ SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager*);
SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *, int, int, int *);
SQLITE_PRIVATE void sqlite3PagerClearCache(Pager*);
SQLITE_PRIVATE int sqlite3SectorSize(sqlite3_file *);
+#ifdef SQLITE_ENABLE_SETLK_TIMEOUT
+SQLITE_PRIVATE void sqlite3PagerResetLockTimeout(Pager *pPager);
+#else
+# define sqlite3PagerResetLockTimeout(X)
+#endif
/* Functions used to truncate the database file. */
SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager*,Pgno);
@@ -15131,7 +15901,7 @@ struct sqlite3 {
u8 vtabOnConflict; /* Value to return for s3_vtab_on_conflict() */
u8 isTransactionSavepoint; /* True if the outermost savepoint is a TS */
u8 mTrace; /* zero or more SQLITE_TRACE flags */
- u8 skipBtreeMutex; /* True if no shared-cache backends */
+ u8 noSharedCache; /* True if no shared-cache backends */
u8 nSqlExec; /* Number of pending OP_SqlExec opcodes */
int nextPagesize; /* Pagesize after VACUUM if >0 */
u32 magic; /* Magic number for detect library misuse */
@@ -15143,8 +15913,9 @@ struct sqlite3 {
int newTnum; /* Rootpage of table being initialized */
u8 iDb; /* Which db file is being initialized */
u8 busy; /* TRUE if currently initializing */
- u8 orphanTrigger; /* Last statement is orphaned TEMP trigger */
- u8 imposterTable; /* Building an imposter table */
+ unsigned orphanTrigger : 1; /* Last statement is orphaned TEMP trigger */
+ unsigned imposterTable : 1; /* Building an imposter table */
+ unsigned reopenMemdb : 1; /* ATTACH is really a reopen using MemDB */
} init;
int nVdbeActive; /* Number of VDBEs currently running */
int nVdbeRead; /* Number of active VDBEs that read or write */
@@ -15197,7 +15968,7 @@ struct sqlite3 {
Hash aModule; /* populated by sqlite3_create_module() */
VtabCtx *pVtabCtx; /* Context for active vtab connect/create */
VTable **aVTrans; /* Virtual tables with open transactions */
- VTable *pDisconnect; /* Disconnect these in next sqlite3_prepare() */
+ VTable *pDisconnect; /* Disconnect these in next sqlite3_prepare() */
#endif
Hash aFunc; /* Hash table of connection functions */
Hash aCollSeq; /* All collating sequences */
@@ -15272,7 +16043,10 @@ struct sqlite3 {
#define SQLITE_QueryOnly 0x00100000 /* Disable database changes */
#define SQLITE_CellSizeCk 0x00200000 /* Check btree cell sizes on load */
#define SQLITE_Fts3Tokenizer 0x00400000 /* Enable fts3_tokenizer(2) */
-#define SQLITE_EnableQPSG 0x00800000 /* Query Planner Stability Guarantee */
+#define SQLITE_EnableQPSG 0x00800000 /* Query Planner Stability Guarantee*/
+#define SQLITE_TriggerEQP 0x01000000 /* Show trigger EXPLAIN QUERY PLAN */
+#define SQLITE_ResetDatabase 0x02000000 /* Reset the database */
+
/* Flags used only if debugging */
#ifdef SQLITE_DEBUG
#define SQLITE_SqlTrace 0x08000000 /* Debug print SQL as it executes */
@@ -15288,6 +16062,7 @@ struct sqlite3 {
#define DBFLAG_SchemaChange 0x0001 /* Uncommitted Hash table changes */
#define DBFLAG_PreferBuiltin 0x0002 /* Preference to built-in funcs */
#define DBFLAG_Vacuum 0x0004 /* Currently in a VACUUM */
+#define DBFLAG_SchemaKnownOk 0x0008 /* Schema is known to be valid */
/*
** Bits of the sqlite3.dbOptFlags field that are used by the
@@ -15307,6 +16082,8 @@ struct sqlite3 {
#define SQLITE_CursorHints 0x0400 /* Add OP_CursorHint opcodes */
#define SQLITE_Stat34 0x0800 /* Use STAT3 or STAT4 data */
/* TH3 expects the Stat34 ^^^^^^ value to be 0x0800. Don't change it */
+#define SQLITE_PushDown 0x1000 /* The push-down optimization */
+#define SQLITE_SimplifyJoin 0x2000 /* Convert LEFT JOIN to JOIN */
#define SQLITE_AllOpts 0xffff /* All optimizations */
/*
@@ -15405,6 +16182,7 @@ struct FuncDestructor {
#define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a
** single query - might change over time */
#define SQLITE_FUNC_AFFINITY 0x4000 /* Built-in affinity() function */
+#define SQLITE_FUNC_OFFSET 0x8000 /* Built-in sqlite_offset() function */
/*
** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are
@@ -15529,6 +16307,8 @@ struct Column {
#define COLFLAG_PRIMKEY 0x0001 /* Column is part of the primary key */
#define COLFLAG_HIDDEN 0x0002 /* A hidden column in a virtual table */
#define COLFLAG_HASTYPE 0x0004 /* Type name follows column name */
+#define COLFLAG_UNIQUE 0x0008 /* Column def contains "UNIQUE" or "PK" */
+#define COLFLAG_SORTERREF 0x0010 /* Use sorter-refs with this column */
/*
** A "Collating Sequence" is defined by an instance of the following
@@ -15816,13 +16596,12 @@ struct FKey {
#define OE_Fail 3 /* Stop the operation but leave all prior changes */
#define OE_Ignore 4 /* Ignore the error. Do not do the INSERT or UPDATE */
#define OE_Replace 5 /* Delete existing record, then do INSERT or UPDATE */
-
-#define OE_Restrict 6 /* OE_Abort for IMMEDIATE, OE_Rollback for DEFERRED */
-#define OE_SetNull 7 /* Set the foreign key value to NULL */
-#define OE_SetDflt 8 /* Set the foreign key value to its default */
-#define OE_Cascade 9 /* Cascade the changes */
-
-#define OE_Default 10 /* Do whatever the default action is */
+#define OE_Update 6 /* Process as a DO UPDATE in an upsert */
+#define OE_Restrict 7 /* OE_Abort for IMMEDIATE, OE_Rollback for DEFERRED */
+#define OE_SetNull 8 /* Set the foreign key value to NULL */
+#define OE_SetDflt 9 /* Set the foreign key value to its default */
+#define OE_Cascade 10 /* Cascade the changes */
+#define OE_Default 11 /* Do whatever the default action is */
/*
@@ -15949,6 +16728,7 @@ struct Index {
unsigned isCovering:1; /* True if this is a covering index */
unsigned noSkipScan:1; /* Do not try to use skip-scan if true */
unsigned hasStat1:1; /* aiRowLogEst values come from sqlite_stat1 */
+ unsigned bNoQuery:1; /* Do not use this index to optimize queries */
#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
int nSample; /* Number of elements in aSample[] */
int nSampleCol; /* Size of IndexSample.anEq[] and so on */
@@ -16179,7 +16959,7 @@ struct Expr {
*/
#define EP_FromJoin 0x000001 /* Originates in ON/USING clause of outer join */
#define EP_Agg 0x000002 /* Contains one or more aggregate functions */
- /* 0x000004 // available for use */
+#define EP_HasFunc 0x000004 /* Contains one or more functions of any kind */
/* 0x000008 // available for use */
#define EP_Distinct 0x000010 /* Aggregate function with DISTINCT keyword */
#define EP_VarSelect 0x000020 /* pSelect is correlated, not constant */
@@ -16203,9 +16983,10 @@ struct Expr {
#define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */
/*
-** Combinations of two or more EP_* flags
+** The EP_Propagate mask is a set of properties that automatically propagate
+** upwards into parent nodes.
*/
-#define EP_Propagate (EP_Collate|EP_Subquery) /* Propagate these bits up tree */
+#define EP_Propagate (EP_Collate|EP_Subquery|EP_HasFunc)
/*
** These macros can be used to test, set, or clear bits in the
@@ -16267,6 +17048,7 @@ struct ExprList {
unsigned done :1; /* A flag to indicate when processing is finished */
unsigned bSpanIsTab :1; /* zSpan holds DB.TABLE.COLUMN */
unsigned reusable :1; /* Constant expression is reusable */
+ unsigned bSorterRef :1; /* Defer evaluation until after sorting */
union {
struct {
u16 iOrderByCol; /* For ORDER BY, column number in result set */
@@ -16278,17 +17060,6 @@ struct ExprList {
};
/*
-** An instance of this structure is used by the parser to record both
-** the parse tree for an expression and the span of input text for an
-** expression.
-*/
-struct ExprSpan {
- Expr *pExpr; /* The expression parse tree */
- const char *zStart; /* First character of input text */
- const char *zEnd; /* One character past the end of input text */
-};
-
-/*
** An instance of this structure can hold a simple list of identifiers,
** such as the list "a,b,c" in the following statements:
**
@@ -16377,9 +17148,6 @@ struct SrcList {
unsigned viaCoroutine :1; /* Implemented as a co-routine */
unsigned isRecursive :1; /* True for recursive reference in WITH */
} fg;
-#ifndef SQLITE_OMIT_EXPLAIN
- u8 iSelectId; /* If pSelect!=0, the id of the sub-select in EQP */
-#endif
int iCursor; /* The VDBE cursor number used to access this table */
Expr *pOn; /* The ON clause of a join */
IdList *pUsing; /* The USING clause of a join */
@@ -16461,8 +17229,11 @@ struct SrcList {
struct NameContext {
Parse *pParse; /* The parser */
SrcList *pSrcList; /* One or more tables used to resolve names */
- ExprList *pEList; /* Optional list of result-set columns */
- AggInfo *pAggInfo; /* Information about aggregates at this level */
+ union {
+ ExprList *pEList; /* Optional list of result-set columns */
+ AggInfo *pAggInfo; /* Information about aggregates at this level */
+ Upsert *pUpsert; /* ON CONFLICT clause information from an upsert */
+ } uNC;
NameContext *pNext; /* Next outer name context. NULL for outermost */
int nRef; /* Number of names resolved by this context */
int nErr; /* Number of errors encountered while resolving names */
@@ -16484,17 +17255,48 @@ struct NameContext {
#define NC_HasAgg 0x0010 /* One or more aggregate functions seen */
#define NC_IdxExpr 0x0020 /* True if resolving columns of CREATE INDEX */
#define NC_VarSelect 0x0040 /* A correlated subquery has been seen */
+#define NC_UEList 0x0080 /* True if uNC.pEList is used */
+#define NC_UAggInfo 0x0100 /* True if uNC.pAggInfo is used */
+#define NC_UUpsert 0x0200 /* True if uNC.pUpsert is used */
#define NC_MinMaxAgg 0x1000 /* min/max aggregates seen. See note above */
+#define NC_Complex 0x2000 /* True if a function or subquery seen */
+
+/*
+** An instance of the following object describes a single ON CONFLICT
+** clause in an upsert.
+**
+** The pUpsertTarget field is only set if the ON CONFLICT clause includes
+** conflict-target clause. (In "ON CONFLICT(a,b)" the "(a,b)" is the
+** conflict-target clause.) The pUpsertTargetWhere is the optional
+** WHERE clause used to identify partial unique indexes.
+**
+** pUpsertSet is the list of column=expr terms of the UPDATE statement.
+** The pUpsertSet field is NULL for a ON CONFLICT DO NOTHING. The
+** pUpsertWhere is the WHERE clause for the UPDATE and is NULL if the
+** WHERE clause is omitted.
+*/
+struct Upsert {
+ ExprList *pUpsertTarget; /* Optional description of conflicting index */
+ Expr *pUpsertTargetWhere; /* WHERE clause for partial index targets */
+ ExprList *pUpsertSet; /* The SET clause from an ON CONFLICT UPDATE */
+ Expr *pUpsertWhere; /* WHERE clause for the ON CONFLICT UPDATE */
+ /* The fields above comprise the parse tree for the upsert clause.
+ ** The fields below are used to transfer information from the INSERT
+ ** processing down into the UPDATE processing while generating code.
+ ** Upsert owns the memory allocated above, but not the memory below. */
+ Index *pUpsertIdx; /* Constraint that pUpsertTarget identifies */
+ SrcList *pUpsertSrc; /* Table to be updated */
+ int regData; /* First register holding array of VALUES */
+ int iDataCur; /* Index of the data cursor */
+ int iIdxCur; /* Index of the first index cursor */
+};
/*
** An instance of the following structure contains all information
** needed to generate code for a single SELECT statement.
**
-** nLimit is set to -1 if there is no LIMIT clause. nOffset is set to 0.
-** If there is a LIMIT clause, the parser sets nLimit to the value of the
-** limit and nOffset to the value of the offset (or 0 if there is not
-** offset). But later on, nLimit and nOffset become the memory locations
-** in the VDBE that record the limit and offset counters.
+** See the header comment on the computeLimitRegisters() routine for a
+** detailed description of the meaning of the iLimit and iOffset fields.
**
** addrOpenEphm[] entries contain the address of OP_OpenEphemeral opcodes.
** These addresses must be stored so that we can go back and fill in
@@ -16524,7 +17326,6 @@ struct Select {
Select *pPrior; /* Prior select in a compound select statement */
Select *pNext; /* Next select to the left in a compound */
Expr *pLimit; /* LIMIT expression. NULL means not used. */
- Expr *pOffset; /* OFFSET expression. NULL means not used. */
With *pWith; /* WITH clause attached to this select. Or NULL. */
};
@@ -16555,7 +17356,7 @@ struct Select {
#define SF_MaybeConvert 0x08000 /* Need convertCompoundSelectToSubquery() */
#define SF_Converted 0x10000 /* By convertCompoundSelectToSubquery() */
#define SF_IncludeHidden 0x20000 /* Include hidden columns in output */
-
+#define SF_ComplexResult 0x40000 /* Result contains subquery or function */
/*
** The results of a SELECT can be distributed in several ways, as defined
@@ -16759,7 +17560,7 @@ struct Parse {
int nMem; /* Number of memory cells used so far */
int nOpAlloc; /* Number of slots allocated for Vdbe.aOp[] */
int szOpAlloc; /* Bytes of memory space allocated for Vdbe.aOp[] */
- int iSelfTab; /* Table for associated with an index on expr, or negative
+ int iSelfTab; /* Table associated with an index on expr, or negative
** of the base register during check-constraint eval */
int iCacheLevel; /* ColCache valid when aColCache[].iLevel<=iCacheLevel */
int iCacheCnt; /* Counter used to generate aColCache[].lru values */
@@ -16774,7 +17575,6 @@ struct Parse {
int nMaxArg; /* Max args passed to user function by sub-program */
#if SELECTTRACE_ENABLED
int nSelect; /* Number of SELECT statements seen */
- int nSelectIndent; /* How far to indent SELECTTRACE() output */
#endif
#ifndef SQLITE_OMIT_SHARED_CACHE
int nTableLock; /* Number of locks in aTableLock */
@@ -16826,8 +17626,7 @@ struct Parse {
#endif
int nHeight; /* Expression tree height of current sub-select */
#ifndef SQLITE_OMIT_EXPLAIN
- int iSelectId; /* ID of current select for EXPLAIN output */
- int iNextSelectId; /* Next available select ID for EXPLAIN output */
+ int addrExplain; /* Address of current OP_Explain opcode */
#endif
VList *pVList; /* Mapping between variable names and numbers */
Vdbe *pReprepare; /* VM being reprepared (sqlite3Reprepare()) */
@@ -16900,6 +17699,7 @@ struct AuthContext {
#define OPFLAG_PERMUTE 0x01 /* OP_Compare: use the permutation */
#define OPFLAG_SAVEPOSITION 0x02 /* OP_Delete/Insert: save cursor pos */
#define OPFLAG_AUXDELETE 0x04 /* OP_Delete: index in a DELETE op */
+#define OPFLAG_NOCHNG_MAGIC 0x6d /* OP_MakeRecord: serialtype 10 is ok */
/*
* Each trigger present in the database schema is stored as an instance of
@@ -16985,8 +17785,10 @@ struct TriggerStep {
Select *pSelect; /* SELECT statement or RHS of INSERT INTO SELECT ... */
char *zTarget; /* Target table for DELETE, UPDATE, INSERT */
Expr *pWhere; /* The WHERE clause for DELETE or UPDATE steps */
- ExprList *pExprList; /* SET clause for UPDATE. */
+ ExprList *pExprList; /* SET clause for UPDATE */
IdList *pIdList; /* Column names for INSERT */
+ Upsert *pUpsert; /* Upsert clauses on an INSERT */
+ char *zSpan; /* Original SQL text of this command */
TriggerStep *pNext; /* Next in the link-list */
TriggerStep *pLast; /* Last element in link-list. Valid for 1st elem only */
};
@@ -17010,17 +17812,15 @@ struct DbFixer {
** An objected used to accumulate the text of a string where we
** do not necessarily know how big the string will be in the end.
*/
-struct StrAccum {
+struct sqlite3_str {
sqlite3 *db; /* Optional database for lookaside. Can be NULL */
char *zText; /* The string collected so far */
u32 nAlloc; /* Amount of space allocated in zText */
u32 mxAlloc; /* Maximum allowed allocation. 0 for no malloc usage */
u32 nChar; /* Length of the string so far */
- u8 accError; /* STRACCUM_NOMEM or STRACCUM_TOOBIG */
+ u8 accError; /* SQLITE_NOMEM or SQLITE_TOOBIG */
u8 printfFlags; /* SQLITE_PRINTF flags below */
};
-#define STRACCUM_NOMEM 1
-#define STRACCUM_TOOBIG 2
#define SQLITE_PRINTF_INTERNAL 0x01 /* Internal-use-only converters allowed */
#define SQLITE_PRINTF_SQLFUNC 0x02 /* SQL function arguments to VXPrintf */
#define SQLITE_PRINTF_MALLOCED 0x04 /* True if xText is allocated space */
@@ -17097,6 +17897,7 @@ struct Sqlite3Config {
#endif
int bLocaltimeFault; /* True to fail localtime() calls */
int iOnceResetThreshold; /* When to reset OP_Once counters */
+ u32 szSorterRef; /* Min size in bytes to use sorter-refs */
};
/*
@@ -17136,9 +17937,9 @@ struct Walker {
struct CCurHint *pCCurHint; /* Used by codeCursorHint() */
int *aiCol; /* array of column indexes */
struct IdxCover *pIdxCover; /* Check for index coverage */
- struct IdxExprTrans *pIdxTrans; /* Convert indexed expr to column */
+ struct IdxExprTrans *pIdxTrans; /* Convert idxed expr to column */
ExprList *pGroupBy; /* GROUP BY clause */
- struct HavingToWhereCtx *pHavingCtx; /* HAVING to WHERE clause ctx */
+ Select *pSelect; /* HAVING to WHERE clause ctx */
} u;
};
@@ -17206,6 +18007,7 @@ struct TreeView {
** using sqlite3_log(). The routines also provide a convenient place
** to set a debugger breakpoint.
*/
+SQLITE_PRIVATE int sqlite3ReportError(int iErr, int lineno, const char *zType);
SQLITE_PRIVATE int sqlite3CorruptError(int);
SQLITE_PRIVATE int sqlite3MisuseError(int);
SQLITE_PRIVATE int sqlite3CantopenError(int);
@@ -17296,6 +18098,7 @@ SQLITE_PRIVATE void *sqlite3DbMallocRaw(sqlite3*, u64);
SQLITE_PRIVATE void *sqlite3DbMallocRawNN(sqlite3*, u64);
SQLITE_PRIVATE char *sqlite3DbStrDup(sqlite3*,const char*);
SQLITE_PRIVATE char *sqlite3DbStrNDup(sqlite3*,const char*, u64);
+SQLITE_PRIVATE char *sqlite3DbSpanDup(sqlite3*,const char*,const char*);
SQLITE_PRIVATE void *sqlite3Realloc(void*, u64);
SQLITE_PRIVATE void *sqlite3DbReallocOrFree(sqlite3 *, void *, u64);
SQLITE_PRIVATE void *sqlite3DbRealloc(sqlite3 *, void *, u64);
@@ -17364,6 +18167,12 @@ SQLITE_PRIVATE int sqlite3LookasideUsed(sqlite3*,int*);
SQLITE_PRIVATE sqlite3_mutex *sqlite3Pcache1Mutex(void);
SQLITE_PRIVATE sqlite3_mutex *sqlite3MallocMutex(void);
+#if defined(SQLITE_ENABLE_MULTITHREADED_CHECKS) && !defined(SQLITE_MUTEX_OMIT)
+SQLITE_PRIVATE void sqlite3MutexWarnOnContention(sqlite3_mutex*);
+#else
+# define sqlite3MutexWarnOnContention(x)
+#endif
+
#ifndef SQLITE_OMIT_FLOATING_POINT
SQLITE_PRIVATE int sqlite3IsNaN(double);
#else
@@ -17380,8 +18189,6 @@ struct PrintfArguments {
sqlite3_value **apArg; /* The argument values */
};
-SQLITE_PRIVATE void sqlite3VXPrintf(StrAccum*, const char*, va_list);
-SQLITE_PRIVATE void sqlite3XPrintf(StrAccum*, const char*, ...);
SQLITE_PRIVATE char *sqlite3MPrintf(sqlite3*,const char*, ...);
SQLITE_PRIVATE char *sqlite3VMPrintf(sqlite3*,const char*, va_list);
#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE)
@@ -17428,7 +18235,7 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListAppend(Parse*,ExprList*,Expr*);
SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector(Parse*,ExprList*,IdList*,Expr*);
SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList*,int);
SQLITE_PRIVATE void sqlite3ExprListSetName(Parse*,ExprList*,Token*,int);
-SQLITE_PRIVATE void sqlite3ExprListSetSpan(Parse*,ExprList*,ExprSpan*);
+SQLITE_PRIVATE void sqlite3ExprListSetSpan(Parse*,ExprList*,const char*,const char*);
SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3*, ExprList*);
SQLITE_PRIVATE u32 sqlite3ExprListFlags(const ExprList*);
SQLITE_PRIVATE int sqlite3Init(sqlite3*, char**);
@@ -17458,7 +18265,7 @@ SQLITE_PRIVATE void sqlite3AddColumn(Parse*,Token*,Token*);
SQLITE_PRIVATE void sqlite3AddNotNull(Parse*, int);
SQLITE_PRIVATE void sqlite3AddPrimaryKey(Parse*, ExprList*, int, int, int);
SQLITE_PRIVATE void sqlite3AddCheckConstraint(Parse*, Expr*);
-SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse*,ExprSpan*);
+SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse*,Expr*,const char*,const char*);
SQLITE_PRIVATE void sqlite3AddCollateType(Parse*, Token*);
SQLITE_PRIVATE void sqlite3EndTable(Parse*,Token*,Token*,u8,Select*);
SQLITE_PRIVATE int sqlite3ParseUri(const char*,const char*,unsigned int*,
@@ -17509,7 +18316,7 @@ SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse);
# define sqlite3AutoincrementBegin(X)
# define sqlite3AutoincrementEnd(X)
#endif
-SQLITE_PRIVATE void sqlite3Insert(Parse*, SrcList*, Select*, IdList*, int);
+SQLITE_PRIVATE void sqlite3Insert(Parse*, SrcList*, Select*, IdList*, int, Upsert*);
SQLITE_PRIVATE void *sqlite3ArrayAllocate(sqlite3*,void*,int,int*,int*);
SQLITE_PRIVATE IdList *sqlite3IdListAppend(sqlite3*, IdList*, Token*);
SQLITE_PRIVATE int sqlite3IdListIndex(IdList*,const char*);
@@ -17530,16 +18337,17 @@ SQLITE_PRIVATE void sqlite3CreateIndex(Parse*,Token*,Token*,SrcList*,ExprList*,i
SQLITE_PRIVATE void sqlite3DropIndex(Parse*, SrcList*, int);
SQLITE_PRIVATE int sqlite3Select(Parse*, Select*, SelectDest*);
SQLITE_PRIVATE Select *sqlite3SelectNew(Parse*,ExprList*,SrcList*,Expr*,ExprList*,
- Expr*,ExprList*,u32,Expr*,Expr*);
+ Expr*,ExprList*,u32,Expr*);
SQLITE_PRIVATE void sqlite3SelectDelete(sqlite3*, Select*);
SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse*, SrcList*);
SQLITE_PRIVATE int sqlite3IsReadOnly(Parse*, Table*, int);
SQLITE_PRIVATE void sqlite3OpenTable(Parse*, int iCur, int iDb, Table*, int);
#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY)
-SQLITE_PRIVATE Expr *sqlite3LimitWhere(Parse*,SrcList*,Expr*,ExprList*,Expr*,Expr*,char*);
+SQLITE_PRIVATE Expr *sqlite3LimitWhere(Parse*,SrcList*,Expr*,ExprList*,Expr*,char*);
#endif
-SQLITE_PRIVATE void sqlite3DeleteFrom(Parse*, SrcList*, Expr*);
-SQLITE_PRIVATE void sqlite3Update(Parse*, SrcList*, ExprList*, Expr*, int);
+SQLITE_PRIVATE void sqlite3DeleteFrom(Parse*, SrcList*, Expr*, ExprList*, Expr*);
+SQLITE_PRIVATE void sqlite3Update(Parse*, SrcList*, ExprList*,Expr*,int,ExprList*,Expr*,
+ Upsert*);
SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(Parse*,SrcList*,Expr*,ExprList*,ExprList*,u16,int);
SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo*);
SQLITE_PRIVATE LogEst sqlite3WhereOutputRowCount(WhereInfo*);
@@ -17594,6 +18402,7 @@ SQLITE_PRIVATE int sqlite3ExprCompare(Parse*,Expr*, Expr*, int);
SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr*, Expr*, int);
SQLITE_PRIVATE int sqlite3ExprListCompare(ExprList*, ExprList*, int);
SQLITE_PRIVATE int sqlite3ExprImpliesExpr(Parse*,Expr*, Expr*, int);
+SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr*,int);
SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext*, Expr*);
SQLITE_PRIVATE void sqlite3ExprAnalyzeAggList(NameContext*,ExprList*);
SQLITE_PRIVATE int sqlite3ExprCoveredByIndex(Expr*, int iCur, Index *pIdx);
@@ -17611,6 +18420,8 @@ SQLITE_PRIVATE void sqlite3EndTransaction(Parse*,int);
SQLITE_PRIVATE void sqlite3Savepoint(Parse*, int, Token*);
SQLITE_PRIVATE void sqlite3CloseSavepoints(sqlite3 *);
SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3*);
+SQLITE_PRIVATE int sqlite3ExprIdToTrueFalse(Expr*);
+SQLITE_PRIVATE int sqlite3ExprTruthValue(const Expr*);
SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr*);
SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr*);
SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr*, u8);
@@ -17629,7 +18440,7 @@ SQLITE_PRIVATE void sqlite3GenerateRowIndexDelete(Parse*, Table*, int, int, int*
SQLITE_PRIVATE int sqlite3GenerateIndexKey(Parse*, Index*, int, int, int, int*,Index*,int);
SQLITE_PRIVATE void sqlite3ResolvePartIdxLabel(Parse*,int);
SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(Parse*,Table*,int*,int,int,int,int,
- u8,u8,int,int*,int*);
+ u8,u8,int,int*,int*,Upsert*);
#ifdef SQLITE_ENABLE_NULL_TRIM
SQLITE_PRIVATE void sqlite3SetMakeRecordP5(Vdbe*,Table*);
#else
@@ -17663,7 +18474,7 @@ SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3*);
SQLITE_PRIVATE void sqlite3ChangeCookie(Parse*, int);
#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER)
-SQLITE_PRIVATE void sqlite3MaterializeView(Parse*, Table*, Expr*, int);
+SQLITE_PRIVATE void sqlite3MaterializeView(Parse*, Table*, Expr*, ExprList*,Expr*,int);
#endif
#ifndef SQLITE_OMIT_TRIGGER
@@ -17679,11 +18490,15 @@ SQLITE_PRIVATE void sqlite3CodeRowTrigger(Parse*, Trigger *, int, ExprList*, i
SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect(Parse *, Trigger *, Table *, int, int, int);
void sqliteViewTriggers(Parse*, Table*, Expr*, int, ExprList*);
SQLITE_PRIVATE void sqlite3DeleteTriggerStep(sqlite3*, TriggerStep*);
-SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3*,Select*);
+SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3*,Select*,
+ const char*,const char*);
SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep(sqlite3*,Token*, IdList*,
- Select*,u8);
-SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep(sqlite3*,Token*,ExprList*, Expr*, u8);
-SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep(sqlite3*,Token*, Expr*);
+ Select*,u8,Upsert*,
+ const char*,const char*);
+SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep(sqlite3*,Token*,ExprList*, Expr*, u8,
+ const char*,const char*);
+SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep(sqlite3*,Token*, Expr*,
+ const char*,const char*);
SQLITE_PRIVATE void sqlite3DeleteTrigger(sqlite3*, Trigger*);
SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTrigger(sqlite3*,int,const char*);
SQLITE_PRIVATE u32 sqlite3TriggerColmask(Parse*,Trigger*,ExprList*,int,int,Table*,int);
@@ -17790,6 +18605,10 @@ SQLITE_PRIVATE int sqlite3TwoPartName(Parse *, Token *, Token *, Token **);
SQLITE_PRIVATE const char *sqlite3ErrName(int);
#endif
+#ifdef SQLITE_ENABLE_DESERIALIZE
+SQLITE_PRIVATE int sqlite3MemdbInit(void);
+#endif
+
SQLITE_PRIVATE const char *sqlite3ErrStr(int);
SQLITE_PRIVATE int sqlite3ReadSchema(Parse *pParse);
SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq(sqlite3*,u8 enc, const char*,int);
@@ -17838,6 +18657,9 @@ SQLITE_PRIVATE FuncDefHash sqlite3BuiltinFunctions;
SQLITE_PRIVATE int sqlite3PendingByte;
#endif
#endif
+#ifdef VDBE_PROFILE
+SQLITE_PRIVATE sqlite3_uint64 sqlite3NProfileCnt;
+#endif
SQLITE_PRIVATE void sqlite3RootPageMoved(sqlite3*, int, int, int);
SQLITE_PRIVATE void sqlite3Reindex(Parse*, Token*, Token*);
SQLITE_PRIVATE void sqlite3AlterFunctions(void);
@@ -17858,9 +18680,9 @@ SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *, Table *, int, int);
SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *, Token *);
SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *, SrcList *);
SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq(Parse*, u8, CollSeq *, const char*);
-SQLITE_PRIVATE char sqlite3AffinityType(const char*, u8*);
+SQLITE_PRIVATE char sqlite3AffinityType(const char*, Column*);
SQLITE_PRIVATE void sqlite3Analyze(Parse*, Token*, Token*);
-SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler*);
+SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler*, sqlite3_file*);
SQLITE_PRIVATE int sqlite3FindDb(sqlite3*, Token*);
SQLITE_PRIVATE int sqlite3FindDbName(sqlite3 *, const char *);
SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3*,int iDB);
@@ -17883,17 +18705,14 @@ SQLITE_PRIVATE int sqlite3CreateFunc(sqlite3 *, const char *, int, int, void *,
void (*)(sqlite3_context*,int,sqlite3_value **), void (*)(sqlite3_context*),
FuncDestructor *pDestructor
);
+SQLITE_PRIVATE void sqlite3NoopDestructor(void*);
SQLITE_PRIVATE void sqlite3OomFault(sqlite3*);
SQLITE_PRIVATE void sqlite3OomClear(sqlite3*);
SQLITE_PRIVATE int sqlite3ApiExit(sqlite3 *db, int);
SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *);
SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum*, sqlite3*, char*, int, int);
-SQLITE_PRIVATE void sqlite3StrAccumAppend(StrAccum*,const char*,int);
-SQLITE_PRIVATE void sqlite3StrAccumAppendAll(StrAccum*,const char*);
-SQLITE_PRIVATE void sqlite3AppendChar(StrAccum*,int,char);
SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum*);
-SQLITE_PRIVATE void sqlite3StrAccumReset(StrAccum*);
SQLITE_PRIVATE void sqlite3SelectDestInit(SelectDest*,int,int);
SQLITE_PRIVATE Expr *sqlite3CreateColumnExpr(sqlite3 *, SrcList *, int, int);
@@ -17920,10 +18739,10 @@ SQLITE_PRIVATE char sqlite3IndexColumnAffinity(sqlite3*, Index*, int);
** The interface to the LEMON-generated parser
*/
#ifndef SQLITE_AMALGAMATION
-SQLITE_PRIVATE void *sqlite3ParserAlloc(void*(*)(u64));
+SQLITE_PRIVATE void *sqlite3ParserAlloc(void*(*)(u64), Parse*);
SQLITE_PRIVATE void sqlite3ParserFree(void*, void(*)(void*));
#endif
-SQLITE_PRIVATE void sqlite3Parser(void*, int, Token, Parse*);
+SQLITE_PRIVATE void sqlite3Parser(void*, int, Token);
#ifdef YYTRACKMAXSTACKDEPTH
SQLITE_PRIVATE int sqlite3ParserStackPeak(void*);
#endif
@@ -17989,7 +18808,6 @@ SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse*, Table*);
SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3*, int, const char *);
SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *, VTable *);
SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(sqlite3 *,FuncDef*, int nArg, Expr*);
-SQLITE_PRIVATE void sqlite3InvalidFunction(sqlite3_context*,int,sqlite3_value**);
SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context*);
SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe*, const char*, int);
SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *);
@@ -18011,6 +18829,18 @@ SQLITE_PRIVATE void sqlite3WithPush(Parse*, With*, u8);
#define sqlite3WithPush(x,y,z)
#define sqlite3WithDelete(x,y)
#endif
+#ifndef SQLITE_OMIT_UPSERT
+SQLITE_PRIVATE Upsert *sqlite3UpsertNew(sqlite3*,ExprList*,Expr*,ExprList*,Expr*);
+SQLITE_PRIVATE void sqlite3UpsertDelete(sqlite3*,Upsert*);
+SQLITE_PRIVATE Upsert *sqlite3UpsertDup(sqlite3*,Upsert*);
+SQLITE_PRIVATE int sqlite3UpsertAnalyzeTarget(Parse*,SrcList*,Upsert*);
+SQLITE_PRIVATE void sqlite3UpsertDoUpdate(Parse*,Upsert*,Table*,Index*,int);
+#else
+#define sqlite3UpsertNew(v,w,x,y,z) ((Upsert*)0)
+#define sqlite3UpsertDelete(x,y)
+#define sqlite3UpsertDup(x,y) ((Upsert*)0)
+#endif
+
/* Declarations for functions in fkey.c. All of these are replaced by
** no-op macros if OMIT_FOREIGN_KEY is defined. In this case no foreign
@@ -18113,6 +18943,9 @@ SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db);
#ifdef SQLITE_DEBUG
SQLITE_PRIVATE void sqlite3ParserTrace(FILE*, char *);
#endif
+#if defined(YYCOVERAGE)
+SQLITE_PRIVATE int sqlite3ParserCoverage(FILE*);
+#endif
/*
** If the SQLITE_ENABLE IOTRACE exists then the global variable
@@ -18440,7 +19273,8 @@ SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = {
0, /* xTestCallback */
#endif
0, /* bLocaltimeFault */
- 0x7ffffffe /* iOnceResetThreshold */
+ 0x7ffffffe, /* iOnceResetThreshold */
+ SQLITE_DEFAULT_SORTERREF_SIZE /* szSorterRef */
};
/*
@@ -18458,6 +19292,13 @@ SQLITE_PRIVATE const Token sqlite3IntTokens[] = {
{ "1", 1 }
};
+#ifdef VDBE_PROFILE
+/*
+** The following performance counter can be used in place of
+** sqlite3Hwtime() for profiling. This is a no-op on standard builds.
+*/
+SQLITE_PRIVATE sqlite3_uint64 sqlite3NProfileCnt = 0;
+#endif
/*
** The value of the "pending" byte must be 0x40000000 (1 byte past the
@@ -18834,7 +19675,6 @@ struct sqlite3_context {
int iOp; /* Instruction number of OP_Function */
int isError; /* Error code returned by the function. */
u8 skipFlag; /* Skip accumulator loading if true */
- u8 fErrorOrAux; /* isError!=0 or pVdbe->pAuxData modified */
u8 argc; /* Number of arguments */
sqlite3_value *argv[1]; /* Argument set */
};
@@ -18897,6 +19737,7 @@ struct Vdbe {
int nOp; /* Number of instructions in the program */
#ifdef SQLITE_DEBUG
int rcApp; /* errcode set by sqlite3_result_error_code() */
+ u32 nWrite; /* Number of write operations that have occurred */
#endif
u16 nResColumn; /* Number of columns in one row of the result set */
u8 errorAction; /* Recovery action to do in case of an error */
@@ -19004,6 +19845,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem*, u8, u8);
SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem*);
SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem*);
SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem*);
+SQLITE_PRIVATE int sqlite3VdbeBooleanValue(Mem*, int ifNull);
SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem*);
SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem*);
SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem*);
@@ -19031,6 +19873,14 @@ SQLITE_PRIVATE int sqlite3VdbeSorterRewind(const VdbeCursor *, int *);
SQLITE_PRIVATE int sqlite3VdbeSorterWrite(const VdbeCursor *, Mem *);
SQLITE_PRIVATE int sqlite3VdbeSorterCompare(const VdbeCursor *, Mem *, int, int *);
+#ifdef SQLITE_DEBUG
+SQLITE_PRIVATE void sqlite3VdbeIncrWriteCounter(Vdbe*, VdbeCursor*);
+SQLITE_PRIVATE void sqlite3VdbeAssertAbortable(Vdbe*);
+#else
+# define sqlite3VdbeIncrWriteCounter(V,C)
+# define sqlite3VdbeAssertAbortable(V)
+#endif
+
#if !defined(SQLITE_OMIT_SHARED_CACHE)
SQLITE_PRIVATE void sqlite3VdbeEnter(Vdbe*);
#else
@@ -19397,6 +20247,9 @@ SQLITE_API int sqlite3_db_status(
** pagers the database handle is connected to. *pHighwater is always set
** to zero.
*/
+ case SQLITE_DBSTATUS_CACHE_SPILL:
+ op = SQLITE_DBSTATUS_CACHE_WRITE+1;
+ /* Fall through into the next case */
case SQLITE_DBSTATUS_CACHE_HIT:
case SQLITE_DBSTATUS_CACHE_MISS:
case SQLITE_DBSTATUS_CACHE_WRITE:{
@@ -19479,7 +20332,7 @@ SQLITE_API int sqlite3_db_status(
**
** Jean Meeus
** Astronomical Algorithms, 2nd Edition, 1998
-** ISBM 0-943396-61-1
+** ISBN 0-943396-61-1
** Willmann-Bell, Inc
** Richmond, Virginia (USA)
*/
@@ -20817,8 +21670,11 @@ SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut){
** routine has no return value since the return value would be meaningless.
*/
SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){
+ if( id->pMethods==0 ) return SQLITE_NOTFOUND;
#ifdef SQLITE_TEST
- if( op!=SQLITE_FCNTL_COMMIT_PHASETWO ){
+ if( op!=SQLITE_FCNTL_COMMIT_PHASETWO
+ && op!=SQLITE_FCNTL_LOCK_TIMEOUT
+ ){
/* Faults are not injected into COMMIT_PHASETWO because, assuming SQLite
** is using a regular VFS, it is called after the corresponding
** transaction has been committed. Injecting a fault at this point
@@ -20835,7 +21691,7 @@ SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){
return id->pMethods->xFileControl(id, op, pArg);
}
SQLITE_PRIVATE void sqlite3OsFileControlHint(sqlite3_file *id, int op, void *pArg){
- (void)id->pMethods->xFileControl(id, op, pArg);
+ if( id->pMethods ) (void)id->pMethods->xFileControl(id, op, pArg);
}
SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id){
@@ -23384,6 +24240,193 @@ static SQLITE_WSD int mutexIsInit = 0;
#ifndef SQLITE_MUTEX_OMIT
+
+#ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS
+/*
+** This block (enclosed by SQLITE_ENABLE_MULTITHREADED_CHECKS) contains
+** the implementation of a wrapper around the system default mutex
+** implementation (sqlite3DefaultMutex()).
+**
+** Most calls are passed directly through to the underlying default
+** mutex implementation. Except, if a mutex is configured by calling
+** sqlite3MutexWarnOnContention() on it, then if contention is ever
+** encountered within xMutexEnter() a warning is emitted via sqlite3_log().
+**
+** This type of mutex is used as the database handle mutex when testing
+** apps that usually use SQLITE_CONFIG_MULTITHREAD mode.
+*/
+
+/*
+** Type for all mutexes used when SQLITE_ENABLE_MULTITHREADED_CHECKS
+** is defined. Variable CheckMutex.mutex is a pointer to the real mutex
+** allocated by the system mutex implementation. Variable iType is usually set
+** to the type of mutex requested - SQLITE_MUTEX_RECURSIVE, SQLITE_MUTEX_FAST
+** or one of the static mutex identifiers. Or, if this is a recursive mutex
+** that has been configured using sqlite3MutexWarnOnContention(), it is
+** set to SQLITE_MUTEX_WARNONCONTENTION.
+*/
+typedef struct CheckMutex CheckMutex;
+struct CheckMutex {
+ int iType;
+ sqlite3_mutex *mutex;
+};
+
+#define SQLITE_MUTEX_WARNONCONTENTION (-1)
+
+/*
+** Pointer to real mutex methods object used by the CheckMutex
+** implementation. Set by checkMutexInit().
+*/
+static SQLITE_WSD const sqlite3_mutex_methods *pGlobalMutexMethods;
+
+#ifdef SQLITE_DEBUG
+static int checkMutexHeld(sqlite3_mutex *p){
+ return pGlobalMutexMethods->xMutexHeld(((CheckMutex*)p)->mutex);
+}
+static int checkMutexNotheld(sqlite3_mutex *p){
+ return pGlobalMutexMethods->xMutexNotheld(((CheckMutex*)p)->mutex);
+}
+#endif
+
+/*
+** Initialize and deinitialize the mutex subsystem.
+*/
+static int checkMutexInit(void){
+ pGlobalMutexMethods = sqlite3DefaultMutex();
+ return SQLITE_OK;
+}
+static int checkMutexEnd(void){
+ pGlobalMutexMethods = 0;
+ return SQLITE_OK;
+}
+
+/*
+** Allocate a mutex.
+*/
+static sqlite3_mutex *checkMutexAlloc(int iType){
+ static CheckMutex staticMutexes[] = {
+ {2, 0}, {3, 0}, {4, 0}, {5, 0},
+ {6, 0}, {7, 0}, {8, 0}, {9, 0},
+ {10, 0}, {11, 0}, {12, 0}, {13, 0}
+ };
+ CheckMutex *p = 0;
+
+ assert( SQLITE_MUTEX_RECURSIVE==1 && SQLITE_MUTEX_FAST==0 );
+ if( iType<2 ){
+ p = sqlite3MallocZero(sizeof(CheckMutex));
+ if( p==0 ) return 0;
+ p->iType = iType;
+ }else{
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( iType-2>=ArraySize(staticMutexes) ){
+ (void)SQLITE_MISUSE_BKPT;
+ return 0;
+ }
+#endif
+ p = &staticMutexes[iType-2];
+ }
+
+ if( p->mutex==0 ){
+ p->mutex = pGlobalMutexMethods->xMutexAlloc(iType);
+ if( p->mutex==0 ){
+ if( iType<2 ){
+ sqlite3_free(p);
+ }
+ p = 0;
+ }
+ }
+
+ return (sqlite3_mutex*)p;
+}
+
+/*
+** Free a mutex.
+*/
+static void checkMutexFree(sqlite3_mutex *p){
+ assert( SQLITE_MUTEX_RECURSIVE<2 );
+ assert( SQLITE_MUTEX_FAST<2 );
+ assert( SQLITE_MUTEX_WARNONCONTENTION<2 );
+
+#if SQLITE_ENABLE_API_ARMOR
+ if( ((CheckMutex*)p)->iType<2 )
+#endif
+ {
+ CheckMutex *pCheck = (CheckMutex*)p;
+ pGlobalMutexMethods->xMutexFree(pCheck->mutex);
+ sqlite3_free(pCheck);
+ }
+#ifdef SQLITE_ENABLE_API_ARMOR
+ else{
+ (void)SQLITE_MISUSE_BKPT;
+ }
+#endif
+}
+
+/*
+** Enter the mutex.
+*/
+static void checkMutexEnter(sqlite3_mutex *p){
+ CheckMutex *pCheck = (CheckMutex*)p;
+ if( pCheck->iType==SQLITE_MUTEX_WARNONCONTENTION ){
+ if( SQLITE_OK==pGlobalMutexMethods->xMutexTry(pCheck->mutex) ){
+ return;
+ }
+ sqlite3_log(SQLITE_MISUSE,
+ "illegal multi-threaded access to database connection"
+ );
+ }
+ pGlobalMutexMethods->xMutexEnter(pCheck->mutex);
+}
+
+/*
+** Enter the mutex (do not block).
+*/
+static int checkMutexTry(sqlite3_mutex *p){
+ CheckMutex *pCheck = (CheckMutex*)p;
+ return pGlobalMutexMethods->xMutexTry(pCheck->mutex);
+}
+
+/*
+** Leave the mutex.
+*/
+static void checkMutexLeave(sqlite3_mutex *p){
+ CheckMutex *pCheck = (CheckMutex*)p;
+ pGlobalMutexMethods->xMutexLeave(pCheck->mutex);
+}
+
+sqlite3_mutex_methods const *multiThreadedCheckMutex(void){
+ static const sqlite3_mutex_methods sMutex = {
+ checkMutexInit,
+ checkMutexEnd,
+ checkMutexAlloc,
+ checkMutexFree,
+ checkMutexEnter,
+ checkMutexTry,
+ checkMutexLeave,
+#ifdef SQLITE_DEBUG
+ checkMutexHeld,
+ checkMutexNotheld
+#else
+ 0,
+ 0
+#endif
+ };
+ return &sMutex;
+}
+
+/*
+** Mark the SQLITE_MUTEX_RECURSIVE mutex passed as the only argument as
+** one on which there should be no contention.
+*/
+SQLITE_PRIVATE void sqlite3MutexWarnOnContention(sqlite3_mutex *p){
+ if( sqlite3GlobalConfig.mutex.xMutexAlloc==checkMutexAlloc ){
+ CheckMutex *pCheck = (CheckMutex*)p;
+ assert( pCheck->iType==SQLITE_MUTEX_RECURSIVE );
+ pCheck->iType = SQLITE_MUTEX_WARNONCONTENTION;
+ }
+}
+#endif /* ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS */
+
/*
** Initialize the mutex system.
*/
@@ -23399,7 +24442,11 @@ SQLITE_PRIVATE int sqlite3MutexInit(void){
sqlite3_mutex_methods *pTo = &sqlite3GlobalConfig.mutex;
if( sqlite3GlobalConfig.bCoreMutex ){
+#ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS
+ pFrom = multiThreadedCheckMutex();
+#else
pFrom = sqlite3DefaultMutex();
+#endif
}else{
pFrom = sqlite3NoopMutex();
}
@@ -23798,11 +24845,12 @@ struct sqlite3_mutex {
#endif
};
#if SQLITE_MUTEX_NREF
-#define SQLITE3_MUTEX_INITIALIZER {PTHREAD_MUTEX_INITIALIZER,0,0,(pthread_t)0,0}
+# define SQLITE3_MUTEX_INITIALIZER(id) \
+ {PTHREAD_MUTEX_INITIALIZER,id,0,(pthread_t)0,0}
#elif defined(SQLITE_ENABLE_API_ARMOR)
-#define SQLITE3_MUTEX_INITIALIZER { PTHREAD_MUTEX_INITIALIZER, 0 }
+# define SQLITE3_MUTEX_INITIALIZER(id) { PTHREAD_MUTEX_INITIALIZER, id }
#else
-#define SQLITE3_MUTEX_INITIALIZER { PTHREAD_MUTEX_INITIALIZER }
+#define SQLITE3_MUTEX_INITIALIZER(id) { PTHREAD_MUTEX_INITIALIZER }
#endif
/*
@@ -23899,18 +24947,18 @@ static int pthreadMutexEnd(void){ return SQLITE_OK; }
*/
static sqlite3_mutex *pthreadMutexAlloc(int iType){
static sqlite3_mutex staticMutexes[] = {
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER
+ SQLITE3_MUTEX_INITIALIZER(2),
+ SQLITE3_MUTEX_INITIALIZER(3),
+ SQLITE3_MUTEX_INITIALIZER(4),
+ SQLITE3_MUTEX_INITIALIZER(5),
+ SQLITE3_MUTEX_INITIALIZER(6),
+ SQLITE3_MUTEX_INITIALIZER(7),
+ SQLITE3_MUTEX_INITIALIZER(8),
+ SQLITE3_MUTEX_INITIALIZER(9),
+ SQLITE3_MUTEX_INITIALIZER(10),
+ SQLITE3_MUTEX_INITIALIZER(11),
+ SQLITE3_MUTEX_INITIALIZER(12),
+ SQLITE3_MUTEX_INITIALIZER(13)
};
sqlite3_mutex *p;
switch( iType ){
@@ -23929,6 +24977,9 @@ static sqlite3_mutex *pthreadMutexAlloc(int iType){
pthread_mutex_init(&p->mutex, &recursiveAttr);
pthread_mutexattr_destroy(&recursiveAttr);
#endif
+#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR)
+ p->id = SQLITE_MUTEX_RECURSIVE;
+#endif
}
break;
}
@@ -23936,6 +24987,9 @@ static sqlite3_mutex *pthreadMutexAlloc(int iType){
p = sqlite3MallocZero( sizeof(*p) );
if( p ){
pthread_mutex_init(&p->mutex, 0);
+#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR)
+ p->id = SQLITE_MUTEX_FAST;
+#endif
}
break;
}
@@ -23951,7 +25005,7 @@ static sqlite3_mutex *pthreadMutexAlloc(int iType){
}
}
#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR)
- if( p ) p->id = iType;
+ assert( p==0 || p->id==iType );
#endif
return p;
}
@@ -24468,7 +25522,7 @@ struct sqlite3_mutex {
#ifdef SQLITE_DEBUG
volatile int nRef; /* Number of enterances */
volatile DWORD owner; /* Thread holding this mutex */
- volatile int trace; /* True to trace changes */
+ volatile LONG trace; /* True to trace changes */
#endif
};
@@ -24480,10 +25534,10 @@ struct sqlite3_mutex {
#define SQLITE_W32_MUTEX_INITIALIZER { 0 }
#ifdef SQLITE_DEBUG
-#define SQLITE3_MUTEX_INITIALIZER { SQLITE_W32_MUTEX_INITIALIZER, 0, \
+#define SQLITE3_MUTEX_INITIALIZER(id) { SQLITE_W32_MUTEX_INITIALIZER, id, \
0L, (DWORD)0, 0 }
#else
-#define SQLITE3_MUTEX_INITIALIZER { SQLITE_W32_MUTEX_INITIALIZER, 0 }
+#define SQLITE3_MUTEX_INITIALIZER(id) { SQLITE_W32_MUTEX_INITIALIZER, id }
#endif
#ifdef SQLITE_DEBUG
@@ -24526,18 +25580,18 @@ SQLITE_PRIVATE void sqlite3MemoryBarrier(void){
** Initialize and deinitialize the mutex subsystem.
*/
static sqlite3_mutex winMutex_staticMutexes[] = {
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER
+ SQLITE3_MUTEX_INITIALIZER(2),
+ SQLITE3_MUTEX_INITIALIZER(3),
+ SQLITE3_MUTEX_INITIALIZER(4),
+ SQLITE3_MUTEX_INITIALIZER(5),
+ SQLITE3_MUTEX_INITIALIZER(6),
+ SQLITE3_MUTEX_INITIALIZER(7),
+ SQLITE3_MUTEX_INITIALIZER(8),
+ SQLITE3_MUTEX_INITIALIZER(9),
+ SQLITE3_MUTEX_INITIALIZER(10),
+ SQLITE3_MUTEX_INITIALIZER(11),
+ SQLITE3_MUTEX_INITIALIZER(12),
+ SQLITE3_MUTEX_INITIALIZER(13)
};
static int winMutex_isInit = 0;
@@ -24667,15 +25721,15 @@ static sqlite3_mutex *winMutexAlloc(int iType){
}
#endif
p = &winMutex_staticMutexes[iType-2];
- p->id = iType;
#ifdef SQLITE_DEBUG
#ifdef SQLITE_WIN32_MUTEX_TRACE_STATIC
- p->trace = 1;
+ InterlockedCompareExchange(&p->trace, 1, 0);
#endif
#endif
break;
}
}
+ assert( p==0 || p->id==iType );
return p;
}
@@ -25458,6 +26512,19 @@ SQLITE_PRIVATE char *sqlite3DbStrNDup(sqlite3 *db, const char *z, u64 n){
}
/*
+** The text between zStart and zEnd represents a phrase within a larger
+** SQL statement. Make a copy of this phrase in space obtained form
+** sqlite3DbMalloc(). Omit leading and trailing whitespace.
+*/
+SQLITE_PRIVATE char *sqlite3DbSpanDup(sqlite3 *db, const char *zStart, const char *zEnd){
+ int n;
+ while( sqlite3Isspace(zStart[0]) ) zStart++;
+ n = (int)(zEnd - zStart);
+ while( ALWAYS(n>0) && sqlite3Isspace(zStart[n-1]) ) n--;
+ return sqlite3DbStrNDup(db, zStart, n);
+}
+
+/*
** Free any prior content in *pz and replace it with a copy of zNew.
*/
SQLITE_PRIVATE void sqlite3SetString(char **pz, sqlite3 *db, const char *zNew){
@@ -25669,7 +26736,7 @@ static char et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){
** Set the StrAccum object to an error mode.
*/
static void setStrAccumError(StrAccum *p, u8 eError){
- assert( eError==STRACCUM_NOMEM || eError==STRACCUM_TOOBIG );
+ assert( eError==SQLITE_NOMEM || eError==SQLITE_TOOBIG );
p->accError = eError;
p->nAlloc = 0;
}
@@ -25703,8 +26770,8 @@ static char *getTextArg(PrintfArguments *p){
/*
** Render a string given by "fmt" into the StrAccum object.
*/
-SQLITE_PRIVATE void sqlite3VXPrintf(
- StrAccum *pAccum, /* Accumulate results here */
+SQLITE_API void sqlite3_str_vappendf(
+ sqlite3_str *pAccum, /* Accumulate results here */
const char *fmt, /* Format string */
va_list ap /* arguments */
){
@@ -25741,6 +26808,11 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
PrintfArguments *pArgList = 0; /* Arguments for SQLITE_PRINTF_SQLFUNC */
char buf[etBUFSIZE]; /* Conversion buffer */
+ /* pAccum never starts out with an empty buffer that was obtained from
+ ** malloc(). This precondition is required by the mprintf("%z...")
+ ** optimization. */
+ assert( pAccum->nChar>0 || (pAccum->printfFlags&SQLITE_PRINTF_MALLOCED)==0 );
+
bufpt = 0;
if( (pAccum->printfFlags & SQLITE_PRINTF_SQLFUNC)!=0 ){
pArgList = va_arg(ap, PrintfArguments*);
@@ -25756,11 +26828,11 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
#else
do{ fmt++; }while( *fmt && *fmt != '%' );
#endif
- sqlite3StrAccumAppend(pAccum, bufpt, (int)(fmt - bufpt));
+ sqlite3_str_append(pAccum, bufpt, (int)(fmt - bufpt));
if( *fmt==0 ) break;
}
if( (c=(*++fmt))==0 ){
- sqlite3StrAccumAppend(pAccum, "%", 1);
+ sqlite3_str_append(pAccum, "%", 1);
break;
}
/* Find out what flags are present */
@@ -25938,7 +27010,7 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
u64 n = (u64)precision + 10 + precision/3;
zOut = zExtra = sqlite3Malloc( n );
if( zOut==0 ){
- setStrAccumError(pAccum, STRACCUM_NOMEM);
+ setStrAccumError(pAccum, SQLITE_NOMEM);
return;
}
nOut = (int)n;
@@ -26063,7 +27135,7 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
bufpt = zExtra
= sqlite3Malloc( MAX(e2,0)+(i64)precision+(i64)width+15 );
if( bufpt==0 ){
- setStrAccumError(pAccum, STRACCUM_NOMEM);
+ setStrAccumError(pAccum, SQLITE_NOMEM);
return;
}
}
@@ -26159,22 +27231,52 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
case etCHARX:
if( bArgList ){
bufpt = getTextArg(pArgList);
- c = bufpt ? bufpt[0] : 0;
+ length = 1;
+ if( bufpt ){
+ buf[0] = c = *(bufpt++);
+ if( (c&0xc0)==0xc0 ){
+ while( length<4 && (bufpt[0]&0xc0)==0x80 ){
+ buf[length++] = *(bufpt++);
+ }
+ }
+ }else{
+ buf[0] = 0;
+ }
}else{
- c = va_arg(ap,int);
+ unsigned int ch = va_arg(ap,unsigned int);
+ if( ch<0x00080 ){
+ buf[0] = ch & 0xff;
+ length = 1;
+ }else if( ch<0x00800 ){
+ buf[0] = 0xc0 + (u8)((ch>>6)&0x1f);
+ buf[1] = 0x80 + (u8)(ch & 0x3f);
+ length = 2;
+ }else if( ch<0x10000 ){
+ buf[0] = 0xe0 + (u8)((ch>>12)&0x0f);
+ buf[1] = 0x80 + (u8)((ch>>6) & 0x3f);
+ buf[2] = 0x80 + (u8)(ch & 0x3f);
+ length = 3;
+ }else{
+ buf[0] = 0xf0 + (u8)((ch>>18) & 0x07);
+ buf[1] = 0x80 + (u8)((ch>>12) & 0x3f);
+ buf[2] = 0x80 + (u8)((ch>>6) & 0x3f);
+ buf[3] = 0x80 + (u8)(ch & 0x3f);
+ length = 4;
+ }
}
if( precision>1 ){
width -= precision-1;
if( width>1 && !flag_leftjustify ){
- sqlite3AppendChar(pAccum, width-1, ' ');
+ sqlite3_str_appendchar(pAccum, width-1, ' ');
width = 0;
}
- sqlite3AppendChar(pAccum, precision-1, c);
+ while( precision-- > 1 ){
+ sqlite3_str_append(pAccum, buf, length);
+ }
}
- length = 1;
- buf[0] = c;
bufpt = buf;
- break;
+ flag_altform2 = 1;
+ goto adjust_width_for_utf8;
case etSTRING:
case etDYNSTRING:
if( bArgList ){
@@ -26186,17 +27288,45 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
if( bufpt==0 ){
bufpt = "";
}else if( xtype==etDYNSTRING ){
+ if( pAccum->nChar==0 && pAccum->mxAlloc && width==0 && precision<0 ){
+ /* Special optimization for sqlite3_mprintf("%z..."):
+ ** Extend an existing memory allocation rather than creating
+ ** a new one. */
+ assert( (pAccum->printfFlags&SQLITE_PRINTF_MALLOCED)==0 );
+ pAccum->zText = bufpt;
+ pAccum->nAlloc = sqlite3DbMallocSize(pAccum->db, bufpt);
+ pAccum->nChar = 0x7fffffff & (int)strlen(bufpt);
+ pAccum->printfFlags |= SQLITE_PRINTF_MALLOCED;
+ length = 0;
+ break;
+ }
zExtra = bufpt;
}
if( precision>=0 ){
- for(length=0; length<precision && bufpt[length]; length++){}
+ if( flag_altform2 ){
+ /* Set length to the number of bytes needed in order to display
+ ** precision characters */
+ unsigned char *z = (unsigned char*)bufpt;
+ while( precision-- > 0 && z[0] ){
+ SQLITE_SKIP_UTF8(z);
+ }
+ length = (int)(z - (unsigned char*)bufpt);
+ }else{
+ for(length=0; length<precision && bufpt[length]; length++){}
+ }
}else{
length = 0x7fffffff & (int)strlen(bufpt);
}
+ adjust_width_for_utf8:
+ if( flag_altform2 && width>0 ){
+ /* Adjust width to account for extra bytes in UTF-8 characters */
+ int ii = length - 1;
+ while( ii>=0 ) if( (bufpt[ii--] & 0xc0)==0x80 ) width++;
+ }
break;
- case etSQLESCAPE: /* Escape ' characters */
- case etSQLESCAPE2: /* Escape ' and enclose in '...' */
- case etSQLESCAPE3: { /* Escape " characters */
+ case etSQLESCAPE: /* %q: Escape ' characters */
+ case etSQLESCAPE2: /* %Q: Escape ' and enclose in '...' */
+ case etSQLESCAPE3: { /* %w: Escape " characters */
int i, j, k, n, isnull;
int needQuote;
char ch;
@@ -26210,16 +27340,24 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
}
isnull = escarg==0;
if( isnull ) escarg = (xtype==etSQLESCAPE2 ? "NULL" : "(NULL)");
+ /* For %q, %Q, and %w, the precision is the number of byte (or
+ ** characters if the ! flags is present) to use from the input.
+ ** Because of the extra quoting characters inserted, the number
+ ** of output characters may be larger than the precision.
+ */
k = precision;
for(i=n=0; k!=0 && (ch=escarg[i])!=0; i++, k--){
if( ch==q ) n++;
+ if( flag_altform2 && (ch&0xc0)==0xc0 ){
+ while( (escarg[i+1]&0xc0)==0x80 ){ i++; }
+ }
}
needQuote = !isnull && xtype==etSQLESCAPE2;
n += i + 3;
if( n>etBUFSIZE ){
bufpt = zExtra = sqlite3Malloc( n );
if( bufpt==0 ){
- setStrAccumError(pAccum, STRACCUM_NOMEM);
+ setStrAccumError(pAccum, SQLITE_NOMEM);
return;
}
}else{
@@ -26235,10 +27373,7 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
if( needQuote ) bufpt[j++] = q;
bufpt[j] = 0;
length = j;
- /* The precision in %q and %Q means how many input characters to
- ** consume, not the length of the output...
- ** if( precision>=0 && precision<length ) length = precision; */
- break;
+ goto adjust_width_for_utf8;
}
case etTOKEN: {
Token *pToken;
@@ -26246,7 +27381,7 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
pToken = va_arg(ap, Token*);
assert( bArgList==0 );
if( pToken && pToken->n ){
- sqlite3StrAccumAppend(pAccum, (const char*)pToken->z, pToken->n);
+ sqlite3_str_append(pAccum, (const char*)pToken->z, pToken->n);
}
length = width = 0;
break;
@@ -26262,10 +27397,10 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
assert( bArgList==0 );
assert( k>=0 && k<pSrc->nSrc );
if( pItem->zDatabase ){
- sqlite3StrAccumAppendAll(pAccum, pItem->zDatabase);
- sqlite3StrAccumAppend(pAccum, ".", 1);
+ sqlite3_str_appendall(pAccum, pItem->zDatabase);
+ sqlite3_str_append(pAccum, ".", 1);
}
- sqlite3StrAccumAppendAll(pAccum, pItem->zName);
+ sqlite3_str_appendall(pAccum, pItem->zName);
length = width = 0;
break;
}
@@ -26277,15 +27412,18 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
/*
** The text of the conversion is pointed to by "bufpt" and is
** "length" characters long. The field width is "width". Do
- ** the output.
+ ** the output. Both length and width are in bytes, not characters,
+ ** at this point. If the "!" flag was present on string conversions
+ ** indicating that width and precision should be expressed in characters,
+ ** then the values have been translated prior to reaching this point.
*/
width -= length;
if( width>0 ){
- if( !flag_leftjustify ) sqlite3AppendChar(pAccum, width, ' ');
- sqlite3StrAccumAppend(pAccum, bufpt, length);
- if( flag_leftjustify ) sqlite3AppendChar(pAccum, width, ' ');
+ if( !flag_leftjustify ) sqlite3_str_appendchar(pAccum, width, ' ');
+ sqlite3_str_append(pAccum, bufpt, length);
+ if( flag_leftjustify ) sqlite3_str_appendchar(pAccum, width, ' ');
}else{
- sqlite3StrAccumAppend(pAccum, bufpt, length);
+ sqlite3_str_append(pAccum, bufpt, length);
}
if( zExtra ){
@@ -26306,13 +27444,13 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){
char *zNew;
assert( p->nChar+(i64)N >= p->nAlloc ); /* Only called if really needed */
if( p->accError ){
- testcase(p->accError==STRACCUM_TOOBIG);
- testcase(p->accError==STRACCUM_NOMEM);
+ testcase(p->accError==SQLITE_TOOBIG);
+ testcase(p->accError==SQLITE_NOMEM);
return 0;
}
if( p->mxAlloc==0 ){
N = p->nAlloc - p->nChar - 1;
- setStrAccumError(p, STRACCUM_TOOBIG);
+ setStrAccumError(p, SQLITE_TOOBIG);
return N;
}else{
char *zOld = isMalloced(p) ? p->zText : 0;
@@ -26324,8 +27462,8 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){
szNew += p->nChar;
}
if( szNew > p->mxAlloc ){
- sqlite3StrAccumReset(p);
- setStrAccumError(p, STRACCUM_TOOBIG);
+ sqlite3_str_reset(p);
+ setStrAccumError(p, SQLITE_TOOBIG);
return 0;
}else{
p->nAlloc = (int)szNew;
@@ -26342,8 +27480,8 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){
p->nAlloc = sqlite3DbMallocSize(p->db, zNew);
p->printfFlags |= SQLITE_PRINTF_MALLOCED;
}else{
- sqlite3StrAccumReset(p);
- setStrAccumError(p, STRACCUM_NOMEM);
+ sqlite3_str_reset(p);
+ setStrAccumError(p, SQLITE_NOMEM);
return 0;
}
}
@@ -26353,7 +27491,7 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){
/*
** Append N copies of character c to the given string buffer.
*/
-SQLITE_PRIVATE void sqlite3AppendChar(StrAccum *p, int N, char c){
+SQLITE_API void sqlite3_str_appendchar(sqlite3_str *p, int N, char c){
testcase( p->nChar + (i64)N > 0x7fffffff );
if( p->nChar+(i64)N >= p->nAlloc && (N = sqlite3StrAccumEnlarge(p, N))<=0 ){
return;
@@ -26365,9 +27503,9 @@ SQLITE_PRIVATE void sqlite3AppendChar(StrAccum *p, int N, char c){
** The StrAccum "p" is not large enough to accept N new bytes of z[].
** So enlarge if first, then do the append.
**
-** This is a helper routine to sqlite3StrAccumAppend() that does special-case
+** This is a helper routine to sqlite3_str_append() that does special-case
** work (enlarging the buffer) using tail recursion, so that the
-** sqlite3StrAccumAppend() routine can use fast calling semantics.
+** sqlite3_str_append() routine can use fast calling semantics.
*/
static void SQLITE_NOINLINE enlargeAndAppend(StrAccum *p, const char *z, int N){
N = sqlite3StrAccumEnlarge(p, N);
@@ -26381,7 +27519,7 @@ static void SQLITE_NOINLINE enlargeAndAppend(StrAccum *p, const char *z, int N){
** Append N bytes of text from z to the StrAccum object. Increase the
** size of the memory allocation for StrAccum if necessary.
*/
-SQLITE_PRIVATE void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){
+SQLITE_API void sqlite3_str_append(sqlite3_str *p, const char *z, int N){
assert( z!=0 || N==0 );
assert( p->zText!=0 || p->nChar==0 || p->accError );
assert( N>=0 );
@@ -26398,8 +27536,8 @@ SQLITE_PRIVATE void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){
/*
** Append the complete text of zero-terminated string z[] to the p string.
*/
-SQLITE_PRIVATE void sqlite3StrAccumAppendAll(StrAccum *p, const char *z){
- sqlite3StrAccumAppend(p, z, sqlite3Strlen30(z));
+SQLITE_API void sqlite3_str_appendall(sqlite3_str *p, const char *z){
+ sqlite3_str_append(p, z, sqlite3Strlen30(z));
}
@@ -26416,7 +27554,7 @@ static SQLITE_NOINLINE char *strAccumFinishRealloc(StrAccum *p){
memcpy(zText, p->zText, p->nChar+1);
p->printfFlags |= SQLITE_PRINTF_MALLOCED;
}else{
- setStrAccumError(p, STRACCUM_NOMEM);
+ setStrAccumError(p, SQLITE_NOMEM);
}
p->zText = zText;
return zText;
@@ -26432,13 +27570,55 @@ SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum *p){
}
/*
+** This singleton is an sqlite3_str object that is returned if
+** sqlite3_malloc() fails to provide space for a real one. This
+** sqlite3_str object accepts no new text and always returns
+** an SQLITE_NOMEM error.
+*/
+static sqlite3_str sqlite3OomStr = {
+ 0, 0, 0, 0, 0, SQLITE_NOMEM, 0
+};
+
+/* Finalize a string created using sqlite3_str_new().
+*/
+SQLITE_API char *sqlite3_str_finish(sqlite3_str *p){
+ char *z;
+ if( p!=0 && p!=&sqlite3OomStr ){
+ z = sqlite3StrAccumFinish(p);
+ sqlite3_free(p);
+ }else{
+ z = 0;
+ }
+ return z;
+}
+
+/* Return any error code associated with p */
+SQLITE_API int sqlite3_str_errcode(sqlite3_str *p){
+ return p ? p->accError : SQLITE_NOMEM;
+}
+
+/* Return the current length of p in bytes */
+SQLITE_API int sqlite3_str_length(sqlite3_str *p){
+ return p ? p->nChar : 0;
+}
+
+/* Return the current value for p */
+SQLITE_API char *sqlite3_str_value(sqlite3_str *p){
+ if( p==0 || p->nChar==0 ) return 0;
+ p->zText[p->nChar] = 0;
+ return p->zText;
+}
+
+/*
** Reset an StrAccum string. Reclaim all malloced memory.
*/
-SQLITE_PRIVATE void sqlite3StrAccumReset(StrAccum *p){
+SQLITE_API void sqlite3_str_reset(StrAccum *p){
if( isMalloced(p) ){
sqlite3DbFree(p->db, p->zText);
p->printfFlags &= ~SQLITE_PRINTF_MALLOCED;
}
+ p->nAlloc = 0;
+ p->nChar = 0;
p->zText = 0;
}
@@ -26466,6 +27646,18 @@ SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum *p, sqlite3 *db, char *zBase, i
p->printfFlags = 0;
}
+/* Allocate and initialize a new dynamic string object */
+SQLITE_API sqlite3_str *sqlite3_str_new(sqlite3 *db){
+ sqlite3_str *p = sqlite3_malloc64(sizeof(*p));
+ if( p ){
+ sqlite3StrAccumInit(p, 0, 0, 0,
+ db ? db->aLimit[SQLITE_LIMIT_LENGTH] : SQLITE_MAX_LENGTH);
+ }else{
+ p = &sqlite3OomStr;
+ }
+ return p;
+}
+
/*
** Print into memory obtained from sqliteMalloc(). Use the internal
** %-conversion extensions.
@@ -26478,9 +27670,9 @@ SQLITE_PRIVATE char *sqlite3VMPrintf(sqlite3 *db, const char *zFormat, va_list a
sqlite3StrAccumInit(&acc, db, zBase, sizeof(zBase),
db->aLimit[SQLITE_LIMIT_LENGTH]);
acc.printfFlags = SQLITE_PRINTF_INTERNAL;
- sqlite3VXPrintf(&acc, zFormat, ap);
+ sqlite3_str_vappendf(&acc, zFormat, ap);
z = sqlite3StrAccumFinish(&acc);
- if( acc.accError==STRACCUM_NOMEM ){
+ if( acc.accError==SQLITE_NOMEM ){
sqlite3OomFault(db);
}
return z;
@@ -26518,7 +27710,7 @@ SQLITE_API char *sqlite3_vmprintf(const char *zFormat, va_list ap){
if( sqlite3_initialize() ) return 0;
#endif
sqlite3StrAccumInit(&acc, 0, zBase, sizeof(zBase), SQLITE_MAX_LENGTH);
- sqlite3VXPrintf(&acc, zFormat, ap);
+ sqlite3_str_vappendf(&acc, zFormat, ap);
z = sqlite3StrAccumFinish(&acc);
return z;
}
@@ -26563,7 +27755,7 @@ SQLITE_API char *sqlite3_vsnprintf(int n, char *zBuf, const char *zFormat, va_li
}
#endif
sqlite3StrAccumInit(&acc, 0, zBuf, n, 0);
- sqlite3VXPrintf(&acc, zFormat, ap);
+ sqlite3_str_vappendf(&acc, zFormat, ap);
zBuf[acc.nChar] = 0;
return zBuf;
}
@@ -26585,7 +27777,7 @@ SQLITE_API char *sqlite3_snprintf(int n, char *zBuf, const char *zFormat, ...){
** allocate memory because it might be called while the memory allocator
** mutex is held.
**
-** sqlite3VXPrintf() might ask for *temporary* memory allocations for
+** sqlite3_str_vappendf() might ask for *temporary* memory allocations for
** certain format characters (%q) or for very large precisions or widths.
** Care must be taken that any sqlite3_log() calls that occur while the
** memory mutex is held do not use these mechanisms.
@@ -26595,7 +27787,7 @@ static void renderLogMsg(int iErrCode, const char *zFormat, va_list ap){
char zMsg[SQLITE_PRINT_BUF_SIZE*3]; /* Complete log message */
sqlite3StrAccumInit(&acc, 0, zMsg, sizeof(zMsg), 0);
- sqlite3VXPrintf(&acc, zFormat, ap);
+ sqlite3_str_vappendf(&acc, zFormat, ap);
sqlite3GlobalConfig.xLog(sqlite3GlobalConfig.pLogArg, iErrCode,
sqlite3StrAccumFinish(&acc));
}
@@ -26624,23 +27816,30 @@ SQLITE_PRIVATE void sqlite3DebugPrintf(const char *zFormat, ...){
char zBuf[500];
sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0);
va_start(ap,zFormat);
- sqlite3VXPrintf(&acc, zFormat, ap);
+ sqlite3_str_vappendf(&acc, zFormat, ap);
va_end(ap);
sqlite3StrAccumFinish(&acc);
+#ifdef SQLITE_OS_TRACE_PROC
+ {
+ extern void SQLITE_OS_TRACE_PROC(const char *zBuf, int nBuf);
+ SQLITE_OS_TRACE_PROC(zBuf, sizeof(zBuf));
+ }
+#else
fprintf(stdout,"%s", zBuf);
fflush(stdout);
+#endif
}
#endif
/*
-** variable-argument wrapper around sqlite3VXPrintf(). The bFlags argument
+** variable-argument wrapper around sqlite3_str_vappendf(). The bFlags argument
** can contain the bit SQLITE_PRINTF_INTERNAL enable internal formats.
*/
-SQLITE_PRIVATE void sqlite3XPrintf(StrAccum *p, const char *zFormat, ...){
+SQLITE_API void sqlite3_str_appendf(StrAccum *p, const char *zFormat, ...){
va_list ap;
va_start(ap,zFormat);
- sqlite3VXPrintf(p, zFormat, ap);
+ sqlite3_str_vappendf(p, zFormat, ap);
va_end(ap);
}
@@ -26706,15 +27905,17 @@ static void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){
sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0);
if( p ){
for(i=0; i<p->iLevel && i<sizeof(p->bLine)-1; i++){
- sqlite3StrAccumAppend(&acc, p->bLine[i] ? "| " : " ", 4);
+ sqlite3_str_append(&acc, p->bLine[i] ? "| " : " ", 4);
}
- sqlite3StrAccumAppend(&acc, p->bLine[i] ? "|-- " : "'-- ", 4);
+ sqlite3_str_append(&acc, p->bLine[i] ? "|-- " : "'-- ", 4);
+ }
+ if( zFormat!=0 ){
+ va_start(ap, zFormat);
+ sqlite3_str_vappendf(&acc, zFormat, ap);
+ va_end(ap);
+ assert( acc.nChar>0 );
+ sqlite3_str_append(&acc, "\n", 1);
}
- va_start(ap, zFormat);
- sqlite3VXPrintf(&acc, zFormat, ap);
- va_end(ap);
- assert( acc.nChar>0 );
- if( zBuf[acc.nChar-1]!='\n' ) sqlite3StrAccumAppend(&acc, "\n", 1);
sqlite3StrAccumFinish(&acc);
fprintf(stdout,"%s", zBuf);
fflush(stdout);
@@ -26747,17 +27948,17 @@ SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 m
char zLine[1000];
const struct Cte *pCte = &pWith->a[i];
sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0);
- sqlite3XPrintf(&x, "%s", pCte->zName);
+ sqlite3_str_appendf(&x, "%s", pCte->zName);
if( pCte->pCols && pCte->pCols->nExpr>0 ){
char cSep = '(';
int j;
for(j=0; j<pCte->pCols->nExpr; j++){
- sqlite3XPrintf(&x, "%c%s", cSep, pCte->pCols->a[j].zName);
+ sqlite3_str_appendf(&x, "%c%s", cSep, pCte->pCols->a[j].zName);
cSep = ',';
}
- sqlite3XPrintf(&x, ")");
+ sqlite3_str_appendf(&x, ")");
}
- sqlite3XPrintf(&x, " AS");
+ sqlite3_str_appendf(&x, " AS");
sqlite3StrAccumFinish(&x);
sqlite3TreeViewItem(pView, zLine, i<pWith->nCte-1);
sqlite3TreeViewSelect(pView, pCte->pSelect, 0);
@@ -26785,11 +27986,21 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m
sqlite3TreeViewPush(pView, 1);
}
do{
+#if SELECTTRACE_ENABLED
+ sqlite3TreeViewLine(pView,
+ "SELECT%s%s (%s/%p) selFlags=0x%x nSelectRow=%d",
+ ((p->selFlags & SF_Distinct) ? " DISTINCT" : ""),
+ ((p->selFlags & SF_Aggregate) ? " agg_flag" : ""),
+ p->zSelName, p, p->selFlags,
+ (int)p->nSelectRow
+ );
+#else
sqlite3TreeViewLine(pView, "SELECT%s%s (0x%p) selFlags=0x%x nSelectRow=%d",
((p->selFlags & SF_Distinct) ? " DISTINCT" : ""),
((p->selFlags & SF_Aggregate) ? " agg_flag" : ""), p, p->selFlags,
(int)p->nSelectRow
);
+#endif
if( cnt++ ) sqlite3TreeViewPop(pView);
if( p->pPrior ){
n = 1000;
@@ -26801,7 +28012,6 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m
if( p->pHaving ) n++;
if( p->pOrderBy ) n++;
if( p->pLimit ) n++;
- if( p->pOffset ) n++;
}
sqlite3TreeViewExprList(pView, p->pEList, (n--)>0, "result-set");
if( p->pSrc && p->pSrc->nSrc ){
@@ -26813,20 +28023,20 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m
StrAccum x;
char zLine[100];
sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0);
- sqlite3XPrintf(&x, "{%d,*}", pItem->iCursor);
+ sqlite3_str_appendf(&x, "{%d,*}", pItem->iCursor);
if( pItem->zDatabase ){
- sqlite3XPrintf(&x, " %s.%s", pItem->zDatabase, pItem->zName);
+ sqlite3_str_appendf(&x, " %s.%s", pItem->zDatabase, pItem->zName);
}else if( pItem->zName ){
- sqlite3XPrintf(&x, " %s", pItem->zName);
+ sqlite3_str_appendf(&x, " %s", pItem->zName);
}
if( pItem->pTab ){
- sqlite3XPrintf(&x, " tabname=%Q", pItem->pTab->zName);
+ sqlite3_str_appendf(&x, " tabname=%Q", pItem->pTab->zName);
}
if( pItem->zAlias ){
- sqlite3XPrintf(&x, " (AS %s)", pItem->zAlias);
+ sqlite3_str_appendf(&x, " (AS %s)", pItem->zAlias);
}
if( pItem->fg.jointype & JT_LEFT ){
- sqlite3XPrintf(&x, " LEFT-JOIN");
+ sqlite3_str_appendf(&x, " LEFT-JOIN");
}
sqlite3StrAccumFinish(&x);
sqlite3TreeViewItem(pView, zLine, i<p->pSrc->nSrc-1);
@@ -26858,12 +28068,12 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m
}
if( p->pLimit ){
sqlite3TreeViewItem(pView, "LIMIT", (n--)>0);
- sqlite3TreeViewExpr(pView, p->pLimit, 0);
- sqlite3TreeViewPop(pView);
- }
- if( p->pOffset ){
- sqlite3TreeViewItem(pView, "OFFSET", (n--)>0);
- sqlite3TreeViewExpr(pView, p->pOffset, 0);
+ sqlite3TreeViewExpr(pView, p->pLimit->pLeft, p->pLimit->pRight!=0);
+ if( p->pLimit->pRight ){
+ sqlite3TreeViewItem(pView, "OFFSET", (n--)>0);
+ sqlite3TreeViewExpr(pView, p->pLimit->pRight, 0);
+ sqlite3TreeViewPop(pView);
+ }
sqlite3TreeViewPop(pView);
}
if( p->pPrior ){
@@ -26941,6 +28151,11 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
sqlite3TreeViewLine(pView,"NULL");
break;
}
+ case TK_TRUEFALSE: {
+ sqlite3TreeViewLine(pView,
+ sqlite3ExprTruthValue(pExpr) ? "TRUE" : "FALSE");
+ break;
+ }
#ifndef SQLITE_OMIT_BLOB_LITERAL
case TK_BLOB: {
sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken);
@@ -26997,6 +28212,19 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
case TK_ISNULL: zUniOp = "ISNULL"; break;
case TK_NOTNULL: zUniOp = "NOTNULL"; break;
+ case TK_TRUTH: {
+ int x;
+ const char *azOp[] = {
+ "IS-FALSE", "IS-TRUE", "IS-NOT-FALSE", "IS-NOT-TRUE"
+ };
+ assert( pExpr->op2==TK_IS || pExpr->op2==TK_ISNOT );
+ assert( pExpr->pRight );
+ assert( pExpr->pRight->op==TK_TRUEFALSE );
+ x = (pExpr->op2==TK_ISNOT)*2 + sqlite3ExprTruthValue(pExpr->pRight);
+ zUniOp = azOp[x];
+ break;
+ }
+
case TK_SPAN: {
sqlite3TreeViewLine(pView, "SPAN %Q", pExpr->u.zToken);
sqlite3TreeViewExpr(pView, pExpr->pLeft, 0);
@@ -27156,12 +28384,25 @@ SQLITE_PRIVATE void sqlite3TreeViewBareExprList(
sqlite3TreeViewLine(pView, "%s", zLabel);
for(i=0; i<pList->nExpr; i++){
int j = pList->a[i].u.x.iOrderByCol;
- if( j ){
- sqlite3TreeViewPush(pView, 0);
- sqlite3TreeViewLine(pView, "iOrderByCol=%d", j);
+ char *zName = pList->a[i].zName;
+ int moreToFollow = i<pList->nExpr - 1;
+ if( j || zName ){
+ sqlite3TreeViewPush(pView, moreToFollow);
+ moreToFollow = 0;
+ sqlite3TreeViewLine(pView, 0);
+ if( zName ){
+ fprintf(stdout, "AS %s ", zName);
+ }
+ if( j ){
+ fprintf(stdout, "iOrderByCol=%d", j);
+ }
+ fprintf(stdout, "\n");
+ fflush(stdout);
+ }
+ sqlite3TreeViewExpr(pView, pList->a[i].pExpr, moreToFollow);
+ if( j || zName ){
+ sqlite3TreeViewPop(pView);
}
- sqlite3TreeViewExpr(pView, pList->a[i].pExpr, i<pList->nExpr-1);
- if( j ) sqlite3TreeViewPop(pView);
}
}
}
@@ -28452,6 +29693,45 @@ SQLITE_API int sqlite3_strnicmp(const char *zLeft, const char *zRight, int N){
}
/*
+** Compute 10 to the E-th power. Examples: E==1 results in 10.
+** E==2 results in 100. E==50 results in 1.0e50.
+**
+** This routine only works for values of E between 1 and 341.
+*/
+static LONGDOUBLE_TYPE sqlite3Pow10(int E){
+#if defined(_MSC_VER)
+ static const LONGDOUBLE_TYPE x[] = {
+ 1.0e+001,
+ 1.0e+002,
+ 1.0e+004,
+ 1.0e+008,
+ 1.0e+016,
+ 1.0e+032,
+ 1.0e+064,
+ 1.0e+128,
+ 1.0e+256
+ };
+ LONGDOUBLE_TYPE r = 1.0;
+ int i;
+ assert( E>=0 && E<=307 );
+ for(i=0; E!=0; i++, E >>=1){
+ if( E & 1 ) r *= x[i];
+ }
+ return r;
+#else
+ LONGDOUBLE_TYPE x = 10.0;
+ LONGDOUBLE_TYPE r = 1.0;
+ while(1){
+ if( E & 1 ) r *= x;
+ E >>= 1;
+ if( E==0 ) break;
+ x *= x;
+ }
+ return r;
+#endif
+}
+
+/*
** The string z[] is an text representation of a real number.
** Convert this string to a double and write it into *pResult.
**
@@ -28518,12 +29798,12 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 en
/* copy max significant digits to significand */
while( z<zEnd && sqlite3Isdigit(*z) && s<((LARGEST_INT64-9)/10) ){
s = s*10 + (*z - '0');
- z+=incr, nDigits++;
+ z+=incr; nDigits++;
}
/* skip non-significant significand digits
** (increase exponent by d to shift decimal left) */
- while( z<zEnd && sqlite3Isdigit(*z) ) z+=incr, nDigits++, d++;
+ while( z<zEnd && sqlite3Isdigit(*z) ){ z+=incr; nDigits++; d++; }
if( z>=zEnd ) goto do_atof_calc;
/* if decimal point is present */
@@ -28536,7 +29816,7 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 en
s = s*10 + (*z - '0');
d--;
}
- z+=incr, nDigits++;
+ z+=incr; nDigits++;
}
}
if( z>=zEnd ) goto do_atof_calc;
@@ -28606,11 +29886,10 @@ do_atof_calc:
if( e==0 ){ /*OPTIMIZATION-IF-TRUE*/
result = (double)s;
}else{
- LONGDOUBLE_TYPE scale = 1.0;
/* attempt to handle extremely small/large numbers better */
if( e>307 ){ /*OPTIMIZATION-IF-TRUE*/
if( e<342 ){ /*OPTIMIZATION-IF-TRUE*/
- while( e%308 ) { scale *= 1.0e+1; e -= 1; }
+ LONGDOUBLE_TYPE scale = sqlite3Pow10(e-308);
if( esign<0 ){
result = s / scale;
result /= 1.0e+308;
@@ -28630,10 +29909,7 @@ do_atof_calc:
}
}
}else{
- /* 1.0e+22 is the largest power of 10 than can be
- ** represented exactly. */
- while( e%22 ) { scale *= 1.0e+1; e -= 1; }
- while( e>0 ) { scale *= 1.0e+22; e -= 22; }
+ LONGDOUBLE_TYPE scale = sqlite3Pow10(e);
if( esign<0 ){
result = s / scale;
}else{
@@ -28691,7 +29967,7 @@ static int compare2pow63(const char *zNum, int incr){
** Returns:
**
** 0 Successful transformation. Fits in a 64-bit signed integer.
-** 1 Excess text after the integer value
+** 1 Excess non-space text after the integer value
** 2 Integer too large for a 64-bit signed integer or is malformed
** 3 Special case of 9223372036854775808
**
@@ -28734,47 +30010,57 @@ SQLITE_PRIVATE int sqlite3Atoi64(const char *zNum, i64 *pNum, int length, u8 enc
for(i=0; &zNum[i]<zEnd && (c=zNum[i])>='0' && c<='9'; i+=incr){
u = u*10 + c - '0';
}
+ testcase( i==18*incr );
+ testcase( i==19*incr );
+ testcase( i==20*incr );
if( u>LARGEST_INT64 ){
+ /* This test and assignment is needed only to suppress UB warnings
+ ** from clang and -fsanitize=undefined. This test and assignment make
+ ** the code a little larger and slower, and no harm comes from omitting
+ ** them, but we must appaise the undefined-behavior pharisees. */
*pNum = neg ? SMALLEST_INT64 : LARGEST_INT64;
}else if( neg ){
*pNum = -(i64)u;
}else{
*pNum = (i64)u;
}
- testcase( i==18 );
- testcase( i==19 );
- testcase( i==20 );
- if( &zNum[i]<zEnd /* Extra bytes at the end */
- || (i==0 && zStart==zNum) /* No digits */
+ rc = 0;
+ if( (i==0 && zStart==zNum) /* No digits */
|| nonNum /* UTF16 with high-order bytes non-zero */
){
rc = 1;
- }else{
- rc = 0;
+ }else if( &zNum[i]<zEnd ){ /* Extra bytes at the end */
+ int jj = i;
+ do{
+ if( !sqlite3Isspace(zNum[jj]) ){
+ rc = 1; /* Extra non-space text after the integer */
+ break;
+ }
+ jj += incr;
+ }while( &zNum[jj]<zEnd );
}
- if( i>19*incr ){ /* Too many digits */
- /* zNum is empty or contains non-numeric text or is longer
- ** than 19 digits (thus guaranteeing that it is too large) */
- return 2;
- }else if( i<19*incr ){
+ if( i<19*incr ){
/* Less than 19 digits, so we know that it fits in 64 bits */
assert( u<=LARGEST_INT64 );
return rc;
}else{
/* zNum is a 19-digit numbers. Compare it against 9223372036854775808. */
- c = compare2pow63(zNum, incr);
+ c = i>19*incr ? 1 : compare2pow63(zNum, incr);
if( c<0 ){
/* zNum is less than 9223372036854775808 so it fits */
assert( u<=LARGEST_INT64 );
return rc;
- }else if( c>0 ){
- /* zNum is greater than 9223372036854775808 so it overflows */
- return 2;
}else{
- /* zNum is exactly 9223372036854775808. Fits if negative. The
- ** special case 2 overflow if positive */
- assert( u-1==LARGEST_INT64 );
- return neg ? rc : 3;
+ *pNum = neg ? SMALLEST_INT64 : LARGEST_INT64;
+ if( c>0 ){
+ /* zNum is greater than 9223372036854775808 so it overflows */
+ return 2;
+ }else{
+ /* zNum is exactly 9223372036854775808. Fits if negative. The
+ ** special case 2 overflow if positive */
+ assert( u-1==LARGEST_INT64 );
+ return neg ? rc : 3;
+ }
}
}
}
@@ -30079,90 +31365,94 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){
/* 81 */ "RealAffinity" OpHelp(""),
/* 82 */ "Cast" OpHelp("affinity(r[P1])"),
/* 83 */ "Permutation" OpHelp(""),
- /* 84 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"),
- /* 85 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"),
- /* 86 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<<r[P1]"),
- /* 87 */ "ShiftRight" OpHelp("r[P3]=r[P2]>>r[P1]"),
- /* 88 */ "Add" OpHelp("r[P3]=r[P1]+r[P2]"),
- /* 89 */ "Subtract" OpHelp("r[P3]=r[P2]-r[P1]"),
- /* 90 */ "Multiply" OpHelp("r[P3]=r[P1]*r[P2]"),
- /* 91 */ "Divide" OpHelp("r[P3]=r[P2]/r[P1]"),
- /* 92 */ "Remainder" OpHelp("r[P3]=r[P2]%r[P1]"),
- /* 93 */ "Concat" OpHelp("r[P3]=r[P2]+r[P1]"),
- /* 94 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"),
- /* 95 */ "BitNot" OpHelp("r[P1]= ~r[P1]"),
- /* 96 */ "Column" OpHelp("r[P3]=PX"),
- /* 97 */ "String8" OpHelp("r[P2]='P4'"),
- /* 98 */ "Affinity" OpHelp("affinity(r[P1@P2])"),
- /* 99 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"),
- /* 100 */ "Count" OpHelp("r[P2]=count()"),
- /* 101 */ "ReadCookie" OpHelp(""),
- /* 102 */ "SetCookie" OpHelp(""),
- /* 103 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"),
- /* 104 */ "OpenRead" OpHelp("root=P2 iDb=P3"),
- /* 105 */ "OpenWrite" OpHelp("root=P2 iDb=P3"),
- /* 106 */ "OpenDup" OpHelp(""),
- /* 107 */ "OpenAutoindex" OpHelp("nColumn=P2"),
- /* 108 */ "OpenEphemeral" OpHelp("nColumn=P2"),
- /* 109 */ "SorterOpen" OpHelp(""),
- /* 110 */ "SequenceTest" OpHelp("if( cursor[P1].ctr++ ) pc = P2"),
- /* 111 */ "OpenPseudo" OpHelp("P3 columns in r[P2]"),
- /* 112 */ "Close" OpHelp(""),
- /* 113 */ "ColumnsUsed" OpHelp(""),
- /* 114 */ "Sequence" OpHelp("r[P2]=cursor[P1].ctr++"),
- /* 115 */ "NewRowid" OpHelp("r[P2]=rowid"),
- /* 116 */ "Insert" OpHelp("intkey=r[P3] data=r[P2]"),
- /* 117 */ "InsertInt" OpHelp("intkey=P3 data=r[P2]"),
- /* 118 */ "Delete" OpHelp(""),
- /* 119 */ "ResetCount" OpHelp(""),
- /* 120 */ "SorterCompare" OpHelp("if key(P1)!=trim(r[P3],P4) goto P2"),
- /* 121 */ "SorterData" OpHelp("r[P2]=data"),
- /* 122 */ "RowData" OpHelp("r[P2]=data"),
- /* 123 */ "Rowid" OpHelp("r[P2]=rowid"),
- /* 124 */ "NullRow" OpHelp(""),
- /* 125 */ "SeekEnd" OpHelp(""),
- /* 126 */ "SorterInsert" OpHelp("key=r[P2]"),
- /* 127 */ "IdxInsert" OpHelp("key=r[P2]"),
- /* 128 */ "IdxDelete" OpHelp("key=r[P2@P3]"),
- /* 129 */ "DeferredSeek" OpHelp("Move P3 to P1.rowid if needed"),
- /* 130 */ "IdxRowid" OpHelp("r[P2]=rowid"),
- /* 131 */ "Destroy" OpHelp(""),
- /* 132 */ "Real" OpHelp("r[P2]=P4"),
- /* 133 */ "Clear" OpHelp(""),
- /* 134 */ "ResetSorter" OpHelp(""),
- /* 135 */ "CreateBtree" OpHelp("r[P2]=root iDb=P1 flags=P3"),
- /* 136 */ "SqlExec" OpHelp(""),
- /* 137 */ "ParseSchema" OpHelp(""),
- /* 138 */ "LoadAnalysis" OpHelp(""),
- /* 139 */ "DropTable" OpHelp(""),
- /* 140 */ "DropIndex" OpHelp(""),
- /* 141 */ "DropTrigger" OpHelp(""),
- /* 142 */ "IntegrityCk" OpHelp(""),
- /* 143 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"),
- /* 144 */ "Param" OpHelp(""),
- /* 145 */ "FkCounter" OpHelp("fkctr[P1]+=P2"),
- /* 146 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"),
- /* 147 */ "OffsetLimit" OpHelp("if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"),
- /* 148 */ "AggStep0" OpHelp("accum=r[P3] step(r[P2@P5])"),
- /* 149 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"),
- /* 150 */ "AggFinal" OpHelp("accum=r[P1] N=P2"),
- /* 151 */ "Expire" OpHelp(""),
- /* 152 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"),
- /* 153 */ "VBegin" OpHelp(""),
- /* 154 */ "VCreate" OpHelp(""),
- /* 155 */ "VDestroy" OpHelp(""),
- /* 156 */ "VOpen" OpHelp(""),
- /* 157 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"),
- /* 158 */ "VRename" OpHelp(""),
- /* 159 */ "Pagecount" OpHelp(""),
- /* 160 */ "MaxPgcnt" OpHelp(""),
- /* 161 */ "PureFunc0" OpHelp(""),
- /* 162 */ "Function0" OpHelp("r[P3]=func(r[P2@P5])"),
- /* 163 */ "PureFunc" OpHelp(""),
- /* 164 */ "Function" OpHelp("r[P3]=func(r[P2@P5])"),
- /* 165 */ "CursorHint" OpHelp(""),
- /* 166 */ "Noop" OpHelp(""),
- /* 167 */ "Explain" OpHelp(""),
+ /* 84 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"),
+ /* 85 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"),
+ /* 86 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"),
+ /* 87 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<<r[P1]"),
+ /* 88 */ "ShiftRight" OpHelp("r[P3]=r[P2]>>r[P1]"),
+ /* 89 */ "Add" OpHelp("r[P3]=r[P1]+r[P2]"),
+ /* 90 */ "Subtract" OpHelp("r[P3]=r[P2]-r[P1]"),
+ /* 91 */ "Multiply" OpHelp("r[P3]=r[P1]*r[P2]"),
+ /* 92 */ "Divide" OpHelp("r[P3]=r[P2]/r[P1]"),
+ /* 93 */ "Remainder" OpHelp("r[P3]=r[P2]%r[P1]"),
+ /* 94 */ "Concat" OpHelp("r[P3]=r[P2]+r[P1]"),
+ /* 95 */ "IsTrue" OpHelp("r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4"),
+ /* 96 */ "BitNot" OpHelp("r[P1]= ~r[P1]"),
+ /* 97 */ "Offset" OpHelp("r[P3] = sqlite_offset(P1)"),
+ /* 98 */ "Column" OpHelp("r[P3]=PX"),
+ /* 99 */ "String8" OpHelp("r[P2]='P4'"),
+ /* 100 */ "Affinity" OpHelp("affinity(r[P1@P2])"),
+ /* 101 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"),
+ /* 102 */ "Count" OpHelp("r[P2]=count()"),
+ /* 103 */ "ReadCookie" OpHelp(""),
+ /* 104 */ "SetCookie" OpHelp(""),
+ /* 105 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"),
+ /* 106 */ "OpenRead" OpHelp("root=P2 iDb=P3"),
+ /* 107 */ "OpenWrite" OpHelp("root=P2 iDb=P3"),
+ /* 108 */ "OpenDup" OpHelp(""),
+ /* 109 */ "OpenAutoindex" OpHelp("nColumn=P2"),
+ /* 110 */ "OpenEphemeral" OpHelp("nColumn=P2"),
+ /* 111 */ "SorterOpen" OpHelp(""),
+ /* 112 */ "SequenceTest" OpHelp("if( cursor[P1].ctr++ ) pc = P2"),
+ /* 113 */ "OpenPseudo" OpHelp("P3 columns in r[P2]"),
+ /* 114 */ "Close" OpHelp(""),
+ /* 115 */ "ColumnsUsed" OpHelp(""),
+ /* 116 */ "Sequence" OpHelp("r[P2]=cursor[P1].ctr++"),
+ /* 117 */ "NewRowid" OpHelp("r[P2]=rowid"),
+ /* 118 */ "Insert" OpHelp("intkey=r[P3] data=r[P2]"),
+ /* 119 */ "InsertInt" OpHelp("intkey=P3 data=r[P2]"),
+ /* 120 */ "Delete" OpHelp(""),
+ /* 121 */ "ResetCount" OpHelp(""),
+ /* 122 */ "SorterCompare" OpHelp("if key(P1)!=trim(r[P3],P4) goto P2"),
+ /* 123 */ "SorterData" OpHelp("r[P2]=data"),
+ /* 124 */ "RowData" OpHelp("r[P2]=data"),
+ /* 125 */ "Rowid" OpHelp("r[P2]=rowid"),
+ /* 126 */ "NullRow" OpHelp(""),
+ /* 127 */ "SeekEnd" OpHelp(""),
+ /* 128 */ "SorterInsert" OpHelp("key=r[P2]"),
+ /* 129 */ "IdxInsert" OpHelp("key=r[P2]"),
+ /* 130 */ "IdxDelete" OpHelp("key=r[P2@P3]"),
+ /* 131 */ "DeferredSeek" OpHelp("Move P3 to P1.rowid if needed"),
+ /* 132 */ "IdxRowid" OpHelp("r[P2]=rowid"),
+ /* 133 */ "Destroy" OpHelp(""),
+ /* 134 */ "Real" OpHelp("r[P2]=P4"),
+ /* 135 */ "Clear" OpHelp(""),
+ /* 136 */ "ResetSorter" OpHelp(""),
+ /* 137 */ "CreateBtree" OpHelp("r[P2]=root iDb=P1 flags=P3"),
+ /* 138 */ "SqlExec" OpHelp(""),
+ /* 139 */ "ParseSchema" OpHelp(""),
+ /* 140 */ "LoadAnalysis" OpHelp(""),
+ /* 141 */ "DropTable" OpHelp(""),
+ /* 142 */ "DropIndex" OpHelp(""),
+ /* 143 */ "DropTrigger" OpHelp(""),
+ /* 144 */ "IntegrityCk" OpHelp(""),
+ /* 145 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"),
+ /* 146 */ "Param" OpHelp(""),
+ /* 147 */ "FkCounter" OpHelp("fkctr[P1]+=P2"),
+ /* 148 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"),
+ /* 149 */ "OffsetLimit" OpHelp("if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"),
+ /* 150 */ "AggStep0" OpHelp("accum=r[P3] step(r[P2@P5])"),
+ /* 151 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"),
+ /* 152 */ "AggFinal" OpHelp("accum=r[P1] N=P2"),
+ /* 153 */ "Expire" OpHelp(""),
+ /* 154 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"),
+ /* 155 */ "VBegin" OpHelp(""),
+ /* 156 */ "VCreate" OpHelp(""),
+ /* 157 */ "VDestroy" OpHelp(""),
+ /* 158 */ "VOpen" OpHelp(""),
+ /* 159 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"),
+ /* 160 */ "VRename" OpHelp(""),
+ /* 161 */ "Pagecount" OpHelp(""),
+ /* 162 */ "MaxPgcnt" OpHelp(""),
+ /* 163 */ "PureFunc0" OpHelp(""),
+ /* 164 */ "Function0" OpHelp("r[P3]=func(r[P2@P5])"),
+ /* 165 */ "PureFunc" OpHelp(""),
+ /* 166 */ "Function" OpHelp("r[P3]=func(r[P2@P5])"),
+ /* 167 */ "Trace" OpHelp(""),
+ /* 168 */ "CursorHint" OpHelp(""),
+ /* 169 */ "Noop" OpHelp(""),
+ /* 170 */ "Explain" OpHelp(""),
+ /* 171 */ "Abortable" OpHelp(""),
};
return azName[i];
}
@@ -30401,6 +31691,9 @@ struct unixFile {
#if SQLITE_ENABLE_LOCKING_STYLE || defined(__APPLE__)
unsigned fsFlags; /* cached details from statfs() */
#endif
+#ifdef SQLITE_ENABLE_SETLK_TIMEOUT
+ unsigned iBusyTimeout; /* Wait this many millisec on locks */
+#endif
#if OS_VXWORKS
struct vxworksFileId *pId; /* Unique file ID */
#endif
@@ -30838,7 +32131,11 @@ static struct unix_syscall {
#endif
#define osFchown ((int(*)(int,uid_t,gid_t))aSyscall[20].pCurrent)
+#if defined(HAVE_FCHOWN)
{ "geteuid", (sqlite3_syscall_ptr)geteuid, 0 },
+#else
+ { "geteuid", (sqlite3_syscall_ptr)0, 0 },
+#endif
#define osGeteuid ((uid_t(*)(void))aSyscall[21].pCurrent)
#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0
@@ -30853,7 +32150,7 @@ static struct unix_syscall {
#else
{ "munmap", (sqlite3_syscall_ptr)0, 0 },
#endif
-#define osMunmap ((void*(*)(void*,size_t))aSyscall[23].pCurrent)
+#define osMunmap ((int(*)(void*,size_t))aSyscall[23].pCurrent)
#if HAVE_MREMAP && (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0)
{ "mremap", (sqlite3_syscall_ptr)mremap, 0 },
@@ -30883,7 +32180,11 @@ static struct unix_syscall {
#endif
#define osLstat ((int(*)(const char*,struct stat*))aSyscall[27].pCurrent)
+#if defined(__linux__) && defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE)
{ "ioctl", (sqlite3_syscall_ptr)ioctl, 0 },
+#else
+ { "ioctl", (sqlite3_syscall_ptr)0, 0 },
+#endif
#define osIoctl ((int(*)(int,int,...))aSyscall[28].pCurrent)
}; /* End of the overrideable system calls */
@@ -31062,15 +32363,16 @@ static int robust_open(const char *z, int f, mode_t m){
** assert( unixMutexHeld() );
** unixEnterLeave()
*/
+static sqlite3_mutex *unixBigLock = 0;
static void unixEnterMutex(void){
- sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1));
+ sqlite3_mutex_enter(unixBigLock);
}
static void unixLeaveMutex(void){
- sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1));
+ sqlite3_mutex_leave(unixBigLock);
}
#ifdef SQLITE_DEBUG
static int unixMutexHeld(void) {
- return sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1));
+ return sqlite3_mutex_held(unixBigLock);
}
#endif
@@ -31827,6 +33129,43 @@ static int unixCheckReservedLock(sqlite3_file *id, int *pResOut){
}
/*
+** Set a posix-advisory-lock.
+**
+** There are two versions of this routine. If compiled with
+** SQLITE_ENABLE_SETLK_TIMEOUT then the routine has an extra parameter
+** which is a pointer to a unixFile. If the unixFile->iBusyTimeout
+** value is set, then it is the number of milliseconds to wait before
+** failing the lock. The iBusyTimeout value is always reset back to
+** zero on each call.
+**
+** If SQLITE_ENABLE_SETLK_TIMEOUT is not defined, then do a non-blocking
+** attempt to set the lock.
+*/
+#ifndef SQLITE_ENABLE_SETLK_TIMEOUT
+# define osSetPosixAdvisoryLock(h,x,t) osFcntl(h,F_SETLK,x)
+#else
+static int osSetPosixAdvisoryLock(
+ int h, /* The file descriptor on which to take the lock */
+ struct flock *pLock, /* The description of the lock */
+ unixFile *pFile /* Structure holding timeout value */
+){
+ int rc = osFcntl(h,F_SETLK,pLock);
+ while( rc<0 && pFile->iBusyTimeout>0 ){
+ /* On systems that support some kind of blocking file lock with a timeout,
+ ** make appropriate changes here to invoke that blocking file lock. On
+ ** generic posix, however, there is no such API. So we simply try the
+ ** lock once every millisecond until either the timeout expires, or until
+ ** the lock is obtained. */
+ usleep(1000);
+ rc = osFcntl(h,F_SETLK,pLock);
+ pFile->iBusyTimeout--;
+ }
+ return rc;
+}
+#endif /* SQLITE_ENABLE_SETLK_TIMEOUT */
+
+
+/*
** Attempt to set a system-lock on the file pFile. The lock is
** described by pLock.
**
@@ -31858,7 +33197,7 @@ static int unixFileLock(unixFile *pFile, struct flock *pLock){
lock.l_start = SHARED_FIRST;
lock.l_len = SHARED_SIZE;
lock.l_type = F_WRLCK;
- rc = osFcntl(pFile->h, F_SETLK, &lock);
+ rc = osSetPosixAdvisoryLock(pFile->h, &lock, pFile);
if( rc<0 ) return rc;
pInode->bProcessLock = 1;
pInode->nLock++;
@@ -31866,7 +33205,7 @@ static int unixFileLock(unixFile *pFile, struct flock *pLock){
rc = 0;
}
}else{
- rc = osFcntl(pFile->h, F_SETLK, pLock);
+ rc = osSetPosixAdvisoryLock(pFile->h, pLock, pFile);
}
return rc;
}
@@ -34100,7 +35439,7 @@ static int fcntlSizeHint(unixFile *pFile, i64 nByte){
do{
err = osFallocate(pFile->h, buf.st_size, nSize-buf.st_size);
}while( err==EINTR );
- if( err ) return SQLITE_IOERR_WRITE;
+ if( err && err!=EINVAL ) return SQLITE_IOERR_WRITE;
#else
/* If the OS does not have posix_fallocate(), fake it. Write a
** single byte to the last byte in each block that falls entirely
@@ -34226,6 +35565,12 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){
*(int*)pArg = fileHasMoved(pFile);
return SQLITE_OK;
}
+#ifdef SQLITE_ENABLE_SETLK_TIMEOUT
+ case SQLITE_FCNTL_LOCK_TIMEOUT: {
+ pFile->iBusyTimeout = *(int*)pArg;
+ return SQLITE_OK;
+ }
+#endif
#if SQLITE_MAX_MMAP_SIZE>0
case SQLITE_FCNTL_MMAP_SIZE: {
i64 newLimit = *(i64*)pArg;
@@ -34316,7 +35661,7 @@ static void setDeviceCharacteristics(unixFile *pFile){
pFile->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE;
pFile->deviceCharacteristics = 0;
if( fstatvfs(pFile->h, &fsInfo) == -1 ) {
- return pFile->sectorSize;
+ return;
}
if( !strcmp(fsInfo.f_basetype, "tmp") ) {
@@ -34474,6 +35819,7 @@ struct unixShmNode {
int szRegion; /* Size of shared-memory regions */
u16 nRegion; /* Size of array apRegion */
u8 isReadonly; /* True if read-only */
+ u8 isUnlocked; /* True if no DMS lock held */
char **apRegion; /* Array of mapped shared-memory regions */
int nRef; /* Number of unixShm objects pointing to this */
unixShm *pFirst; /* All unixShm objects pointing to this */
@@ -34530,7 +35876,7 @@ static int unixShmSystemLock(
/* Access to the unixShmNode object is serialized by the caller */
pShmNode = pFile->pInode->pShmNode;
- assert( sqlite3_mutex_held(pShmNode->mutex) || pShmNode->nRef==0 );
+ assert( pShmNode->nRef==0 || sqlite3_mutex_held(pShmNode->mutex) );
/* Shared locks never span more than one byte */
assert( n==1 || lockType!=F_RDLCK );
@@ -34540,13 +35886,11 @@ static int unixShmSystemLock(
if( pShmNode->h>=0 ){
/* Initialize the locking parameters */
- memset(&f, 0, sizeof(f));
f.l_type = lockType;
f.l_whence = SEEK_SET;
f.l_start = ofst;
f.l_len = n;
-
- rc = osFcntl(pShmNode->h, F_SETLK, &f);
+ rc = osSetPosixAdvisoryLock(pShmNode->h, &f, pFile);
rc = (rc!=(-1)) ? SQLITE_OK : SQLITE_BUSY;
}
@@ -34637,6 +35981,64 @@ static void unixShmPurge(unixFile *pFd){
}
/*
+** The DMS lock has not yet been taken on shm file pShmNode. Attempt to
+** take it now. Return SQLITE_OK if successful, or an SQLite error
+** code otherwise.
+**
+** If the DMS cannot be locked because this is a readonly_shm=1
+** connection and no other process already holds a lock, return
+** SQLITE_READONLY_CANTINIT and set pShmNode->isUnlocked=1.
+*/
+static int unixLockSharedMemory(unixFile *pDbFd, unixShmNode *pShmNode){
+ struct flock lock;
+ int rc = SQLITE_OK;
+
+ /* Use F_GETLK to determine the locks other processes are holding
+ ** on the DMS byte. If it indicates that another process is holding
+ ** a SHARED lock, then this process may also take a SHARED lock
+ ** and proceed with opening the *-shm file.
+ **
+ ** Or, if no other process is holding any lock, then this process
+ ** is the first to open it. In this case take an EXCLUSIVE lock on the
+ ** DMS byte and truncate the *-shm file to zero bytes in size. Then
+ ** downgrade to a SHARED lock on the DMS byte.
+ **
+ ** If another process is holding an EXCLUSIVE lock on the DMS byte,
+ ** return SQLITE_BUSY to the caller (it will try again). An earlier
+ ** version of this code attempted the SHARED lock at this point. But
+ ** this introduced a subtle race condition: if the process holding
+ ** EXCLUSIVE failed just before truncating the *-shm file, then this
+ ** process might open and use the *-shm file without truncating it.
+ ** And if the *-shm file has been corrupted by a power failure or
+ ** system crash, the database itself may also become corrupt. */
+ lock.l_whence = SEEK_SET;
+ lock.l_start = UNIX_SHM_DMS;
+ lock.l_len = 1;
+ lock.l_type = F_WRLCK;
+ if( osFcntl(pShmNode->h, F_GETLK, &lock)!=0 ) {
+ rc = SQLITE_IOERR_LOCK;
+ }else if( lock.l_type==F_UNLCK ){
+ if( pShmNode->isReadonly ){
+ pShmNode->isUnlocked = 1;
+ rc = SQLITE_READONLY_CANTINIT;
+ }else{
+ rc = unixShmSystemLock(pDbFd, F_WRLCK, UNIX_SHM_DMS, 1);
+ if( rc==SQLITE_OK && robust_ftruncate(pShmNode->h, 0) ){
+ rc = unixLogError(SQLITE_IOERR_SHMOPEN,"ftruncate",pShmNode->zFilename);
+ }
+ }
+ }else if( lock.l_type==F_WRLCK ){
+ rc = SQLITE_BUSY;
+ }
+
+ if( rc==SQLITE_OK ){
+ assert( lock.l_type==F_UNLCK || lock.l_type==F_RDLCK );
+ rc = unixShmSystemLock(pDbFd, F_RDLCK, UNIX_SHM_DMS, 1);
+ }
+ return rc;
+}
+
+/*
** Open a shared-memory area associated with open database file pDbFd.
** This particular implementation uses mmapped files.
**
@@ -34674,9 +36076,9 @@ static void unixShmPurge(unixFile *pFd){
static int unixOpenSharedMemory(unixFile *pDbFd){
struct unixShm *p = 0; /* The connection to be opened */
struct unixShmNode *pShmNode; /* The underlying mmapped file */
- int rc; /* Result code */
+ int rc = SQLITE_OK; /* Result code */
unixInodeInfo *pInode; /* The inode of fd */
- char *zShmFilename; /* Name of the file used for SHM */
+ char *zShm; /* Name of the file used for SHM */
int nShmFilename; /* Size of the SHM filename in bytes */
/* Allocate space for the new unixShm object. */
@@ -34717,14 +36119,14 @@ static int unixOpenSharedMemory(unixFile *pDbFd){
goto shm_open_err;
}
memset(pShmNode, 0, sizeof(*pShmNode)+nShmFilename);
- zShmFilename = pShmNode->zFilename = (char*)&pShmNode[1];
+ zShm = pShmNode->zFilename = (char*)&pShmNode[1];
#ifdef SQLITE_SHM_DIRECTORY
- sqlite3_snprintf(nShmFilename, zShmFilename,
+ sqlite3_snprintf(nShmFilename, zShm,
SQLITE_SHM_DIRECTORY "/sqlite-shm-%x-%x",
(u32)sStat.st_ino, (u32)sStat.st_dev);
#else
- sqlite3_snprintf(nShmFilename, zShmFilename, "%s-shm", zBasePath);
- sqlite3FileSuffix3(pDbFd->zPath, zShmFilename);
+ sqlite3_snprintf(nShmFilename, zShm, "%s-shm", zBasePath);
+ sqlite3FileSuffix3(pDbFd->zPath, zShm);
#endif
pShmNode->h = -1;
pDbFd->pInode->pShmNode = pShmNode;
@@ -34738,15 +36140,16 @@ static int unixOpenSharedMemory(unixFile *pDbFd){
}
if( pInode->bProcessLock==0 ){
- int openFlags = O_RDWR | O_CREAT;
- if( sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){
- openFlags = O_RDONLY;
- pShmNode->isReadonly = 1;
+ if( 0==sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){
+ pShmNode->h = robust_open(zShm, O_RDWR|O_CREAT, (sStat.st_mode&0777));
}
- pShmNode->h = robust_open(zShmFilename, openFlags, (sStat.st_mode&0777));
if( pShmNode->h<0 ){
- rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zShmFilename);
- goto shm_open_err;
+ pShmNode->h = robust_open(zShm, O_RDONLY, (sStat.st_mode&0777));
+ if( pShmNode->h<0 ){
+ rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zShm);
+ goto shm_open_err;
+ }
+ pShmNode->isReadonly = 1;
}
/* If this process is running as root, make sure that the SHM file
@@ -34754,20 +36157,9 @@ static int unixOpenSharedMemory(unixFile *pDbFd){
** the original owner will not be able to connect.
*/
robustFchown(pShmNode->h, sStat.st_uid, sStat.st_gid);
-
- /* Check to see if another process is holding the dead-man switch.
- ** If not, truncate the file to zero length.
- */
- rc = SQLITE_OK;
- if( unixShmSystemLock(pDbFd, F_WRLCK, UNIX_SHM_DMS, 1)==SQLITE_OK ){
- if( robust_ftruncate(pShmNode->h, 0) ){
- rc = unixLogError(SQLITE_IOERR_SHMOPEN, "ftruncate", zShmFilename);
- }
- }
- if( rc==SQLITE_OK ){
- rc = unixShmSystemLock(pDbFd, F_RDLCK, UNIX_SHM_DMS, 1);
- }
- if( rc ) goto shm_open_err;
+
+ rc = unixLockSharedMemory(pDbFd, pShmNode);
+ if( rc!=SQLITE_OK && rc!=SQLITE_READONLY_CANTINIT ) goto shm_open_err;
}
}
@@ -34791,7 +36183,7 @@ static int unixOpenSharedMemory(unixFile *pDbFd){
p->pNext = pShmNode->pFirst;
pShmNode->pFirst = p;
sqlite3_mutex_leave(pShmNode->mutex);
- return SQLITE_OK;
+ return rc;
/* Jump here on any error */
shm_open_err:
@@ -34843,6 +36235,11 @@ static int unixShmMap(
p = pDbFd->pShm;
pShmNode = p->pShmNode;
sqlite3_mutex_enter(pShmNode->mutex);
+ if( pShmNode->isUnlocked ){
+ rc = unixLockSharedMemory(pDbFd, pShmNode);
+ if( rc!=SQLITE_OK ) goto shmpage_out;
+ pShmNode->isUnlocked = 0;
+ }
assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 );
assert( pShmNode->pInode==pDbFd->pInode );
assert( pShmNode->h>=0 || pDbFd->pInode->bProcessLock==1 );
@@ -36111,7 +37508,7 @@ static int unixOpen(
** a file-descriptor on the directory too. The first time unixSync()
** is called the directory file descriptor will be fsync()ed and close()d.
*/
- int syncDir = (isCreate && (
+ int isNewJrnl = (isCreate && (
eType==SQLITE_OPEN_MASTER_JOURNAL
|| eType==SQLITE_OPEN_MAIN_JOURNAL
|| eType==SQLITE_OPEN_WAL
@@ -36158,7 +37555,6 @@ static int unixOpen(
randomnessPid = osGetpid(0);
sqlite3_randomness(0,0);
}
-
memset(p, 0, sizeof(unixFile));
if( eType==SQLITE_OPEN_MAIN_DB ){
@@ -36181,7 +37577,7 @@ static int unixOpen(
}else if( !zName ){
/* If zName is NULL, the upper layer is requesting a temp file. */
- assert(isDelete && !syncDir);
+ assert(isDelete && !isNewJrnl);
rc = unixGetTempname(pVfs->mxPathname, zTmpname);
if( rc!=SQLITE_OK ){
return rc;
@@ -36216,17 +37612,24 @@ static int unixOpen(
fd = robust_open(zName, openFlags, openMode);
OSTRACE(("OPENX %-3d %s 0%o\n", fd, zName, openFlags));
assert( !isExclusive || (openFlags & O_CREAT)!=0 );
- if( fd<0 && errno!=EISDIR && isReadWrite ){
- /* Failed to open the file for read/write access. Try read-only. */
- flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE);
- openFlags &= ~(O_RDWR|O_CREAT);
- flags |= SQLITE_OPEN_READONLY;
- openFlags |= O_RDONLY;
- isReadonly = 1;
- fd = robust_open(zName, openFlags, openMode);
+ if( fd<0 ){
+ if( isNewJrnl && errno==EACCES && osAccess(zName, F_OK) ){
+ /* If unable to create a journal because the directory is not
+ ** writable, change the error code to indicate that. */
+ rc = SQLITE_READONLY_DIRECTORY;
+ }else if( errno!=EISDIR && isReadWrite ){
+ /* Failed to open the file for read/write access. Try read-only. */
+ flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE);
+ openFlags &= ~(O_RDWR|O_CREAT);
+ flags |= SQLITE_OPEN_READONLY;
+ openFlags |= O_RDONLY;
+ isReadonly = 1;
+ fd = robust_open(zName, openFlags, openMode);
+ }
}
if( fd<0 ){
- rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zName);
+ int rc2 = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zName);
+ if( rc==SQLITE_OK ) rc = rc2;
goto open_finished;
}
@@ -36286,7 +37689,7 @@ static int unixOpen(
if( isReadonly ) ctrlFlags |= UNIXFILE_RDONLY;
noLock = eType!=SQLITE_OPEN_MAIN_DB;
if( noLock ) ctrlFlags |= UNIXFILE_NOLOCK;
- if( syncDir ) ctrlFlags |= UNIXFILE_DIRSYNC;
+ if( isNewJrnl ) ctrlFlags |= UNIXFILE_DIRSYNC;
if( flags & SQLITE_OPEN_URI ) ctrlFlags |= UNIXFILE_URI;
#if SQLITE_ENABLE_LOCKING_STYLE
@@ -38026,6 +39429,7 @@ SQLITE_API int sqlite3_os_init(void){
for(i=0; i<(sizeof(aVfs)/sizeof(sqlite3_vfs)); i++){
sqlite3_vfs_register(&aVfs[i], i==0);
}
+ unixBigLock = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1);
return SQLITE_OK;
}
@@ -38037,6 +39441,7 @@ SQLITE_API int sqlite3_os_init(void){
** This routine is a no-op for unix.
*/
SQLITE_API int sqlite3_os_end(void){
+ unixBigLock = 0;
return SQLITE_OK;
}
@@ -38560,22 +39965,6 @@ struct winVfsAppData {
#endif
/*
- * The value used with sqlite3_win32_set_directory() to specify that
- * the data directory should be changed.
- */
-#ifndef SQLITE_WIN32_DATA_DIRECTORY_TYPE
-# define SQLITE_WIN32_DATA_DIRECTORY_TYPE (1)
-#endif
-
-/*
- * The value used with sqlite3_win32_set_directory() to specify that
- * the temporary directory should be changed.
- */
-#ifndef SQLITE_WIN32_TEMP_DIRECTORY_TYPE
-# define SQLITE_WIN32_TEMP_DIRECTORY_TYPE (2)
-#endif
-
-/*
* If compiled with SQLITE_WIN32_MALLOC on Windows, we will use the
* various Win32 API heap functions instead of our own.
*/
@@ -40171,13 +41560,13 @@ SQLITE_API char *sqlite3_win32_utf8_to_mbcs_v2(const char *zText, int useAnsi){
}
/*
-** This function sets the data directory or the temporary directory based on
-** the provided arguments. The type argument must be 1 in order to set the
-** data directory or 2 in order to set the temporary directory. The zValue
-** argument is the name of the directory to use. The return value will be
-** SQLITE_OK if successful.
+** This function is the same as sqlite3_win32_set_directory (below); however,
+** it accepts a UTF-8 string.
*/
-SQLITE_API int sqlite3_win32_set_directory(DWORD type, LPCWSTR zValue){
+SQLITE_API int sqlite3_win32_set_directory8(
+ unsigned long type, /* Identifier for directory being set or reset */
+ const char *zValue /* New value for directory being set or reset */
+){
char **ppDirectory = 0;
#ifndef SQLITE_OMIT_AUTOINIT
int rc = sqlite3_initialize();
@@ -40193,21 +41582,54 @@ SQLITE_API int sqlite3_win32_set_directory(DWORD type, LPCWSTR zValue){
);
assert( !ppDirectory || sqlite3MemdebugHasType(*ppDirectory, MEMTYPE_HEAP) );
if( ppDirectory ){
- char *zValueUtf8 = 0;
+ char *zCopy = 0;
if( zValue && zValue[0] ){
- zValueUtf8 = winUnicodeToUtf8(zValue);
- if ( zValueUtf8==0 ){
+ zCopy = sqlite3_mprintf("%s", zValue);
+ if ( zCopy==0 ){
return SQLITE_NOMEM_BKPT;
}
}
sqlite3_free(*ppDirectory);
- *ppDirectory = zValueUtf8;
+ *ppDirectory = zCopy;
return SQLITE_OK;
}
return SQLITE_ERROR;
}
/*
+** This function is the same as sqlite3_win32_set_directory (below); however,
+** it accepts a UTF-16 string.
+*/
+SQLITE_API int sqlite3_win32_set_directory16(
+ unsigned long type, /* Identifier for directory being set or reset */
+ const void *zValue /* New value for directory being set or reset */
+){
+ int rc;
+ char *zUtf8 = 0;
+ if( zValue ){
+ zUtf8 = sqlite3_win32_unicode_to_utf8(zValue);
+ if( zUtf8==0 ) return SQLITE_NOMEM_BKPT;
+ }
+ rc = sqlite3_win32_set_directory8(type, zUtf8);
+ if( zUtf8 ) sqlite3_free(zUtf8);
+ return rc;
+}
+
+/*
+** This function sets the data directory or the temporary directory based on
+** the provided arguments. The type argument must be 1 in order to set the
+** data directory or 2 in order to set the temporary directory. The zValue
+** argument is the name of the directory to use. The return value will be
+** SQLITE_OK if successful.
+*/
+SQLITE_API int sqlite3_win32_set_directory(
+ unsigned long type, /* Identifier for directory being set or reset */
+ void *zValue /* New value for directory being set or reset */
+){
+ return sqlite3_win32_set_directory16(type, zValue);
+}
+
+/*
** The return value of winGetLastErrorMsg
** is zero if the error message fits in the buffer, or non-zero
** otherwise (if the message was truncated).
@@ -41875,15 +43297,16 @@ static SYSTEM_INFO winSysInfo;
** assert( winShmMutexHeld() );
** winShmLeaveMutex()
*/
+static sqlite3_mutex *winBigLock = 0;
static void winShmEnterMutex(void){
- sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1));
+ sqlite3_mutex_enter(winBigLock);
}
static void winShmLeaveMutex(void){
- sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1));
+ sqlite3_mutex_leave(winBigLock);
}
#ifndef NDEBUG
static int winShmMutexHeld(void) {
- return sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1));
+ return sqlite3_mutex_held(winBigLock);
}
#endif
@@ -41917,6 +43340,9 @@ struct winShmNode {
int szRegion; /* Size of shared-memory regions */
int nRegion; /* Size of array apRegion */
+ u8 isReadonly; /* True if read-only */
+ u8 isUnlocked; /* True if no DMS lock held */
+
struct ShmRegion {
HANDLE hMap; /* File handle from CreateFileMapping */
void *pMap;
@@ -41983,7 +43409,7 @@ static int winShmSystemLock(
int rc = 0; /* Result code form Lock/UnlockFileEx() */
/* Access to the winShmNode object is serialized by the caller */
- assert( sqlite3_mutex_held(pFile->mutex) || pFile->nRef==0 );
+ assert( pFile->nRef==0 || sqlite3_mutex_held(pFile->mutex) );
OSTRACE(("SHM-LOCK file=%p, lock=%d, offset=%d, size=%d\n",
pFile->hFile.h, lockType, ofst, nByte));
@@ -42065,6 +43491,37 @@ static void winShmPurge(sqlite3_vfs *pVfs, int deleteFlag){
}
/*
+** The DMS lock has not yet been taken on shm file pShmNode. Attempt to
+** take it now. Return SQLITE_OK if successful, or an SQLite error
+** code otherwise.
+**
+** If the DMS cannot be locked because this is a readonly_shm=1
+** connection and no other process already holds a lock, return
+** SQLITE_READONLY_CANTINIT and set pShmNode->isUnlocked=1.
+*/
+static int winLockSharedMemory(winShmNode *pShmNode){
+ int rc = winShmSystemLock(pShmNode, WINSHM_WRLCK, WIN_SHM_DMS, 1);
+
+ if( rc==SQLITE_OK ){
+ if( pShmNode->isReadonly ){
+ pShmNode->isUnlocked = 1;
+ winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1);
+ return SQLITE_READONLY_CANTINIT;
+ }else if( winTruncate((sqlite3_file*)&pShmNode->hFile, 0) ){
+ winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1);
+ return winLogError(SQLITE_IOERR_SHMOPEN, osGetLastError(),
+ "winLockSharedMemory", pShmNode->zFilename);
+ }
+ }
+
+ if( rc==SQLITE_OK ){
+ winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1);
+ }
+
+ return winShmSystemLock(pShmNode, WINSHM_RDLCK, WIN_SHM_DMS, 1);
+}
+
+/*
** Open the shared-memory area associated with database file pDbFd.
**
** When opening a new shared-memory file, if no other instances of that
@@ -42073,9 +43530,9 @@ static void winShmPurge(sqlite3_vfs *pVfs, int deleteFlag){
*/
static int winOpenSharedMemory(winFile *pDbFd){
struct winShm *p; /* The connection to be opened */
- struct winShmNode *pShmNode = 0; /* The underlying mmapped file */
- int rc; /* Result code */
- struct winShmNode *pNew; /* Newly allocated winShmNode */
+ winShmNode *pShmNode = 0; /* The underlying mmapped file */
+ int rc = SQLITE_OK; /* Result code */
+ winShmNode *pNew; /* Newly allocated winShmNode */
int nName; /* Size of zName in bytes */
assert( pDbFd->pShm==0 ); /* Not previously opened */
@@ -42108,6 +43565,9 @@ static int winOpenSharedMemory(winFile *pDbFd){
if( pShmNode ){
sqlite3_free(pNew);
}else{
+ int inFlags = SQLITE_OPEN_WAL;
+ int outFlags = 0;
+
pShmNode = pNew;
pNew = 0;
((winFile*)(&pShmNode->hFile))->h = INVALID_HANDLE_VALUE;
@@ -42122,30 +43582,23 @@ static int winOpenSharedMemory(winFile *pDbFd){
}
}
- rc = winOpen(pDbFd->pVfs,
- pShmNode->zFilename, /* Name of the file (UTF-8) */
- (sqlite3_file*)&pShmNode->hFile, /* File handle here */
- SQLITE_OPEN_WAL | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
- 0);
- if( SQLITE_OK!=rc ){
+ if( 0==sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){
+ inFlags |= SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;
+ }else{
+ inFlags |= SQLITE_OPEN_READONLY;
+ }
+ rc = winOpen(pDbFd->pVfs, pShmNode->zFilename,
+ (sqlite3_file*)&pShmNode->hFile,
+ inFlags, &outFlags);
+ if( rc!=SQLITE_OK ){
+ rc = winLogError(rc, osGetLastError(), "winOpenShm",
+ pShmNode->zFilename);
goto shm_open_err;
}
+ if( outFlags==SQLITE_OPEN_READONLY ) pShmNode->isReadonly = 1;
- /* Check to see if another process is holding the dead-man switch.
- ** If not, truncate the file to zero length.
- */
- if( winShmSystemLock(pShmNode, WINSHM_WRLCK, WIN_SHM_DMS, 1)==SQLITE_OK ){
- rc = winTruncate((sqlite3_file *)&pShmNode->hFile, 0);
- if( rc!=SQLITE_OK ){
- rc = winLogError(SQLITE_IOERR_SHMOPEN, osGetLastError(),
- "winOpenShm", pDbFd->zPath);
- }
- }
- if( rc==SQLITE_OK ){
- winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1);
- rc = winShmSystemLock(pShmNode, WINSHM_RDLCK, WIN_SHM_DMS, 1);
- }
- if( rc ) goto shm_open_err;
+ rc = winLockSharedMemory(pShmNode);
+ if( rc!=SQLITE_OK && rc!=SQLITE_READONLY_CANTINIT ) goto shm_open_err;
}
/* Make the new connection a child of the winShmNode */
@@ -42168,7 +43621,7 @@ static int winOpenSharedMemory(winFile *pDbFd){
p->pNext = pShmNode->pFirst;
pShmNode->pFirst = p;
sqlite3_mutex_leave(pShmNode->mutex);
- return SQLITE_OK;
+ return rc;
/* Jump here on any error */
shm_open_err:
@@ -42372,6 +43825,8 @@ static int winShmMap(
winFile *pDbFd = (winFile*)fd;
winShm *pShm = pDbFd->pShm;
winShmNode *pShmNode;
+ DWORD protect = PAGE_READWRITE;
+ DWORD flags = FILE_MAP_WRITE | FILE_MAP_READ;
int rc = SQLITE_OK;
if( !pShm ){
@@ -42382,6 +43837,11 @@ static int winShmMap(
pShmNode = pShm->pShmNode;
sqlite3_mutex_enter(pShmNode->mutex);
+ if( pShmNode->isUnlocked ){
+ rc = winLockSharedMemory(pShmNode);
+ if( rc!=SQLITE_OK ) goto shmpage_out;
+ pShmNode->isUnlocked = 0;
+ }
assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 );
if( pShmNode->nRegion<=iRegion ){
@@ -42428,21 +43888,26 @@ static int winShmMap(
}
pShmNode->aRegion = apNew;
+ if( pShmNode->isReadonly ){
+ protect = PAGE_READONLY;
+ flags = FILE_MAP_READ;
+ }
+
while( pShmNode->nRegion<=iRegion ){
HANDLE hMap = NULL; /* file-mapping handle */
void *pMap = 0; /* Mapped memory region */
#if SQLITE_OS_WINRT
hMap = osCreateFileMappingFromApp(pShmNode->hFile.h,
- NULL, PAGE_READWRITE, nByte, NULL
+ NULL, protect, nByte, NULL
);
#elif defined(SQLITE_WIN32_HAS_WIDE)
hMap = osCreateFileMappingW(pShmNode->hFile.h,
- NULL, PAGE_READWRITE, 0, nByte, NULL
+ NULL, protect, 0, nByte, NULL
);
#elif defined(SQLITE_WIN32_HAS_ANSI) && SQLITE_WIN32_CREATEFILEMAPPINGA
hMap = osCreateFileMappingA(pShmNode->hFile.h,
- NULL, PAGE_READWRITE, 0, nByte, NULL
+ NULL, protect, 0, nByte, NULL
);
#endif
OSTRACE(("SHM-MAP-CREATE pid=%lu, region=%d, size=%d, rc=%s\n",
@@ -42452,11 +43917,11 @@ static int winShmMap(
int iOffset = pShmNode->nRegion*szRegion;
int iOffsetShift = iOffset % winSysInfo.dwAllocationGranularity;
#if SQLITE_OS_WINRT
- pMap = osMapViewOfFileFromApp(hMap, FILE_MAP_WRITE | FILE_MAP_READ,
+ pMap = osMapViewOfFileFromApp(hMap, flags,
iOffset - iOffsetShift, szRegion + iOffsetShift
);
#else
- pMap = osMapViewOfFile(hMap, FILE_MAP_WRITE | FILE_MAP_READ,
+ pMap = osMapViewOfFile(hMap, flags,
0, iOffset - iOffsetShift, szRegion + iOffsetShift
);
#endif
@@ -42487,6 +43952,7 @@ shmpage_out:
}else{
*pp = 0;
}
+ if( pShmNode->isReadonly && rc==SQLITE_OK ) rc = SQLITE_READONLY;
sqlite3_mutex_leave(pShmNode->mutex);
return rc;
}
@@ -43315,8 +44781,10 @@ static int winOpen(
&extendedParameters);
if( h!=INVALID_HANDLE_VALUE ) break;
if( isReadWrite ){
- int isRO = 0;
- int rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
+ int rc2, isRO = 0;
+ sqlite3BeginBenignMalloc();
+ rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
+ sqlite3EndBenignMalloc();
if( rc2==SQLITE_OK && isRO ) break;
}
}while( winRetryIoerr(&cnt, &lastErrno) );
@@ -43330,8 +44798,10 @@ static int winOpen(
NULL);
if( h!=INVALID_HANDLE_VALUE ) break;
if( isReadWrite ){
- int isRO = 0;
- int rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
+ int rc2, isRO = 0;
+ sqlite3BeginBenignMalloc();
+ rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
+ sqlite3EndBenignMalloc();
if( rc2==SQLITE_OK && isRO ) break;
}
}while( winRetryIoerr(&cnt, &lastErrno) );
@@ -43348,8 +44818,10 @@ static int winOpen(
NULL);
if( h!=INVALID_HANDLE_VALUE ) break;
if( isReadWrite ){
- int isRO = 0;
- int rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
+ int rc2, isRO = 0;
+ sqlite3BeginBenignMalloc();
+ rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
+ sqlite3EndBenignMalloc();
if( rc2==SQLITE_OK && isRO ) break;
}
}while( winRetryIoerr(&cnt, &lastErrno) );
@@ -44257,6 +45729,10 @@ SQLITE_API int sqlite3_os_init(void){
sqlite3_vfs_register(&winLongPathNolockVfs, 0);
#endif
+#ifndef SQLITE_OMIT_WAL
+ winBigLock = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1);
+#endif
+
return SQLITE_OK;
}
@@ -44267,12 +45743,609 @@ SQLITE_API int sqlite3_os_end(void){
sleepObj = NULL;
}
#endif
+
+#ifndef SQLITE_OMIT_WAL
+ winBigLock = 0;
+#endif
+
return SQLITE_OK;
}
#endif /* SQLITE_OS_WIN */
/************** End of os_win.c **********************************************/
+/************** Begin file memdb.c *******************************************/
+/*
+** 2016-09-07
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+******************************************************************************
+**
+** This file implements an in-memory VFS. A database is held as a contiguous
+** block of memory.
+**
+** This file also implements interface sqlite3_serialize() and
+** sqlite3_deserialize().
+*/
+#ifdef SQLITE_ENABLE_DESERIALIZE
+/* #include "sqliteInt.h" */
+
+/*
+** Forward declaration of objects used by this utility
+*/
+typedef struct sqlite3_vfs MemVfs;
+typedef struct MemFile MemFile;
+
+/* Access to a lower-level VFS that (might) implement dynamic loading,
+** access to randomness, etc.
+*/
+#define ORIGVFS(p) ((sqlite3_vfs*)((p)->pAppData))
+
+/* An open file */
+struct MemFile {
+ sqlite3_file base; /* IO methods */
+ sqlite3_int64 sz; /* Size of the file */
+ sqlite3_int64 szMax; /* Space allocated to aData */
+ unsigned char *aData; /* content of the file */
+ int nMmap; /* Number of memory mapped pages */
+ unsigned mFlags; /* Flags */
+ int eLock; /* Most recent lock against this file */
+};
+
+/*
+** Methods for MemFile
+*/
+static int memdbClose(sqlite3_file*);
+static int memdbRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
+static int memdbWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst);
+static int memdbTruncate(sqlite3_file*, sqlite3_int64 size);
+static int memdbSync(sqlite3_file*, int flags);
+static int memdbFileSize(sqlite3_file*, sqlite3_int64 *pSize);
+static int memdbLock(sqlite3_file*, int);
+/* static int memdbCheckReservedLock(sqlite3_file*, int *pResOut);// not used */
+static int memdbFileControl(sqlite3_file*, int op, void *pArg);
+/* static int memdbSectorSize(sqlite3_file*); // not used */
+static int memdbDeviceCharacteristics(sqlite3_file*);
+static int memdbFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp);
+static int memdbUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p);
+
+/*
+** Methods for MemVfs
+*/
+static int memdbOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *);
+/* static int memdbDelete(sqlite3_vfs*, const char *zName, int syncDir); */
+static int memdbAccess(sqlite3_vfs*, const char *zName, int flags, int *);
+static int memdbFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut);
+static void *memdbDlOpen(sqlite3_vfs*, const char *zFilename);
+static void memdbDlError(sqlite3_vfs*, int nByte, char *zErrMsg);
+static void (*memdbDlSym(sqlite3_vfs *pVfs, void *p, const char*zSym))(void);
+static void memdbDlClose(sqlite3_vfs*, void*);
+static int memdbRandomness(sqlite3_vfs*, int nByte, char *zOut);
+static int memdbSleep(sqlite3_vfs*, int microseconds);
+/* static int memdbCurrentTime(sqlite3_vfs*, double*); */
+static int memdbGetLastError(sqlite3_vfs*, int, char *);
+static int memdbCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*);
+
+static sqlite3_vfs memdb_vfs = {
+ 2, /* iVersion */
+ 0, /* szOsFile (set when registered) */
+ 1024, /* mxPathname */
+ 0, /* pNext */
+ "memdb", /* zName */
+ 0, /* pAppData (set when registered) */
+ memdbOpen, /* xOpen */
+ 0, /* memdbDelete, */ /* xDelete */
+ memdbAccess, /* xAccess */
+ memdbFullPathname, /* xFullPathname */
+ memdbDlOpen, /* xDlOpen */
+ memdbDlError, /* xDlError */
+ memdbDlSym, /* xDlSym */
+ memdbDlClose, /* xDlClose */
+ memdbRandomness, /* xRandomness */
+ memdbSleep, /* xSleep */
+ 0, /* memdbCurrentTime, */ /* xCurrentTime */
+ memdbGetLastError, /* xGetLastError */
+ memdbCurrentTimeInt64 /* xCurrentTimeInt64 */
+};
+
+static const sqlite3_io_methods memdb_io_methods = {
+ 3, /* iVersion */
+ memdbClose, /* xClose */
+ memdbRead, /* xRead */
+ memdbWrite, /* xWrite */
+ memdbTruncate, /* xTruncate */
+ memdbSync, /* xSync */
+ memdbFileSize, /* xFileSize */
+ memdbLock, /* xLock */
+ memdbLock, /* xUnlock - same as xLock in this case */
+ 0, /* memdbCheckReservedLock, */ /* xCheckReservedLock */
+ memdbFileControl, /* xFileControl */
+ 0, /* memdbSectorSize,*/ /* xSectorSize */
+ memdbDeviceCharacteristics, /* xDeviceCharacteristics */
+ 0, /* xShmMap */
+ 0, /* xShmLock */
+ 0, /* xShmBarrier */
+ 0, /* xShmUnmap */
+ memdbFetch, /* xFetch */
+ memdbUnfetch /* xUnfetch */
+};
+
+
+
+/*
+** Close an memdb-file.
+**
+** The pData pointer is owned by the application, so there is nothing
+** to free.
+*/
+static int memdbClose(sqlite3_file *pFile){
+ MemFile *p = (MemFile *)pFile;
+ if( p->mFlags & SQLITE_DESERIALIZE_FREEONCLOSE ) sqlite3_free(p->aData);
+ return SQLITE_OK;
+}
+
+/*
+** Read data from an memdb-file.
+*/
+static int memdbRead(
+ sqlite3_file *pFile,
+ void *zBuf,
+ int iAmt,
+ sqlite_int64 iOfst
+){
+ MemFile *p = (MemFile *)pFile;
+ if( iOfst+iAmt>p->sz ){
+ memset(zBuf, 0, iAmt);
+ if( iOfst<p->sz ) memcpy(zBuf, p->aData+iOfst, p->sz - iOfst);
+ return SQLITE_IOERR_SHORT_READ;
+ }
+ memcpy(zBuf, p->aData+iOfst, iAmt);
+ return SQLITE_OK;
+}
+
+/*
+** Try to enlarge the memory allocation to hold at least sz bytes
+*/
+static int memdbEnlarge(MemFile *p, sqlite3_int64 newSz){
+ unsigned char *pNew;
+ if( (p->mFlags & SQLITE_DESERIALIZE_RESIZEABLE)==0 || p->nMmap>0 ){
+ return SQLITE_FULL;
+ }
+ pNew = sqlite3_realloc64(p->aData, newSz);
+ if( pNew==0 ) return SQLITE_NOMEM;
+ p->aData = pNew;
+ p->szMax = newSz;
+ return SQLITE_OK;
+}
+
+/*
+** Write data to an memdb-file.
+*/
+static int memdbWrite(
+ sqlite3_file *pFile,
+ const void *z,
+ int iAmt,
+ sqlite_int64 iOfst
+){
+ MemFile *p = (MemFile *)pFile;
+ if( iOfst+iAmt>p->sz ){
+ int rc;
+ if( iOfst+iAmt>p->szMax
+ && (rc = memdbEnlarge(p, (iOfst+iAmt)*2))!=SQLITE_OK
+ ){
+ return rc;
+ }
+ if( iOfst>p->sz ) memset(p->aData+p->sz, 0, iOfst-p->sz);
+ p->sz = iOfst+iAmt;
+ }
+ memcpy(p->aData+iOfst, z, iAmt);
+ return SQLITE_OK;
+}
+
+/*
+** Truncate an memdb-file.
+**
+** In rollback mode (which is always the case for memdb, as it does not
+** support WAL mode) the truncate() method is only used to reduce
+** the size of a file, never to increase the size.
+*/
+static int memdbTruncate(sqlite3_file *pFile, sqlite_int64 size){
+ MemFile *p = (MemFile *)pFile;
+ if( NEVER(size>p->sz) ) return SQLITE_FULL;
+ p->sz = size;
+ return SQLITE_OK;
+}
+
+/*
+** Sync an memdb-file.
+*/
+static int memdbSync(sqlite3_file *pFile, int flags){
+ return SQLITE_OK;
+}
+
+/*
+** Return the current file-size of an memdb-file.
+*/
+static int memdbFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){
+ MemFile *p = (MemFile *)pFile;
+ *pSize = p->sz;
+ return SQLITE_OK;
+}
+
+/*
+** Lock an memdb-file.
+*/
+static int memdbLock(sqlite3_file *pFile, int eLock){
+ MemFile *p = (MemFile *)pFile;
+ p->eLock = eLock;
+ return SQLITE_OK;
+}
+
+#if 0 /* Never used because memdbAccess() always returns false */
+/*
+** Check if another file-handle holds a RESERVED lock on an memdb-file.
+*/
+static int memdbCheckReservedLock(sqlite3_file *pFile, int *pResOut){
+ *pResOut = 0;
+ return SQLITE_OK;
+}
+#endif
+
+/*
+** File control method. For custom operations on an memdb-file.
+*/
+static int memdbFileControl(sqlite3_file *pFile, int op, void *pArg){
+ MemFile *p = (MemFile *)pFile;
+ int rc = SQLITE_NOTFOUND;
+ if( op==SQLITE_FCNTL_VFSNAME ){
+ *(char**)pArg = sqlite3_mprintf("memdb(%p,%lld)", p->aData, p->sz);
+ rc = SQLITE_OK;
+ }
+ return rc;
+}
+
+#if 0 /* Not used because of SQLITE_IOCAP_POWERSAFE_OVERWRITE */
+/*
+** Return the sector-size in bytes for an memdb-file.
+*/
+static int memdbSectorSize(sqlite3_file *pFile){
+ return 1024;
+}
+#endif
+
+/*
+** Return the device characteristic flags supported by an memdb-file.
+*/
+static int memdbDeviceCharacteristics(sqlite3_file *pFile){
+ return SQLITE_IOCAP_ATOMIC |
+ SQLITE_IOCAP_POWERSAFE_OVERWRITE |
+ SQLITE_IOCAP_SAFE_APPEND |
+ SQLITE_IOCAP_SEQUENTIAL;
+}
+
+/* Fetch a page of a memory-mapped file */
+static int memdbFetch(
+ sqlite3_file *pFile,
+ sqlite3_int64 iOfst,
+ int iAmt,
+ void **pp
+){
+ MemFile *p = (MemFile *)pFile;
+ p->nMmap++;
+ *pp = (void*)(p->aData + iOfst);
+ return SQLITE_OK;
+}
+
+/* Release a memory-mapped page */
+static int memdbUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){
+ MemFile *p = (MemFile *)pFile;
+ p->nMmap--;
+ return SQLITE_OK;
+}
+
+/*
+** Open an mem file handle.
+*/
+static int memdbOpen(
+ sqlite3_vfs *pVfs,
+ const char *zName,
+ sqlite3_file *pFile,
+ int flags,
+ int *pOutFlags
+){
+ MemFile *p = (MemFile*)pFile;
+ if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){
+ return ORIGVFS(pVfs)->xOpen(ORIGVFS(pVfs), zName, pFile, flags, pOutFlags);
+ }
+ memset(p, 0, sizeof(*p));
+ p->mFlags = SQLITE_DESERIALIZE_RESIZEABLE | SQLITE_DESERIALIZE_FREEONCLOSE;
+ assert( pOutFlags!=0 ); /* True because flags==SQLITE_OPEN_MAIN_DB */
+ *pOutFlags = flags | SQLITE_OPEN_MEMORY;
+ p->base.pMethods = &memdb_io_methods;
+ return SQLITE_OK;
+}
+
+#if 0 /* Only used to delete rollback journals, master journals, and WAL
+ ** files, none of which exist in memdb. So this routine is never used */
+/*
+** Delete the file located at zPath. If the dirSync argument is true,
+** ensure the file-system modifications are synced to disk before
+** returning.
+*/
+static int memdbDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
+ return SQLITE_IOERR_DELETE;
+}
+#endif
+
+/*
+** Test for access permissions. Return true if the requested permission
+** is available, or false otherwise.
+**
+** With memdb, no files ever exist on disk. So always return false.
+*/
+static int memdbAccess(
+ sqlite3_vfs *pVfs,
+ const char *zPath,
+ int flags,
+ int *pResOut
+){
+ *pResOut = 0;
+ return SQLITE_OK;
+}
+
+/*
+** Populate buffer zOut with the full canonical pathname corresponding
+** to the pathname in zPath. zOut is guaranteed to point to a buffer
+** of at least (INST_MAX_PATHNAME+1) bytes.
+*/
+static int memdbFullPathname(
+ sqlite3_vfs *pVfs,
+ const char *zPath,
+ int nOut,
+ char *zOut
+){
+ sqlite3_snprintf(nOut, zOut, "%s", zPath);
+ return SQLITE_OK;
+}
+
+/*
+** Open the dynamic library located at zPath and return a handle.
+*/
+static void *memdbDlOpen(sqlite3_vfs *pVfs, const char *zPath){
+ return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath);
+}
+
+/*
+** Populate the buffer zErrMsg (size nByte bytes) with a human readable
+** utf-8 string describing the most recent error encountered associated
+** with dynamic libraries.
+*/
+static void memdbDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){
+ ORIGVFS(pVfs)->xDlError(ORIGVFS(pVfs), nByte, zErrMsg);
+}
+
+/*
+** Return a pointer to the symbol zSymbol in the dynamic library pHandle.
+*/
+static void (*memdbDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){
+ return ORIGVFS(pVfs)->xDlSym(ORIGVFS(pVfs), p, zSym);
+}
+
+/*
+** Close the dynamic library handle pHandle.
+*/
+static void memdbDlClose(sqlite3_vfs *pVfs, void *pHandle){
+ ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle);
+}
+
+/*
+** Populate the buffer pointed to by zBufOut with nByte bytes of
+** random data.
+*/
+static int memdbRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
+ return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut);
+}
+
+/*
+** Sleep for nMicro microseconds. Return the number of microseconds
+** actually slept.
+*/
+static int memdbSleep(sqlite3_vfs *pVfs, int nMicro){
+ return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro);
+}
+
+#if 0 /* Never used. Modern cores only call xCurrentTimeInt64() */
+/*
+** Return the current time as a Julian Day number in *pTimeOut.
+*/
+static int memdbCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){
+ return ORIGVFS(pVfs)->xCurrentTime(ORIGVFS(pVfs), pTimeOut);
+}
+#endif
+
+static int memdbGetLastError(sqlite3_vfs *pVfs, int a, char *b){
+ return ORIGVFS(pVfs)->xGetLastError(ORIGVFS(pVfs), a, b);
+}
+static int memdbCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p){
+ return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p);
+}
+
+/*
+** Translate a database connection pointer and schema name into a
+** MemFile pointer.
+*/
+static MemFile *memdbFromDbSchema(sqlite3 *db, const char *zSchema){
+ MemFile *p = 0;
+ int rc = sqlite3_file_control(db, zSchema, SQLITE_FCNTL_FILE_POINTER, &p);
+ if( rc ) return 0;
+ if( p->base.pMethods!=&memdb_io_methods ) return 0;
+ return p;
+}
+
+/*
+** Return the serialization of a database
+*/
+SQLITE_API unsigned char *sqlite3_serialize(
+ sqlite3 *db, /* The database connection */
+ const char *zSchema, /* Which database within the connection */
+ sqlite3_int64 *piSize, /* Write size here, if not NULL */
+ unsigned int mFlags /* Maybe SQLITE_SERIALIZE_NOCOPY */
+){
+ MemFile *p;
+ int iDb;
+ Btree *pBt;
+ sqlite3_int64 sz;
+ int szPage = 0;
+ sqlite3_stmt *pStmt = 0;
+ unsigned char *pOut;
+ char *zSql;
+ int rc;
+
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( !sqlite3SafetyCheckOk(db) ){
+ (void)SQLITE_MISUSE_BKPT;
+ return 0;
+ }
+#endif
+
+ if( zSchema==0 ) zSchema = db->aDb[0].zDbSName;
+ p = memdbFromDbSchema(db, zSchema);
+ iDb = sqlite3FindDbName(db, zSchema);
+ if( piSize ) *piSize = -1;
+ if( iDb<0 ) return 0;
+ if( p ){
+ if( piSize ) *piSize = p->sz;
+ if( mFlags & SQLITE_SERIALIZE_NOCOPY ){
+ pOut = p->aData;
+ }else{
+ pOut = sqlite3_malloc64( p->sz );
+ if( pOut ) memcpy(pOut, p->aData, p->sz);
+ }
+ return pOut;
+ }
+ pBt = db->aDb[iDb].pBt;
+ if( pBt==0 ) return 0;
+ szPage = sqlite3BtreeGetPageSize(pBt);
+ zSql = sqlite3_mprintf("PRAGMA \"%w\".page_count", zSchema);
+ rc = zSql ? sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0) : SQLITE_NOMEM;
+ sqlite3_free(zSql);
+ if( rc ) return 0;
+ rc = sqlite3_step(pStmt);
+ if( rc!=SQLITE_ROW ){
+ pOut = 0;
+ }else{
+ sz = sqlite3_column_int64(pStmt, 0)*szPage;
+ if( piSize ) *piSize = sz;
+ if( mFlags & SQLITE_SERIALIZE_NOCOPY ){
+ pOut = 0;
+ }else{
+ pOut = sqlite3_malloc64( sz );
+ if( pOut ){
+ int nPage = sqlite3_column_int(pStmt, 0);
+ Pager *pPager = sqlite3BtreePager(pBt);
+ int pgno;
+ for(pgno=1; pgno<=nPage; pgno++){
+ DbPage *pPage = 0;
+ unsigned char *pTo = pOut + szPage*(sqlite3_int64)(pgno-1);
+ rc = sqlite3PagerGet(pPager, pgno, (DbPage**)&pPage, 0);
+ if( rc==SQLITE_OK ){
+ memcpy(pTo, sqlite3PagerGetData(pPage), szPage);
+ }else{
+ memset(pTo, 0, szPage);
+ }
+ sqlite3PagerUnref(pPage);
+ }
+ }
+ }
+ }
+ sqlite3_finalize(pStmt);
+ return pOut;
+}
+
+/* Convert zSchema to a MemDB and initialize its content.
+*/
+SQLITE_API int sqlite3_deserialize(
+ sqlite3 *db, /* The database connection */
+ const char *zSchema, /* Which DB to reopen with the deserialization */
+ unsigned char *pData, /* The serialized database content */
+ sqlite3_int64 szDb, /* Number bytes in the deserialization */
+ sqlite3_int64 szBuf, /* Total size of buffer pData[] */
+ unsigned mFlags /* Zero or more SQLITE_DESERIALIZE_* flags */
+){
+ MemFile *p;
+ char *zSql;
+ sqlite3_stmt *pStmt = 0;
+ int rc;
+ int iDb;
+
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( !sqlite3SafetyCheckOk(db) ){
+ return SQLITE_MISUSE_BKPT;
+ }
+ if( szDb<0 ) return SQLITE_MISUSE_BKPT;
+ if( szBuf<0 ) return SQLITE_MISUSE_BKPT;
+#endif
+
+ sqlite3_mutex_enter(db->mutex);
+ if( zSchema==0 ) zSchema = db->aDb[0].zDbSName;
+ iDb = sqlite3FindDbName(db, zSchema);
+ if( iDb<0 ){
+ rc = SQLITE_ERROR;
+ goto end_deserialize;
+ }
+ zSql = sqlite3_mprintf("ATTACH x AS %Q", zSchema);
+ rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
+ sqlite3_free(zSql);
+ if( rc ) goto end_deserialize;
+ db->init.iDb = (u8)iDb;
+ db->init.reopenMemdb = 1;
+ rc = sqlite3_step(pStmt);
+ db->init.reopenMemdb = 0;
+ if( rc!=SQLITE_DONE ){
+ rc = SQLITE_ERROR;
+ goto end_deserialize;
+ }
+ p = memdbFromDbSchema(db, zSchema);
+ if( p==0 ){
+ rc = SQLITE_ERROR;
+ }else{
+ p->aData = pData;
+ p->sz = szDb;
+ p->szMax = szBuf;
+ p->mFlags = mFlags;
+ rc = SQLITE_OK;
+ }
+
+end_deserialize:
+ sqlite3_finalize(pStmt);
+ sqlite3_mutex_leave(db->mutex);
+ return rc;
+}
+
+/*
+** This routine is called when the extension is loaded.
+** Register the new VFS.
+*/
+SQLITE_PRIVATE int sqlite3MemdbInit(void){
+ sqlite3_vfs *pLower = sqlite3_vfs_find(0);
+ int sz = pLower->szOsFile;
+ memdb_vfs.pAppData = pLower;
+ /* In all known configurations of SQLite, the size of a default
+ ** sqlite3_file is greater than the size of a memdb sqlite3_file.
+ ** Should that ever change, remove the following NEVER() */
+ if( NEVER(sz<sizeof(MemFile)) ) sz = sizeof(MemFile);
+ memdb_vfs.szOsFile = sz;
+ return sqlite3_vfs_register(&memdb_vfs, 0);
+}
+#endif /* SQLITE_ENABLE_DESERIALIZE */
+
+/************** End of memdb.c ***********************************************/
/************** Begin file bitvec.c ******************************************/
/*
** 2008 February 16
@@ -45121,7 +47194,7 @@ SQLITE_PRIVATE int sqlite3PcacheFetchStress(
sqlite3_log(SQLITE_FULL,
"spill page %d making room for %d - cache used: %d/%d",
pPg->pgno, pgno,
- sqlite3GlobalConfig.pcache.xPagecount(pCache->pCache),
+ sqlite3GlobalConfig.pcache2.xPagecount(pCache->pCache),
numberOfCachePages(pCache));
#endif
pcacheTrace(("%p.SPILL %d\n",pCache,pPg->pgno));
@@ -45256,16 +47329,15 @@ SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr *p){
*/
SQLITE_PRIVATE void sqlite3PcacheMakeClean(PgHdr *p){
assert( sqlite3PcachePageSanity(p) );
- if( ALWAYS((p->flags & PGHDR_DIRTY)!=0) ){
- assert( (p->flags & PGHDR_CLEAN)==0 );
- pcacheManageDirtyList(p, PCACHE_DIRTYLIST_REMOVE);
- p->flags &= ~(PGHDR_DIRTY|PGHDR_NEED_SYNC|PGHDR_WRITEABLE);
- p->flags |= PGHDR_CLEAN;
- pcacheTrace(("%p.CLEAN %d\n",p->pCache,p->pgno));
- assert( sqlite3PcachePageSanity(p) );
- if( p->nRef==0 ){
- pcacheUnpin(p);
- }
+ assert( (p->flags & PGHDR_DIRTY)!=0 );
+ assert( (p->flags & PGHDR_CLEAN)==0 );
+ pcacheManageDirtyList(p, PCACHE_DIRTYLIST_REMOVE);
+ p->flags &= ~(PGHDR_DIRTY|PGHDR_NEED_SYNC|PGHDR_WRITEABLE);
+ p->flags |= PGHDR_CLEAN;
+ pcacheTrace(("%p.CLEAN %d\n",p->pCache,p->pgno));
+ assert( sqlite3PcachePageSanity(p) );
+ if( p->nRef==0 ){
+ pcacheUnpin(p);
}
}
@@ -48178,7 +50250,7 @@ struct Pager {
char *zJournal; /* Name of the journal file */
int (*xBusyHandler)(void*); /* Function to call when busy */
void *pBusyHandlerArg; /* Context argument for xBusyHandler */
- int aStat[3]; /* Total cache hits, misses and writes */
+ int aStat[4]; /* Total cache hits, misses, writes, spills */
#ifdef SQLITE_TEST
int nRead; /* Database pages read */
#endif
@@ -48206,6 +50278,7 @@ struct Pager {
#define PAGER_STAT_HIT 0
#define PAGER_STAT_MISS 1
#define PAGER_STAT_WRITE 2
+#define PAGER_STAT_SPILL 3
/*
** The following global variables hold counters used for
@@ -48692,7 +50765,7 @@ static int jrnlBufferSize(Pager *pPager){
#endif
#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE
- if( dc&SQLITE_IOCAP_BATCH_ATOMIC ){
+ if( pPager->dbSize>0 && (dc&SQLITE_IOCAP_BATCH_ATOMIC) ){
return -1;
}
#endif
@@ -49608,7 +51681,7 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){
rc = pager_truncate(pPager, pPager->dbSize);
}
- if( rc==SQLITE_OK && bCommit && isOpen(pPager->fd) ){
+ if( rc==SQLITE_OK && bCommit ){
rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_COMMIT_PHASETWO, 0);
if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK;
}
@@ -50427,9 +52500,7 @@ end_playback:
** assertion that the transaction counter was modified.
*/
#ifdef SQLITE_DEBUG
- if( pPager->fd->pMethods ){
- sqlite3OsFileControlHint(pPager->fd,SQLITE_FCNTL_DB_UNCHANGED,0);
- }
+ sqlite3OsFileControlHint(pPager->fd,SQLITE_FCNTL_DB_UNCHANGED,0);
#endif
/* If this playback is happening automatically as a result of an IO or
@@ -51182,20 +53253,18 @@ static int pagerOpentemp(
** retried. If it returns zero, then the SQLITE_BUSY error is
** returned to the caller of the pager API function.
*/
-SQLITE_PRIVATE void sqlite3PagerSetBusyhandler(
+SQLITE_PRIVATE void sqlite3PagerSetBusyHandler(
Pager *pPager, /* Pager object */
int (*xBusyHandler)(void *), /* Pointer to busy-handler function */
void *pBusyHandlerArg /* Argument to pass to xBusyHandler */
){
+ void **ap;
pPager->xBusyHandler = xBusyHandler;
pPager->pBusyHandlerArg = pBusyHandlerArg;
-
- if( isOpen(pPager->fd) ){
- void **ap = (void **)&pPager->xBusyHandler;
- assert( ((int(*)(void *))(ap[0]))==xBusyHandler );
- assert( ap[1]==pBusyHandlerArg );
- sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_BUSYHANDLER, (void *)ap);
- }
+ ap = (void **)&pPager->xBusyHandler;
+ assert( ((int(*)(void *))(ap[0]))==xBusyHandler );
+ assert( ap[1]==pBusyHandlerArg );
+ sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_BUSYHANDLER, (void *)ap);
}
/*
@@ -51581,6 +53650,30 @@ static void pagerFreeMapHdrs(Pager *pPager){
}
}
+/* Verify that the database file has not be deleted or renamed out from
+** under the pager. Return SQLITE_OK if the database is still where it ought
+** to be on disk. Return non-zero (SQLITE_READONLY_DBMOVED or some other error
+** code from sqlite3OsAccess()) if the database has gone missing.
+*/
+static int databaseIsUnmoved(Pager *pPager){
+ int bHasMoved = 0;
+ int rc;
+
+ if( pPager->tempFile ) return SQLITE_OK;
+ if( pPager->dbSize==0 ) return SQLITE_OK;
+ assert( pPager->zFilename && pPager->zFilename[0] );
+ rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_HAS_MOVED, &bHasMoved);
+ if( rc==SQLITE_NOTFOUND ){
+ /* If the HAS_MOVED file-control is unimplemented, assume that the file
+ ** has not been moved. That is the historical behavior of SQLite: prior to
+ ** version 3.8.3, it never checked */
+ rc = SQLITE_OK;
+ }else if( rc==SQLITE_OK && bHasMoved ){
+ rc = SQLITE_READONLY_DBMOVED;
+ }
+ return rc;
+}
+
/*
** Shutdown the page cache. Free all memory and close all files.
@@ -51597,8 +53690,7 @@ static void pagerFreeMapHdrs(Pager *pPager){
** to the caller.
*/
SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager, sqlite3 *db){
- u8 *pTmp = (u8 *)pPager->pTmpSpace;
-
+ u8 *pTmp = (u8*)pPager->pTmpSpace;
assert( db || pagerUseWal(pPager)==0 );
assert( assert_pager_state(pPager) );
disable_simulated_io_errors();
@@ -51607,11 +53699,17 @@ SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager, sqlite3 *db){
/* pPager->errCode = 0; */
pPager->exclusiveMode = 0;
#ifndef SQLITE_OMIT_WAL
- assert( db || pPager->pWal==0 );
- sqlite3WalClose(pPager->pWal, db, pPager->walSyncFlags, pPager->pageSize,
- (db && (db->flags & SQLITE_NoCkptOnClose) ? 0 : pTmp)
- );
- pPager->pWal = 0;
+ {
+ u8 *a = 0;
+ assert( db || pPager->pWal==0 );
+ if( db && 0==(db->flags & SQLITE_NoCkptOnClose)
+ && SQLITE_OK==databaseIsUnmoved(pPager)
+ ){
+ a = pTmp;
+ }
+ sqlite3WalClose(pPager->pWal, db, pPager->walSyncFlags, pPager->pageSize,a);
+ pPager->pWal = 0;
+ }
#endif
pager_reset(pPager);
if( MEMDB ){
@@ -52068,6 +54166,7 @@ static int pagerStress(void *p, PgHdr *pPg){
return SQLITE_OK;
}
+ pPager->aStat[PAGER_STAT_SPILL]++;
pPg->pDirty = 0;
if( pagerUseWal(pPager) ){
/* Write a single frame for this page to the log. */
@@ -52173,6 +54272,11 @@ SQLITE_PRIVATE int sqlite3PagerOpen(
int rc = SQLITE_OK; /* Return code */
int tempFile = 0; /* True for temp files (incl. in-memory files) */
int memDb = 0; /* True if this is an in-memory file */
+#ifdef SQLITE_ENABLE_DESERIALIZE
+ int memJM = 0; /* Memory journal mode */
+#else
+# define memJM 0
+#endif
int readOnly = 0; /* True if this is a read-only file */
int journalFileSize; /* Bytes to allocate for each journal fd */
char *zPathname = 0; /* Full path to database file */
@@ -52300,7 +54404,10 @@ SQLITE_PRIVATE int sqlite3PagerOpen(
int fout = 0; /* VFS flags returned by xOpen() */
rc = sqlite3OsOpen(pVfs, pPager->zFilename, pPager->fd, vfsFlags, &fout);
assert( !memDb );
- readOnly = (fout&SQLITE_OPEN_READONLY);
+#ifdef SQLITE_ENABLE_DESERIALIZE
+ memJM = (fout&SQLITE_OPEN_MEMORY)!=0;
+#endif
+ readOnly = (fout&SQLITE_OPEN_READONLY)!=0;
/* If the file was successfully opened for read/write access,
** choose a default page size in case we have to create the
@@ -52431,7 +54538,7 @@ act_like_temp_file:
setSectorSize(pPager);
if( !useJournal ){
pPager->journalMode = PAGER_JOURNALMODE_OFF;
- }else if( memDb ){
+ }else if( memDb || memJM ){
pPager->journalMode = PAGER_JOURNALMODE_MEMORY;
}
/* pPager->xBusyHandler = 0; */
@@ -52446,30 +54553,6 @@ act_like_temp_file:
}
-/* Verify that the database file has not be deleted or renamed out from
-** under the pager. Return SQLITE_OK if the database is still were it ought
-** to be on disk. Return non-zero (SQLITE_READONLY_DBMOVED or some other error
-** code from sqlite3OsAccess()) if the database has gone missing.
-*/
-static int databaseIsUnmoved(Pager *pPager){
- int bHasMoved = 0;
- int rc;
-
- if( pPager->tempFile ) return SQLITE_OK;
- if( pPager->dbSize==0 ) return SQLITE_OK;
- assert( pPager->zFilename && pPager->zFilename[0] );
- rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_HAS_MOVED, &bHasMoved);
- if( rc==SQLITE_NOTFOUND ){
- /* If the HAS_MOVED file-control is unimplemented, assume that the file
- ** has not been moved. That is the historical behavior of SQLite: prior to
- ** version 3.8.3, it never checked */
- rc = SQLITE_OK;
- }else if( rc==SQLITE_OK && bHasMoved ){
- rc = SQLITE_READONLY_DBMOVED;
- }
- return rc;
-}
-
/*
** This function is called after transitioning from PAGER_UNLOCK to
@@ -53058,7 +55141,7 @@ static int getPageMMap(
}
if( pPg==0 ){
rc = pagerAcquireMapPage(pPager, pgno, pData, &pPg);
- }else{
+ }else{
sqlite3OsUnfetch(pPager->fd, (i64)(pgno-1)*pPager->pageSize, pData);
}
if( pPg ){
@@ -53157,6 +55240,7 @@ SQLITE_PRIVATE void sqlite3PagerUnrefPageOne(DbPage *pPg){
assert( pPg->pgno==1 );
assert( (pPg->flags & PGHDR_MMAP)==0 ); /* Page1 is never memory mapped */
pPager = pPg->pPager;
+ sqlite3PagerResetLockTimeout(pPager);
sqlite3PcacheRelease(pPg);
pagerUnlockIfUnused(pPager);
}
@@ -53752,12 +55836,9 @@ static int pager_incr_changecounter(Pager *pPager, int isDirectMode){
*/
SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager, const char *zMaster){
int rc = SQLITE_OK;
-
- if( isOpen(pPager->fd) ){
- void *pArg = (void*)zMaster;
- rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC, pArg);
- if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK;
- }
+ void *pArg = (void*)zMaster;
+ rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC, pArg);
+ if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK;
if( rc==SQLITE_OK && !pPager->noSync ){
assert( !MEMDB );
rc = sqlite3OsSync(pPager->fd, pPager->syncFlags);
@@ -53978,8 +56059,9 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(
if( bBatch ){
if( rc==SQLITE_OK ){
rc = sqlite3OsFileControl(fd, SQLITE_FCNTL_COMMIT_ATOMIC_WRITE, 0);
- }else{
- sqlite3OsFileControl(fd, SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE, 0);
+ }
+ if( rc!=SQLITE_OK ){
+ sqlite3OsFileControlHint(fd, SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE, 0);
}
}
@@ -54203,8 +56285,12 @@ SQLITE_PRIVATE int *sqlite3PagerStats(Pager *pPager){
#endif
/*
-** Parameter eStat must be either SQLITE_DBSTATUS_CACHE_HIT or
-** SQLITE_DBSTATUS_CACHE_MISS. Before returning, *pnVal is incremented by the
+** Parameter eStat must be one of SQLITE_DBSTATUS_CACHE_HIT, _MISS, _WRITE,
+** or _WRITE+1. The SQLITE_DBSTATUS_CACHE_WRITE+1 case is a translation
+** of SQLITE_DBSTATUS_CACHE_SPILL. The _SPILL case is not contiguous because
+** it was added later.
+**
+** Before returning, *pnVal is incremented by the
** current cache hit or miss count, according to the value of eStat. If the
** reset parameter is non-zero, the cache hit or miss count is zeroed before
** returning.
@@ -54214,15 +56300,18 @@ SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *pPager, int eStat, int reset, i
assert( eStat==SQLITE_DBSTATUS_CACHE_HIT
|| eStat==SQLITE_DBSTATUS_CACHE_MISS
|| eStat==SQLITE_DBSTATUS_CACHE_WRITE
+ || eStat==SQLITE_DBSTATUS_CACHE_WRITE+1
);
assert( SQLITE_DBSTATUS_CACHE_HIT+1==SQLITE_DBSTATUS_CACHE_MISS );
assert( SQLITE_DBSTATUS_CACHE_HIT+2==SQLITE_DBSTATUS_CACHE_WRITE );
- assert( PAGER_STAT_HIT==0 && PAGER_STAT_MISS==1 && PAGER_STAT_WRITE==2 );
+ assert( PAGER_STAT_HIT==0 && PAGER_STAT_MISS==1
+ && PAGER_STAT_WRITE==2 && PAGER_STAT_SPILL==3 );
- *pnVal += pPager->aStat[eStat - SQLITE_DBSTATUS_CACHE_HIT];
+ eStat -= SQLITE_DBSTATUS_CACHE_HIT;
+ *pnVal += pPager->aStat[eStat];
if( reset ){
- pPager->aStat[eStat - SQLITE_DBSTATUS_CACHE_HIT] = 0;
+ pPager->aStat[eStat] = 0;
}
}
@@ -54426,6 +56515,16 @@ SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager *pPager){
return pPager->fd;
}
+#ifdef SQLITE_ENABLE_SETLK_TIMEOUT
+/*
+** Reset the lock timeout for pager.
+*/
+SQLITE_PRIVATE void sqlite3PagerResetLockTimeout(Pager *pPager){
+ int x = 0;
+ sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_LOCK_TIMEOUT, &x);
+}
+#endif
+
/*
** Return the file handle for the journal file (if it exists).
** This will be either the rollback journal or the WAL file.
@@ -54886,6 +56985,7 @@ SQLITE_PRIVATE int sqlite3PagerCheckpoint(
pPager->walSyncFlags, pPager->pageSize, (u8 *)pPager->pTmpSpace,
pnLog, pnCkpt
);
+ sqlite3PagerResetLockTimeout(pPager);
}
return rc;
}
@@ -55246,6 +57346,10 @@ SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){
** on a network filesystem. All users of the database must be able to
** share memory.
**
+** In the default unix and windows implementation, the wal-index is a mmapped
+** file whose name is the database name with a "-shm" suffix added. For that
+** reason, the wal-index is sometimes called the "shm" file.
+**
** The wal-index is transient. After a crash, the wal-index can (and should
** be) reconstructed from the original WAL file. In fact, the VFS is required
** to either truncate or zero the header of the wal-index when the last
@@ -55385,9 +57489,18 @@ SQLITE_PRIVATE int sqlite3WalTrace = 0;
#define WALINDEX_MAX_VERSION 3007000
/*
-** Indices of various locking bytes. WAL_NREADER is the number
+** Index numbers for various locking bytes. WAL_NREADER is the number
** of available reader locks and should be at least 3. The default
** is SQLITE_SHM_NLOCK==8 and WAL_NREADER==5.
+**
+** Technically, the various VFSes are free to implement these locks however
+** they see fit. However, compatibility is encouraged so that VFSes can
+** interoperate. The standard implemention used on both unix and windows
+** is for the index number to indicate a byte offset into the
+** WalCkptInfo.aLock[] array in the wal-index header. In other words, all
+** locks are on the shm file. The WALINDEX_LOCK_OFFSET constant (which
+** should be 120) is the location in the shm file for the first locking
+** byte.
*/
#define WAL_WRITE_LOCK 0
#define WAL_ALL_BUT_WRITE 1
@@ -55511,7 +57624,6 @@ struct WalCkptInfo {
#define WAL_FRAME_HDRSIZE 24
/* Size of write ahead log header, including checksum. */
-/* #define WAL_HDRSIZE 24 */
#define WAL_HDRSIZE 32
/* WAL magic value. Either this value, or the same value with the least
@@ -55557,6 +57669,7 @@ struct Wal {
u8 truncateOnCommit; /* True to truncate WAL file on commit */
u8 syncHeader; /* Fsync the WAL header if true */
u8 padToSectorBoundary; /* Pad transactions out to the next sector */
+ u8 bShmUnreliable; /* SHM content is read-only and unreliable */
WalIndexHdr hdr; /* Wal-index header for current transaction */
u32 minFrame; /* Ignore wal frames before this one */
u32 iReCksum; /* On commit, recalculate checksums from here */
@@ -55646,11 +57759,20 @@ struct WalIterator {
** is broken into pages of WALINDEX_PGSZ bytes. Wal-index pages are
** numbered from zero.
**
+** If the wal-index is currently smaller the iPage pages then the size
+** of the wal-index might be increased, but only if it is safe to do
+** so. It is safe to enlarge the wal-index if pWal->writeLock is true
+** or pWal->exclusiveMode==WAL_HEAPMEMORY_MODE.
+**
** If this call is successful, *ppPage is set to point to the wal-index
** page and SQLITE_OK is returned. If an error (an OOM or VFS error) occurs,
** then an SQLite error code is returned and *ppPage is set to 0.
*/
-static int walIndexPage(Wal *pWal, int iPage, volatile u32 **ppPage){
+static SQLITE_NOINLINE int walIndexPageRealloc(
+ Wal *pWal, /* The WAL context */
+ int iPage, /* The page we seek */
+ volatile u32 **ppPage /* Write the page pointer here */
+){
int rc = SQLITE_OK;
/* Enlarge the pWal->apWiData[] array if required */
@@ -55669,16 +57791,19 @@ static int walIndexPage(Wal *pWal, int iPage, volatile u32 **ppPage){
}
/* Request a pointer to the required page from the VFS */
- if( pWal->apWiData[iPage]==0 ){
- if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ){
- pWal->apWiData[iPage] = (u32 volatile *)sqlite3MallocZero(WALINDEX_PGSZ);
- if( !pWal->apWiData[iPage] ) rc = SQLITE_NOMEM_BKPT;
- }else{
- rc = sqlite3OsShmMap(pWal->pDbFd, iPage, WALINDEX_PGSZ,
- pWal->writeLock, (void volatile **)&pWal->apWiData[iPage]
- );
+ assert( pWal->apWiData[iPage]==0 );
+ if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ){
+ pWal->apWiData[iPage] = (u32 volatile *)sqlite3MallocZero(WALINDEX_PGSZ);
+ if( !pWal->apWiData[iPage] ) rc = SQLITE_NOMEM_BKPT;
+ }else{
+ rc = sqlite3OsShmMap(pWal->pDbFd, iPage, WALINDEX_PGSZ,
+ pWal->writeLock, (void volatile **)&pWal->apWiData[iPage]
+ );
+ assert( pWal->apWiData[iPage]!=0 || rc!=SQLITE_OK || pWal->writeLock==0 );
+ testcase( pWal->apWiData[iPage]==0 && rc==SQLITE_OK );
+ if( (rc&0xff)==SQLITE_READONLY ){
+ pWal->readOnly |= WAL_SHM_RDONLY;
if( rc==SQLITE_READONLY ){
- pWal->readOnly |= WAL_SHM_RDONLY;
rc = SQLITE_OK;
}
}
@@ -55688,6 +57813,16 @@ static int walIndexPage(Wal *pWal, int iPage, volatile u32 **ppPage){
assert( iPage==0 || *ppPage || rc!=SQLITE_OK );
return rc;
}
+static int walIndexPage(
+ Wal *pWal, /* The WAL context */
+ int iPage, /* The page we seek */
+ volatile u32 **ppPage /* Write the page pointer here */
+){
+ if( pWal->nWiData<=iPage || (*ppPage = pWal->apWiData[iPage])==0 ){
+ return walIndexPageRealloc(pWal, iPage, ppPage);
+ }
+ return SQLITE_OK;
+}
/*
** Return a pointer to the WalCkptInfo structure in the wal-index.
@@ -56201,7 +58336,6 @@ static int walIndexRecover(Wal *pWal){
i64 nSize; /* Size of log file */
u32 aFrameCksum[2] = {0, 0};
int iLock; /* Lock offset to lock for checkpoint */
- int nLock; /* Number of locks to hold */
/* Obtain an exclusive lock on all byte in the locking range not already
** locked by the caller. The caller is guaranteed to have locked the
@@ -56214,11 +58348,17 @@ static int walIndexRecover(Wal *pWal){
assert( WAL_CKPT_LOCK==WAL_ALL_BUT_WRITE );
assert( pWal->writeLock );
iLock = WAL_ALL_BUT_WRITE + pWal->ckptLock;
- nLock = SQLITE_SHM_NLOCK - iLock;
- rc = walLockExclusive(pWal, iLock, nLock);
+ rc = walLockExclusive(pWal, iLock, WAL_READ_LOCK(0)-iLock);
+ if( rc==SQLITE_OK ){
+ rc = walLockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1);
+ if( rc!=SQLITE_OK ){
+ walUnlockExclusive(pWal, iLock, WAL_READ_LOCK(0)-iLock);
+ }
+ }
if( rc ){
return rc;
}
+
WALTRACE(("WAL%p: recovery begin...\n", pWal));
memset(&pWal->hdr, 0, sizeof(WalIndexHdr));
@@ -56356,7 +58496,8 @@ finished:
recovery_error:
WALTRACE(("WAL%p: recovery %s\n", pWal, rc ? "failed" : "ok"));
- walUnlockExclusive(pWal, iLock, nLock);
+ walUnlockExclusive(pWal, iLock, WAL_READ_LOCK(0)-iLock);
+ walUnlockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1);
return rc;
}
@@ -56364,13 +58505,14 @@ recovery_error:
** Close an open wal-index.
*/
static void walIndexClose(Wal *pWal, int isDelete){
- if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ){
+ if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE || pWal->bShmUnreliable ){
int i;
for(i=0; i<pWal->nWiData; i++){
sqlite3_free((void *)pWal->apWiData[i]);
pWal->apWiData[i] = 0;
}
- }else{
+ }
+ if( pWal->exclusiveMode!=WAL_HEAPMEMORY_MODE ){
sqlite3OsShmUnmap(pWal->pDbFd, isDelete);
}
}
@@ -56657,8 +58799,9 @@ static void walIteratorFree(WalIterator *p){
/*
** Construct a WalInterator object that can be used to loop over all
-** pages in the WAL in ascending order. The caller must hold the checkpoint
-** lock.
+** pages in the WAL following frame nBackfill in ascending order. Frames
+** nBackfill or earlier may be included - excluding them is an optimization
+** only. The caller must hold the checkpoint lock.
**
** On success, make *pp point to the newly allocated WalInterator object
** return SQLITE_OK. Otherwise, return an error code. If this routine
@@ -56667,7 +58810,7 @@ static void walIteratorFree(WalIterator *p){
** The calling routine should invoke walIteratorFree() to destroy the
** WalIterator object when it has finished with it.
*/
-static int walIteratorInit(Wal *pWal, WalIterator **pp){
+static int walIteratorInit(Wal *pWal, u32 nBackfill, WalIterator **pp){
WalIterator *p; /* Return value */
int nSegment; /* Number of segments to merge */
u32 iLast; /* Last frame in log */
@@ -56704,7 +58847,7 @@ static int walIteratorInit(Wal *pWal, WalIterator **pp){
rc = SQLITE_NOMEM_BKPT;
}
- for(i=0; rc==SQLITE_OK && i<nSegment; i++){
+ for(i=walFramePage(nBackfill+1); rc==SQLITE_OK && i<nSegment; i++){
volatile ht_slot *aHash;
u32 iZero;
volatile u32 *aPgno;
@@ -56738,6 +58881,7 @@ static int walIteratorInit(Wal *pWal, WalIterator **pp){
if( rc!=SQLITE_OK ){
walIteratorFree(p);
+ p = 0;
}
*pp = p;
return rc;
@@ -56860,13 +59004,6 @@ static int walCheckpoint(
pInfo = walCkptInfo(pWal);
if( pInfo->nBackfill<pWal->hdr.mxFrame ){
- /* Allocate the iterator */
- rc = walIteratorInit(pWal, &pIter);
- if( rc!=SQLITE_OK ){
- return rc;
- }
- assert( pIter );
-
/* EVIDENCE-OF: R-62920-47450 The busy-handler callback is never invoked
** in the SQLITE_CHECKPOINT_PASSIVE mode. */
assert( eMode!=SQLITE_CHECKPOINT_PASSIVE || xBusy==0 );
@@ -56903,7 +59040,13 @@ static int walCheckpoint(
}
}
- if( pInfo->nBackfill<mxSafeFrame
+ /* Allocate the iterator */
+ if( pInfo->nBackfill<mxSafeFrame ){
+ rc = walIteratorInit(pWal, pInfo->nBackfill, &pIter);
+ assert( rc==SQLITE_OK || pIter==0 );
+ }
+
+ if( pIter
&& (rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(0),1))==SQLITE_OK
){
i64 nSize; /* Current size of database file */
@@ -57164,6 +59307,12 @@ static int walIndexTryHdr(Wal *pWal, int *pChanged){
}
/*
+** This is the value that walTryBeginRead returns when it needs to
+** be retried.
+*/
+#define WAL_RETRY (-1)
+
+/*
** Read the wal-index header from the wal-index and into pWal->hdr.
** If the wal-header appears to be corrupt, try to reconstruct the
** wal-index from the WAL before returning.
@@ -57186,9 +59335,29 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){
assert( pChanged );
rc = walIndexPage(pWal, 0, &page0);
if( rc!=SQLITE_OK ){
- return rc;
- };
- assert( page0 || pWal->writeLock==0 );
+ assert( rc!=SQLITE_READONLY ); /* READONLY changed to OK in walIndexPage */
+ if( rc==SQLITE_READONLY_CANTINIT ){
+ /* The SQLITE_READONLY_CANTINIT return means that the shared-memory
+ ** was openable but is not writable, and this thread is unable to
+ ** confirm that another write-capable connection has the shared-memory
+ ** open, and hence the content of the shared-memory is unreliable,
+ ** since the shared-memory might be inconsistent with the WAL file
+ ** and there is no writer on hand to fix it. */
+ assert( page0==0 );
+ assert( pWal->writeLock==0 );
+ assert( pWal->readOnly & WAL_SHM_RDONLY );
+ pWal->bShmUnreliable = 1;
+ pWal->exclusiveMode = WAL_HEAPMEMORY_MODE;
+ *pChanged = 1;
+ }else{
+ return rc; /* Any other non-OK return is just an error */
+ }
+ }else{
+ /* page0 can be NULL if the SHM is zero bytes in size and pWal->writeLock
+ ** is zero, which prevents the SHM from growing */
+ testcase( page0!=0 );
+ }
+ assert( page0!=0 || pWal->writeLock==0 );
/* If the first page of the wal-index has been mapped, try to read the
** wal-index header immediately, without holding any lock. This usually
@@ -57202,7 +59371,7 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){
*/
assert( badHdr==0 || pWal->writeLock==0 );
if( badHdr ){
- if( pWal->readOnly & WAL_SHM_RDONLY ){
+ if( pWal->bShmUnreliable==0 && (pWal->readOnly & WAL_SHM_RDONLY) ){
if( SQLITE_OK==(rc = walLockShared(pWal, WAL_WRITE_LOCK)) ){
walUnlockShared(pWal, WAL_WRITE_LOCK);
rc = SQLITE_READONLY_RECOVERY;
@@ -57232,15 +59401,193 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){
if( badHdr==0 && pWal->hdr.iVersion!=WALINDEX_MAX_VERSION ){
rc = SQLITE_CANTOPEN_BKPT;
}
+ if( pWal->bShmUnreliable ){
+ if( rc!=SQLITE_OK ){
+ walIndexClose(pWal, 0);
+ pWal->bShmUnreliable = 0;
+ assert( pWal->nWiData>0 && pWal->apWiData[0]==0 );
+ /* walIndexRecover() might have returned SHORT_READ if a concurrent
+ ** writer truncated the WAL out from under it. If that happens, it
+ ** indicates that a writer has fixed the SHM file for us, so retry */
+ if( rc==SQLITE_IOERR_SHORT_READ ) rc = WAL_RETRY;
+ }
+ pWal->exclusiveMode = WAL_NORMAL_MODE;
+ }
return rc;
}
/*
-** This is the value that walTryBeginRead returns when it needs to
-** be retried.
+** Open a transaction in a connection where the shared-memory is read-only
+** and where we cannot verify that there is a separate write-capable connection
+** on hand to keep the shared-memory up-to-date with the WAL file.
+**
+** This can happen, for example, when the shared-memory is implemented by
+** memory-mapping a *-shm file, where a prior writer has shut down and
+** left the *-shm file on disk, and now the present connection is trying
+** to use that database but lacks write permission on the *-shm file.
+** Other scenarios are also possible, depending on the VFS implementation.
+**
+** Precondition:
+**
+** The *-wal file has been read and an appropriate wal-index has been
+** constructed in pWal->apWiData[] using heap memory instead of shared
+** memory.
+**
+** If this function returns SQLITE_OK, then the read transaction has
+** been successfully opened. In this case output variable (*pChanged)
+** is set to true before returning if the caller should discard the
+** contents of the page cache before proceeding. Or, if it returns
+** WAL_RETRY, then the heap memory wal-index has been discarded and
+** the caller should retry opening the read transaction from the
+** beginning (including attempting to map the *-shm file).
+**
+** If an error occurs, an SQLite error code is returned.
*/
-#define WAL_RETRY (-1)
+static int walBeginShmUnreliable(Wal *pWal, int *pChanged){
+ i64 szWal; /* Size of wal file on disk in bytes */
+ i64 iOffset; /* Current offset when reading wal file */
+ u8 aBuf[WAL_HDRSIZE]; /* Buffer to load WAL header into */
+ u8 *aFrame = 0; /* Malloc'd buffer to load entire frame */
+ int szFrame; /* Number of bytes in buffer aFrame[] */
+ u8 *aData; /* Pointer to data part of aFrame buffer */
+ volatile void *pDummy; /* Dummy argument for xShmMap */
+ int rc; /* Return code */
+ u32 aSaveCksum[2]; /* Saved copy of pWal->hdr.aFrameCksum */
+
+ assert( pWal->bShmUnreliable );
+ assert( pWal->readOnly & WAL_SHM_RDONLY );
+ assert( pWal->nWiData>0 && pWal->apWiData[0] );
+
+ /* Take WAL_READ_LOCK(0). This has the effect of preventing any
+ ** writers from running a checkpoint, but does not stop them
+ ** from running recovery. */
+ rc = walLockShared(pWal, WAL_READ_LOCK(0));
+ if( rc!=SQLITE_OK ){
+ if( rc==SQLITE_BUSY ) rc = WAL_RETRY;
+ goto begin_unreliable_shm_out;
+ }
+ pWal->readLock = 0;
+
+ /* Check to see if a separate writer has attached to the shared-memory area,
+ ** thus making the shared-memory "reliable" again. Do this by invoking
+ ** the xShmMap() routine of the VFS and looking to see if the return
+ ** is SQLITE_READONLY instead of SQLITE_READONLY_CANTINIT.
+ **
+ ** If the shared-memory is now "reliable" return WAL_RETRY, which will
+ ** cause the heap-memory WAL-index to be discarded and the actual
+ ** shared memory to be used in its place.
+ **
+ ** This step is important because, even though this connection is holding
+ ** the WAL_READ_LOCK(0) which prevents a checkpoint, a writer might
+ ** have already checkpointed the WAL file and, while the current
+ ** is active, wrap the WAL and start overwriting frames that this
+ ** process wants to use.
+ **
+ ** Once sqlite3OsShmMap() has been called for an sqlite3_file and has
+ ** returned any SQLITE_READONLY value, it must return only SQLITE_READONLY
+ ** or SQLITE_READONLY_CANTINIT or some error for all subsequent invocations,
+ ** even if some external agent does a "chmod" to make the shared-memory
+ ** writable by us, until sqlite3OsShmUnmap() has been called.
+ ** This is a requirement on the VFS implementation.
+ */
+ rc = sqlite3OsShmMap(pWal->pDbFd, 0, WALINDEX_PGSZ, 0, &pDummy);
+ assert( rc!=SQLITE_OK ); /* SQLITE_OK not possible for read-only connection */
+ if( rc!=SQLITE_READONLY_CANTINIT ){
+ rc = (rc==SQLITE_READONLY ? WAL_RETRY : rc);
+ goto begin_unreliable_shm_out;
+ }
+
+ /* We reach this point only if the real shared-memory is still unreliable.
+ ** Assume the in-memory WAL-index substitute is correct and load it
+ ** into pWal->hdr.
+ */
+ memcpy(&pWal->hdr, (void*)walIndexHdr(pWal), sizeof(WalIndexHdr));
+
+ /* Make sure some writer hasn't come in and changed the WAL file out
+ ** from under us, then disconnected, while we were not looking.
+ */
+ rc = sqlite3OsFileSize(pWal->pWalFd, &szWal);
+ if( rc!=SQLITE_OK ){
+ goto begin_unreliable_shm_out;
+ }
+ if( szWal<WAL_HDRSIZE ){
+ /* If the wal file is too small to contain a wal-header and the
+ ** wal-index header has mxFrame==0, then it must be safe to proceed
+ ** reading the database file only. However, the page cache cannot
+ ** be trusted, as a read/write connection may have connected, written
+ ** the db, run a checkpoint, truncated the wal file and disconnected
+ ** since this client's last read transaction. */
+ *pChanged = 1;
+ rc = (pWal->hdr.mxFrame==0 ? SQLITE_OK : WAL_RETRY);
+ goto begin_unreliable_shm_out;
+ }
+
+ /* Check the salt keys at the start of the wal file still match. */
+ rc = sqlite3OsRead(pWal->pWalFd, aBuf, WAL_HDRSIZE, 0);
+ if( rc!=SQLITE_OK ){
+ goto begin_unreliable_shm_out;
+ }
+ if( memcmp(&pWal->hdr.aSalt, &aBuf[16], 8) ){
+ /* Some writer has wrapped the WAL file while we were not looking.
+ ** Return WAL_RETRY which will cause the in-memory WAL-index to be
+ ** rebuilt. */
+ rc = WAL_RETRY;
+ goto begin_unreliable_shm_out;
+ }
+
+ /* Allocate a buffer to read frames into */
+ szFrame = pWal->hdr.szPage + WAL_FRAME_HDRSIZE;
+ aFrame = (u8 *)sqlite3_malloc64(szFrame);
+ if( aFrame==0 ){
+ rc = SQLITE_NOMEM_BKPT;
+ goto begin_unreliable_shm_out;
+ }
+ aData = &aFrame[WAL_FRAME_HDRSIZE];
+
+ /* Check to see if a complete transaction has been appended to the
+ ** wal file since the heap-memory wal-index was created. If so, the
+ ** heap-memory wal-index is discarded and WAL_RETRY returned to
+ ** the caller. */
+ aSaveCksum[0] = pWal->hdr.aFrameCksum[0];
+ aSaveCksum[1] = pWal->hdr.aFrameCksum[1];
+ for(iOffset=walFrameOffset(pWal->hdr.mxFrame+1, pWal->hdr.szPage);
+ iOffset+szFrame<=szWal;
+ iOffset+=szFrame
+ ){
+ u32 pgno; /* Database page number for frame */
+ u32 nTruncate; /* dbsize field from frame header */
+
+ /* Read and decode the next log frame. */
+ rc = sqlite3OsRead(pWal->pWalFd, aFrame, szFrame, iOffset);
+ if( rc!=SQLITE_OK ) break;
+ if( !walDecodeFrame(pWal, &pgno, &nTruncate, aData, aFrame) ) break;
+
+ /* If nTruncate is non-zero, then a complete transaction has been
+ ** appended to this wal file. Set rc to WAL_RETRY and break out of
+ ** the loop. */
+ if( nTruncate ){
+ rc = WAL_RETRY;
+ break;
+ }
+ }
+ pWal->hdr.aFrameCksum[0] = aSaveCksum[0];
+ pWal->hdr.aFrameCksum[1] = aSaveCksum[1];
+
+ begin_unreliable_shm_out:
+ sqlite3_free(aFrame);
+ if( rc!=SQLITE_OK ){
+ int i;
+ for(i=0; i<pWal->nWiData; i++){
+ sqlite3_free((void*)pWal->apWiData[i]);
+ pWal->apWiData[i] = 0;
+ }
+ pWal->bShmUnreliable = 0;
+ sqlite3WalEndReadTransaction(pWal);
+ *pChanged = 1;
+ }
+ return rc;
+}
/*
** Attempt to start a read transaction. This might fail due to a race or
@@ -57256,7 +59603,7 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){
** checkpointed. If useWal==0 then this routine calls walIndexReadHdr()
** to make a copy of the wal-index header into pWal->hdr. If the
** wal-index header has changed, *pChanged is set to 1 (as an indication
-** to the caller that the local paget cache is obsolete and needs to be
+** to the caller that the local page cache is obsolete and needs to be
** flushed.) When useWal==1, the wal-index header is assumed to already
** be loaded and the pChanged parameter is unused.
**
@@ -57302,6 +59649,9 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){
assert( pWal->readLock<0 ); /* Not currently locked */
+ /* useWal may only be set for read/write connections */
+ assert( (pWal->readOnly & WAL_SHM_RDONLY)==0 || useWal==0 );
+
/* Take steps to avoid spinning forever if there is a protocol error.
**
** Circumstances that cause a RETRY should only last for the briefest
@@ -57330,7 +59680,10 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){
}
if( !useWal ){
- rc = walIndexReadHdr(pWal, pChanged);
+ assert( rc==SQLITE_OK );
+ if( pWal->bShmUnreliable==0 ){
+ rc = walIndexReadHdr(pWal, pChanged);
+ }
if( rc==SQLITE_BUSY ){
/* If there is not a recovery running in another thread or process
** then convert BUSY errors to WAL_RETRY. If recovery is known to
@@ -57359,13 +59712,17 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){
if( rc!=SQLITE_OK ){
return rc;
}
+ else if( pWal->bShmUnreliable ){
+ return walBeginShmUnreliable(pWal, pChanged);
+ }
}
+ assert( pWal->nWiData>0 );
+ assert( pWal->apWiData[0]!=0 );
pInfo = walCkptInfo(pWal);
- if( !useWal && pInfo->nBackfill==pWal->hdr.mxFrame
+ if( !useWal && pInfo->nBackfill==pWal->hdr.mxFrame
#ifdef SQLITE_ENABLE_SNAPSHOT
- && (pWal->pSnapshot==0 || pWal->hdr.mxFrame==0
- || 0==memcmp(&pWal->hdr, pWal->pSnapshot, sizeof(WalIndexHdr)))
+ && (pWal->pSnapshot==0 || pWal->hdr.mxFrame==0)
#endif
){
/* The WAL has been completely backfilled (or it is empty).
@@ -57436,7 +59793,7 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){
}
if( mxI==0 ){
assert( rc==SQLITE_BUSY || (pWal->readOnly & WAL_SHM_RDONLY)!=0 );
- return rc==SQLITE_BUSY ? WAL_RETRY : SQLITE_READONLY_CANTLOCK;
+ return rc==SQLITE_BUSY ? WAL_RETRY : SQLITE_READONLY_CANTINIT;
}
rc = walLockShared(pWal, WAL_READ_LOCK(mxI));
@@ -57708,7 +60065,7 @@ SQLITE_PRIVATE int sqlite3WalFindFrame(
** then the WAL is ignored by the reader so return early, as if the
** WAL were empty.
*/
- if( iLast==0 || pWal->readLock==0 ){
+ if( iLast==0 || (pWal->readLock==0 && pWal->bShmUnreliable==0) ){
*piRead = 0;
return SQLITE_OK;
}
@@ -57739,7 +60096,7 @@ SQLITE_PRIVATE int sqlite3WalFindFrame(
** table after the current read-transaction had started.
*/
iMinHash = walFramePage(pWal->minFrame);
- for(iHash=walFramePage(iLast); iHash>=iMinHash && iRead==0; iHash--){
+ for(iHash=walFramePage(iLast); iHash>=iMinHash; iHash--){
volatile ht_slot *aHash; /* Pointer to hash table */
volatile u32 *aPgno; /* Pointer to array of page numbers */
u32 iZero; /* Frame number corresponding to aPgno[0] */
@@ -57762,6 +60119,7 @@ SQLITE_PRIVATE int sqlite3WalFindFrame(
return SQLITE_CORRUPT_BKPT;
}
}
+ if( iRead ) break;
}
#ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT
@@ -57771,8 +60129,8 @@ SQLITE_PRIVATE int sqlite3WalFindFrame(
{
u32 iRead2 = 0;
u32 iTest;
- assert( pWal->minFrame>0 );
- for(iTest=iLast; iTest>=pWal->minFrame; iTest--){
+ assert( pWal->bShmUnreliable || pWal->minFrame>0 );
+ for(iTest=iLast; iTest>=pWal->minFrame && iTest>0; iTest--){
if( walFramePgno(pWal, iTest)==pgno ){
iRead2 = iTest;
break;
@@ -58548,24 +60906,24 @@ SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op){
assert( pWal->readLock>=0 || (op<=0 && pWal->exclusiveMode==0) );
if( op==0 ){
- if( pWal->exclusiveMode ){
- pWal->exclusiveMode = 0;
+ if( pWal->exclusiveMode!=WAL_NORMAL_MODE ){
+ pWal->exclusiveMode = WAL_NORMAL_MODE;
if( walLockShared(pWal, WAL_READ_LOCK(pWal->readLock))!=SQLITE_OK ){
- pWal->exclusiveMode = 1;
+ pWal->exclusiveMode = WAL_EXCLUSIVE_MODE;
}
- rc = pWal->exclusiveMode==0;
+ rc = pWal->exclusiveMode==WAL_NORMAL_MODE;
}else{
/* Already in locking_mode=NORMAL */
rc = 0;
}
}else if( op>0 ){
- assert( pWal->exclusiveMode==0 );
+ assert( pWal->exclusiveMode==WAL_NORMAL_MODE );
assert( pWal->readLock>=0 );
walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock));
- pWal->exclusiveMode = 1;
+ pWal->exclusiveMode = WAL_EXCLUSIVE_MODE;
rc = 1;
}else{
- rc = pWal->exclusiveMode==0;
+ rc = pWal->exclusiveMode==WAL_NORMAL_MODE;
}
return rc;
}
@@ -59176,20 +61534,20 @@ struct BtCursor {
u8 curFlags; /* zero or more BTCF_* flags defined below */
u8 curPagerFlags; /* Flags to send to sqlite3PagerGet() */
u8 hints; /* As configured by CursorSetHints() */
- int nOvflAlloc; /* Allocated size of aOverflow[] array */
+ int skipNext; /* Prev() is noop if negative. Next() is noop if positive.
+ ** Error code if eState==CURSOR_FAULT */
Btree *pBtree; /* The Btree to which this cursor belongs */
- BtShared *pBt; /* The BtShared this cursor points to */
- BtCursor *pNext; /* Forms a linked list of all cursors */
Pgno *aOverflow; /* Cache of overflow page locations */
- CellInfo info; /* A parse of the cell we are pointing at */
- i64 nKey; /* Size of pKey, or last integer key */
void *pKey; /* Saved key that was cursor last known position */
- Pgno pgnoRoot; /* The root page of this tree */
- int skipNext; /* Prev() is noop if negative. Next() is noop if positive.
- ** Error code if eState==CURSOR_FAULT */
/* All fields above are zeroed when the cursor is allocated. See
** sqlite3BtreeCursorZero(). Fields that follow must be manually
** initialized. */
+#define BTCURSOR_FIRST_UNINIT pBt /* Name of first uninitialized field */
+ BtShared *pBt; /* The BtShared this cursor points to */
+ BtCursor *pNext; /* Forms a linked list of all cursors */
+ CellInfo info; /* A parse of the cell we are pointing at */
+ i64 nKey; /* Size of pKey, or last integer key */
+ Pgno pgnoRoot; /* The root page of this tree */
i8 iPage; /* Index of current page in apPage */
u8 curIntKey; /* Value of apPage[0]->intKey */
u16 ix; /* Current index for apPage[iPage] */
@@ -59239,8 +61597,8 @@ struct BtCursor {
** Do nothing else with this cursor. Any attempt to use the cursor
** should return the error code stored in BtCursor.skipNext
*/
-#define CURSOR_INVALID 0
-#define CURSOR_VALID 1
+#define CURSOR_VALID 0
+#define CURSOR_INVALID 1
#define CURSOR_SKIPNEXT 2
#define CURSOR_REQUIRESEEK 3
#define CURSOR_FAULT 4
@@ -59557,10 +61915,10 @@ static void SQLITE_NOINLINE btreeEnterAll(sqlite3 *db){
skipOk = 0;
}
}
- db->skipBtreeMutex = skipOk;
+ db->noSharedCache = skipOk;
}
SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){
- if( db->skipBtreeMutex==0 ) btreeEnterAll(db);
+ if( db->noSharedCache==0 ) btreeEnterAll(db);
}
static void SQLITE_NOINLINE btreeLeaveAll(sqlite3 *db){
int i;
@@ -59572,7 +61930,7 @@ static void SQLITE_NOINLINE btreeLeaveAll(sqlite3 *db){
}
}
SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3 *db){
- if( db->skipBtreeMutex==0 ) btreeLeaveAll(db);
+ if( db->noSharedCache==0 ) btreeLeaveAll(db);
}
#ifndef NDEBUG
@@ -59785,6 +62143,34 @@ SQLITE_API int sqlite3_enable_shared_cache(int enable){
#define hasReadConflicts(a, b) 0
#endif
+/*
+** Implementation of the SQLITE_CORRUPT_PAGE() macro. Takes a single
+** (MemPage*) as an argument. The (MemPage*) must not be NULL.
+**
+** If SQLITE_DEBUG is not defined, then this macro is equivalent to
+** SQLITE_CORRUPT_BKPT. Or, if SQLITE_DEBUG is set, then the log message
+** normally produced as a side-effect of SQLITE_CORRUPT_BKPT is augmented
+** with the page number and filename associated with the (MemPage*).
+*/
+#ifdef SQLITE_DEBUG
+int corruptPageError(int lineno, MemPage *p){
+ char *zMsg;
+ sqlite3BeginBenignMalloc();
+ zMsg = sqlite3_mprintf("database corruption page %d of %s",
+ (int)p->pgno, sqlite3PagerFilename(p->pBt->pPager, 0)
+ );
+ sqlite3EndBenignMalloc();
+ if( zMsg ){
+ sqlite3ReportError(SQLITE_CORRUPT, lineno, zMsg);
+ }
+ sqlite3_free(zMsg);
+ return SQLITE_CORRUPT_BKPT;
+}
+# define SQLITE_CORRUPT_PAGE(pMemPage) corruptPageError(__LINE__, pMemPage)
+#else
+# define SQLITE_CORRUPT_PAGE(pMemPage) SQLITE_CORRUPT_PGNO(pMemPage->pgno)
+#endif
+
#ifndef SQLITE_OMIT_SHARED_CACHE
#ifdef SQLITE_DEBUG
@@ -60509,7 +62895,11 @@ static int btreeRestoreCursorPosition(BtCursor *pCur){
** back to where it ought to be if this routine returns true.
*/
SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor *pCur){
- return pCur->eState!=CURSOR_VALID;
+ assert( EIGHT_BYTE_ALIGNMENT(pCur)
+ || pCur==sqlite3BtreeFakeValidCursor() );
+ assert( offsetof(BtCursor, eState)==0 );
+ assert( sizeof(pCur->eState)==1 );
+ return CURSOR_VALID != *(u8*)pCur;
}
/*
@@ -61073,7 +63463,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){
int sz = get2byte(&data[iFree+2]);
int top = get2byte(&data[hdr+5]);
if( top>=iFree ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
if( iFree2 ){
assert( iFree+sz<=iFree2 ); /* Verified by pageFindSlot() */
@@ -61107,13 +63497,13 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){
** if PRAGMA cell_size_check=ON.
*/
if( pc<iCellFirst || pc>iCellLast ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
assert( pc>=iCellFirst && pc<=iCellLast );
size = pPage->xCellSize(pPage, &src[pc]);
cbrk -= size;
if( cbrk<iCellFirst || pc+size>usableSize ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
assert( cbrk+size<=usableSize && cbrk>=iCellFirst );
testcase( cbrk+size==usableSize );
@@ -61133,7 +63523,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){
defragment_out:
if( data[hdr+7]+cbrk-iCellFirst!=pPage->nFree ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
assert( cbrk>=iCellFirst );
put2byte(&data[hdr+5], cbrk);
@@ -61177,7 +63567,7 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){
testcase( x==4 );
testcase( x==3 );
if( size+pc > usableSize ){
- *pRc = SQLITE_CORRUPT_PGNO(pPg->pgno);
+ *pRc = SQLITE_CORRUPT_PAGE(pPg);
return 0;
}else if( x<4 ){
/* EVIDENCE-OF: R-11498-58022 In a well-formed b-tree page, the total
@@ -61200,7 +63590,7 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){
if( pc<iAddr+size ) break;
}
if( pc ){
- *pRc = SQLITE_CORRUPT_PGNO(pPg->pgno);
+ *pRc = SQLITE_CORRUPT_PAGE(pPg);
}
return 0;
@@ -61248,7 +63638,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){
if( top==0 && pPage->pBt->usableSize==65536 ){
top = 65536;
}else{
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
}
@@ -61338,12 +63728,12 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){
while( (iFreeBlk = get2byte(&data[iPtr]))<iStart ){
if( iFreeBlk<iPtr+4 ){
if( iFreeBlk==0 ) break;
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
iPtr = iFreeBlk;
}
if( iFreeBlk>pPage->pBt->usableSize-4 ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
assert( iFreeBlk>iPtr || iFreeBlk==0 );
@@ -61355,10 +63745,10 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){
*/
if( iFreeBlk && iEnd+3>=iFreeBlk ){
nFrag = iFreeBlk - iEnd;
- if( iEnd>iFreeBlk ) return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ if( iEnd>iFreeBlk ) return SQLITE_CORRUPT_PAGE(pPage);
iEnd = iFreeBlk + get2byte(&data[iFreeBlk+2]);
if( iEnd > pPage->pBt->usableSize ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
iSize = iEnd - iStart;
iFreeBlk = get2byte(&data[iFreeBlk]);
@@ -61371,13 +63761,13 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){
if( iPtr>hdr+1 ){
int iPtrEnd = iPtr + get2byte(&data[iPtr+2]);
if( iPtrEnd+3>=iStart ){
- if( iPtrEnd>iStart ) return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ if( iPtrEnd>iStart ) return SQLITE_CORRUPT_PAGE(pPage);
nFrag += iStart - iPtrEnd;
iSize = iEnd - iPtr;
iStart = iPtr;
}
}
- if( nFrag>data[hdr+7] ) return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ if( nFrag>data[hdr+7] ) return SQLITE_CORRUPT_PAGE(pPage);
data[hdr+7] -= nFrag;
}
x = get2byte(&data[hdr+5]);
@@ -61385,7 +63775,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){
/* The new freeblock is at the beginning of the cell content area,
** so just extend the cell content area rather than create another
** freelist entry */
- if( iStart<x || iPtr!=hdr+1 ) return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ if( iStart<x || iPtr!=hdr+1 ) return SQLITE_CORRUPT_PAGE(pPage);
put2byte(&data[hdr+1], iFreeBlk);
put2byte(&data[hdr+5], iEnd);
}else{
@@ -61458,7 +63848,7 @@ static int decodeFlags(MemPage *pPage, int flagByte){
}else{
/* EVIDENCE-OF: R-47608-56469 Any other value for the b-tree page type is
** an error. */
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
pPage->max1bytePayload = pBt->max1bytePayload;
return SQLITE_OK;
@@ -61499,7 +63889,7 @@ static int btreeInitPage(MemPage *pPage){
/* EVIDENCE-OF: R-28594-02890 The one-byte flag at offset 0 indicating
** the b-tree page type. */
if( decodeFlags(pPage, data[hdr]) ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
assert( pBt->pageSize>=512 && pBt->pageSize<=65536 );
pPage->maskPage = (u16)(pBt->pageSize - 1);
@@ -61518,7 +63908,7 @@ static int btreeInitPage(MemPage *pPage){
pPage->nCell = get2byte(&data[hdr+3]);
if( pPage->nCell>MX_CELL(pBt) ){
/* To many cells for a single page. The page must be corrupt */
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
testcase( pPage->nCell==MX_CELL(pBt) );
/* EVIDENCE-OF: R-24089-57979 If a page contains no cells (which is only
@@ -61546,12 +63936,12 @@ static int btreeInitPage(MemPage *pPage){
testcase( pc==iCellFirst );
testcase( pc==iCellLast );
if( pc<iCellFirst || pc>iCellLast ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
sz = pPage->xCellSize(pPage, &data[pc]);
testcase( pc+sz==usableSize );
if( pc+sz>usableSize ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
}
if( !pPage->leaf ) iCellLast++;
@@ -61569,12 +63959,12 @@ static int btreeInitPage(MemPage *pPage){
/* EVIDENCE-OF: R-55530-52930 In a well-formed b-tree page, there will
** always be at least one cell before the first freeblock.
*/
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
while( 1 ){
if( pc>iCellLast ){
/* Freeblock off the end of the page */
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
next = get2byte(&data[pc]);
size = get2byte(&data[pc+2]);
@@ -61584,11 +63974,11 @@ static int btreeInitPage(MemPage *pPage){
}
if( next>0 ){
/* Freeblock not in ascending order */
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
if( pc+size>(unsigned int)usableSize ){
/* Last freeblock extends past page end */
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
}
@@ -61600,7 +63990,7 @@ static int btreeInitPage(MemPage *pPage){
** area, according to the page header, lies within the page.
*/
if( nFree>usableSize ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
pPage->nFree = (u16)(nFree - iCellFirst);
pPage->isInit = 1;
@@ -61876,7 +64266,8 @@ static int btreeInvokeBusyHandler(void *pArg){
BtShared *pBt = (BtShared*)pArg;
assert( pBt->db );
assert( sqlite3_mutex_held(pBt->db->mutex) );
- return sqlite3InvokeBusyHandler(&pBt->db->busyHandler);
+ return sqlite3InvokeBusyHandler(&pBt->db->busyHandler,
+ sqlite3PagerFile(pBt->pPager));
}
/*
@@ -62054,7 +64445,7 @@ SQLITE_PRIVATE int sqlite3BtreeOpen(
}
pBt->openFlags = (u8)flags;
pBt->db = db;
- sqlite3PagerSetBusyhandler(pBt->pPager, btreeInvokeBusyHandler, pBt);
+ sqlite3PagerSetBusyHandler(pBt->pPager, btreeInvokeBusyHandler, pBt);
p->pBt = pBt;
pBt->pCursor = 0;
@@ -62616,6 +65007,10 @@ static void setDefaultSyncFlag(BtShared *pBt, u8 safety_level){
# define setDefaultSyncFlag(pBt,safety_level)
#endif
+/* Forward declaration */
+static int newDatabase(BtShared*);
+
+
/*
** Get a reference to pPage1 of the database file. This will
** also acquire a readlock on that file.
@@ -62647,6 +65042,9 @@ static int lockBtree(BtShared *pBt){
if( nPage==0 || memcmp(24+(u8*)pPage1->aData, 92+(u8*)pPage1->aData,4)!=0 ){
nPage = nPageFile;
}
+ if( (pBt->db->flags & SQLITE_ResetDatabase)!=0 ){
+ nPage = 0;
+ }
if( nPage>0 ){
u32 pageSize;
u32 usableSize;
@@ -63017,6 +65415,7 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag){
}
}while( (rc&0xFF)==SQLITE_BUSY && pBt->inTransaction==TRANS_NONE &&
btreeInvokeBusyHandler(pBt) );
+ sqlite3PagerResetLockTimeout(pBt->pPager);
if( rc==SQLITE_OK ){
if( p->inTrans==TRANS_NONE ){
@@ -63131,7 +65530,7 @@ static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){
if( eType==PTRMAP_OVERFLOW2 ){
/* The pointer is always the first 4 bytes of the page in this case. */
if( get4byte(pPage->aData)!=iFrom ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
put4byte(pPage->aData, iTo);
}else{
@@ -63150,7 +65549,7 @@ static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){
pPage->xParseCell(pPage, pCell, &info);
if( info.nLocal<info.nPayload ){
if( pCell+info.nSize > pPage->aData+pPage->pBt->usableSize ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
if( iFrom==get4byte(pCell+info.nSize-4) ){
put4byte(pCell+info.nSize-4, iTo);
@@ -63168,7 +65567,7 @@ static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){
if( i==nCell ){
if( eType!=PTRMAP_BTREE ||
get4byte(&pPage->aData[pPage->hdrOffset+8])!=iFrom ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
put4byte(&pPage->aData[pPage->hdrOffset+8], iTo);
}
@@ -63990,7 +66389,7 @@ SQLITE_PRIVATE int sqlite3BtreeCursorSize(void){
** of run-time by skipping the initialization of those elements.
*/
SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor *p){
- memset(p, 0, offsetof(BtCursor, iPage));
+ memset(p, 0, offsetof(BtCursor, BTCURSOR_FIRST_UNINIT));
}
/*
@@ -64033,11 +66432,19 @@ SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor *pCur){
** Using this cache reduces the number of calls to btreeParseCell().
*/
#ifndef NDEBUG
+ static int cellInfoEqual(CellInfo *a, CellInfo *b){
+ if( a->nKey!=b->nKey ) return 0;
+ if( a->pPayload!=b->pPayload ) return 0;
+ if( a->nPayload!=b->nPayload ) return 0;
+ if( a->nLocal!=b->nLocal ) return 0;
+ if( a->nSize!=b->nSize ) return 0;
+ return 1;
+ }
static void assertCellInfo(BtCursor *pCur){
CellInfo info;
memset(&info, 0, sizeof(info));
btreeParseCell(pCur->pPage, pCur->ix, &info);
- assert( CORRUPT_DB || memcmp(&info, &pCur->info, sizeof(info))==0 );
+ assert( CORRUPT_DB || cellInfoEqual(&info, &pCur->info) );
}
#else
#define assertCellInfo(x)
@@ -64080,6 +66487,20 @@ SQLITE_PRIVATE i64 sqlite3BtreeIntegerKey(BtCursor *pCur){
return pCur->info.nKey;
}
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+/*
+** Return the offset into the database file for the start of the
+** payload to which the cursor is pointing.
+*/
+SQLITE_PRIVATE i64 sqlite3BtreeOffset(BtCursor *pCur){
+ assert( cursorHoldsMutex(pCur) );
+ assert( pCur->eState==CURSOR_VALID );
+ getCellInfo(pCur);
+ return (i64)pCur->pBt->pageSize*((i64)pCur->pPage->pgno - 1) +
+ (i64)(pCur->info.pPayload - pCur->pPage->aData);
+}
+#endif /* SQLITE_ENABLE_OFFSET_SQL_FUNC */
+
/*
** Return the number of bytes of payload for the entry that pCur is
** currently pointing to. For table btrees, this will be the amount
@@ -64266,7 +66687,7 @@ static int accessPayload(
** &aPayload[pCur->info.nLocal] > &pPage->aData[pBt->usableSize]
** but is recast into its current form to avoid integer overflow problems
*/
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
/* Check if data must be read/written to/from the btree page itself. */
@@ -64299,14 +66720,15 @@ static int accessPayload(
*/
if( (pCur->curFlags & BTCF_ValidOvfl)==0 ){
int nOvfl = (pCur->info.nPayload-pCur->info.nLocal+ovflSize-1)/ovflSize;
- if( nOvfl>pCur->nOvflAlloc ){
+ if( pCur->aOverflow==0
+ || nOvfl*(int)sizeof(Pgno) > sqlite3MallocSize(pCur->aOverflow)
+ ){
Pgno *aNew = (Pgno*)sqlite3Realloc(
pCur->aOverflow, nOvfl*2*sizeof(Pgno)
);
if( aNew==0 ){
return SQLITE_NOMEM_BKPT;
}else{
- pCur->nOvflAlloc = nOvfl*2;
pCur->aOverflow = aNew;
}
}
@@ -64414,7 +66836,7 @@ static int accessPayload(
if( rc==SQLITE_OK && amt>0 ){
/* Overflow chain ends prematurely */
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
return rc;
}
@@ -64692,7 +67114,7 @@ static int moveToRoot(BtCursor *pCur){
** (or the freelist). */
assert( pRoot->intKey==1 || pRoot->intKey==0 );
if( pRoot->isInit==0 || (pCur->pKeyInfo==0)!=pRoot->intKey ){
- return SQLITE_CORRUPT_PGNO(pCur->pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pCur->pPage);
}
skip_init:
@@ -64965,7 +67387,7 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked(
if( pPage->intKeyLeaf ){
while( 0x80 <= *(pCell++) ){
if( pCell>=pPage->aDataEnd ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
}
}
@@ -65039,7 +67461,7 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked(
testcase( nCell==1 ); /* Invalid key size: 0x80 0x80 0x01 */
testcase( nCell==2 ); /* Minimum legal index key size */
if( nCell<2 ){
- rc = SQLITE_CORRUPT_PGNO(pPage->pgno);
+ rc = SQLITE_CORRUPT_PAGE(pPage);
goto moveto_finish;
}
pCellKey = sqlite3Malloc( nCell+18 );
@@ -65820,9 +68242,8 @@ static void freePage(MemPage *pPage, int *pRC){
}
/*
-** Free any overflow pages associated with the given Cell. Write the
-** local Cell size (the number of bytes on the original page, omitting
-** overflow) into *pnSize.
+** Free any overflow pages associated with the given Cell. Store
+** size information about the cell in pInfo.
*/
static int clearCell(
MemPage *pPage, /* The page that contains the Cell */
@@ -65840,9 +68261,11 @@ static int clearCell(
if( pInfo->nLocal==pInfo->nPayload ){
return SQLITE_OK; /* No overflow pages. Return without doing anything */
}
- if( pCell+pInfo->nSize-1 > pPage->aData+pPage->maskPage ){
+ testcase( pCell + pInfo->nSize == pPage->aDataEnd );
+ testcase( pCell + (pInfo->nSize-1) == pPage->aDataEnd );
+ if( pCell + pInfo->nSize > pPage->aDataEnd ){
/* Cell extends past end of page */
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
ovflPgno = get4byte(pCell + pInfo->nSize - 4);
pBt = pPage->pBt;
@@ -67026,7 +69449,7 @@ static int balance_nonroot(
}
/* Load b.apCell[] with pointers to all cells in pOld. If pOld
- ** constains overflow cells, include them in the b.apCell[] array
+ ** contains overflow cells, include them in the b.apCell[] array
** in the correct spot.
**
** Note that when there are multiple overflow cells, it is always the
@@ -67766,6 +70189,94 @@ static int balance(BtCursor *pCur){
return rc;
}
+/* Overwrite content from pX into pDest. Only do the write if the
+** content is different from what is already there.
+*/
+static int btreeOverwriteContent(
+ MemPage *pPage, /* MemPage on which writing will occur */
+ u8 *pDest, /* Pointer to the place to start writing */
+ const BtreePayload *pX, /* Source of data to write */
+ int iOffset, /* Offset of first byte to write */
+ int iAmt /* Number of bytes to be written */
+){
+ int nData = pX->nData - iOffset;
+ if( nData<=0 ){
+ /* Overwritting with zeros */
+ int i;
+ for(i=0; i<iAmt && pDest[i]==0; i++){}
+ if( i<iAmt ){
+ int rc = sqlite3PagerWrite(pPage->pDbPage);
+ if( rc ) return rc;
+ memset(pDest + i, 0, iAmt - i);
+ }
+ }else{
+ if( nData<iAmt ){
+ /* Mixed read data and zeros at the end. Make a recursive call
+ ** to write the zeros then fall through to write the real data */
+ int rc = btreeOverwriteContent(pPage, pDest+nData, pX, iOffset+nData,
+ iAmt-nData);
+ if( rc ) return rc;
+ iAmt = nData;
+ }
+ if( memcmp(pDest, ((u8*)pX->pData) + iOffset, iAmt)!=0 ){
+ int rc = sqlite3PagerWrite(pPage->pDbPage);
+ if( rc ) return rc;
+ memcpy(pDest, ((u8*)pX->pData) + iOffset, iAmt);
+ }
+ }
+ return SQLITE_OK;
+}
+
+/*
+** Overwrite the cell that cursor pCur is pointing to with fresh content
+** contained in pX.
+*/
+static int btreeOverwriteCell(BtCursor *pCur, const BtreePayload *pX){
+ int iOffset; /* Next byte of pX->pData to write */
+ int nTotal = pX->nData + pX->nZero; /* Total bytes of to write */
+ int rc; /* Return code */
+ MemPage *pPage = pCur->pPage; /* Page being written */
+ BtShared *pBt; /* Btree */
+ Pgno ovflPgno; /* Next overflow page to write */
+ u32 ovflPageSize; /* Size to write on overflow page */
+
+ if( pCur->info.pPayload + pCur->info.nLocal > pPage->aDataEnd ){
+ return SQLITE_CORRUPT_BKPT;
+ }
+ /* Overwrite the local portion first */
+ rc = btreeOverwriteContent(pPage, pCur->info.pPayload, pX,
+ 0, pCur->info.nLocal);
+ if( rc ) return rc;
+ if( pCur->info.nLocal==nTotal ) return SQLITE_OK;
+
+ /* Now overwrite the overflow pages */
+ iOffset = pCur->info.nLocal;
+ assert( nTotal>=0 );
+ assert( iOffset>=0 );
+ ovflPgno = get4byte(pCur->info.pPayload + iOffset);
+ pBt = pPage->pBt;
+ ovflPageSize = pBt->usableSize - 4;
+ do{
+ rc = btreeGetPage(pBt, ovflPgno, &pPage, 0);
+ if( rc ) return rc;
+ if( sqlite3PagerPageRefcount(pPage->pDbPage)!=1 ){
+ rc = SQLITE_CORRUPT_BKPT;
+ }else{
+ if( iOffset+ovflPageSize<(u32)nTotal ){
+ ovflPgno = get4byte(pPage->aData);
+ }else{
+ ovflPageSize = nTotal - iOffset;
+ }
+ rc = btreeOverwriteContent(pPage, pPage->aData+4, pX,
+ iOffset, ovflPageSize);
+ }
+ sqlite3PagerUnref(pPage->pDbPage);
+ if( rc ) return rc;
+ iOffset += ovflPageSize;
+ }while( iOffset<nTotal );
+ return SQLITE_OK;
+}
+
/*
** Insert a new record into the BTree. The content of the new record
@@ -67856,35 +70367,86 @@ SQLITE_PRIVATE int sqlite3BtreeInsert(
invalidateIncrblobCursors(p, pCur->pgnoRoot, pX->nKey, 0);
/* If BTREE_SAVEPOSITION is set, the cursor must already be pointing
- ** to a row with the same key as the new entry being inserted. */
- assert( (flags & BTREE_SAVEPOSITION)==0 ||
- ((pCur->curFlags&BTCF_ValidNKey)!=0 && pX->nKey==pCur->info.nKey) );
+ ** to a row with the same key as the new entry being inserted.
+ */
+#ifdef SQLITE_DEBUG
+ if( flags & BTREE_SAVEPOSITION ){
+ assert( pCur->curFlags & BTCF_ValidNKey );
+ assert( pX->nKey==pCur->info.nKey );
+ assert( pCur->info.nSize!=0 );
+ assert( loc==0 );
+ }
+#endif
- /* If the cursor is currently on the last row and we are appending a
- ** new row onto the end, set the "loc" to avoid an unnecessary
- ** btreeMoveto() call */
+ /* On the other hand, BTREE_SAVEPOSITION==0 does not imply
+ ** that the cursor is not pointing to a row to be overwritten.
+ ** So do a complete check.
+ */
if( (pCur->curFlags&BTCF_ValidNKey)!=0 && pX->nKey==pCur->info.nKey ){
- loc = 0;
+ /* The cursor is pointing to the entry that is to be
+ ** overwritten */
+ assert( pX->nData>=0 && pX->nZero>=0 );
+ if( pCur->info.nSize!=0
+ && pCur->info.nPayload==(u32)pX->nData+pX->nZero
+ ){
+ /* New entry is the same size as the old. Do an overwrite */
+ return btreeOverwriteCell(pCur, pX);
+ }
+ assert( loc==0 );
}else if( loc==0 ){
+ /* The cursor is *not* pointing to the cell to be overwritten, nor
+ ** to an adjacent cell. Move the cursor so that it is pointing either
+ ** to the cell to be overwritten or an adjacent cell.
+ */
rc = sqlite3BtreeMovetoUnpacked(pCur, 0, pX->nKey, flags!=0, &loc);
if( rc ) return rc;
}
- }else if( loc==0 && (flags & BTREE_SAVEPOSITION)==0 ){
- if( pX->nMem ){
- UnpackedRecord r;
- r.pKeyInfo = pCur->pKeyInfo;
- r.aMem = pX->aMem;
- r.nField = pX->nMem;
- r.default_rc = 0;
- r.errCode = 0;
- r.r1 = 0;
- r.r2 = 0;
- r.eqSeen = 0;
- rc = sqlite3BtreeMovetoUnpacked(pCur, &r, 0, flags!=0, &loc);
- }else{
- rc = btreeMoveto(pCur, pX->pKey, pX->nKey, flags!=0, &loc);
+ }else{
+ /* This is an index or a WITHOUT ROWID table */
+
+ /* If BTREE_SAVEPOSITION is set, the cursor must already be pointing
+ ** to a row with the same key as the new entry being inserted.
+ */
+ assert( (flags & BTREE_SAVEPOSITION)==0 || loc==0 );
+
+ /* If the cursor is not already pointing either to the cell to be
+ ** overwritten, or if a new cell is being inserted, if the cursor is
+ ** not pointing to an immediately adjacent cell, then move the cursor
+ ** so that it does.
+ */
+ if( loc==0 && (flags & BTREE_SAVEPOSITION)==0 ){
+ if( pX->nMem ){
+ UnpackedRecord r;
+ r.pKeyInfo = pCur->pKeyInfo;
+ r.aMem = pX->aMem;
+ r.nField = pX->nMem;
+ r.default_rc = 0;
+ r.errCode = 0;
+ r.r1 = 0;
+ r.r2 = 0;
+ r.eqSeen = 0;
+ rc = sqlite3BtreeMovetoUnpacked(pCur, &r, 0, flags!=0, &loc);
+ }else{
+ rc = btreeMoveto(pCur, pX->pKey, pX->nKey, flags!=0, &loc);
+ }
+ if( rc ) return rc;
}
- if( rc ) return rc;
+
+ /* If the cursor is currently pointing to an entry to be overwritten
+ ** and the new content is the same as as the old, then use the
+ ** overwrite optimization.
+ */
+ if( loc==0 ){
+ getCellInfo(pCur);
+ if( pCur->info.nKey==pX->nKey ){
+ BtreePayload x2;
+ x2.pData = pX->pKey;
+ x2.nData = pX->nKey;
+ x2.nZero = 0;
+ return btreeOverwriteCell(pCur, &x2);
+ }
+ }
+
}
assert( pCur->eState==CURSOR_VALID || (pCur->eState==CURSOR_INVALID && loc) );
@@ -68723,14 +71285,14 @@ static void checkAppendMsg(
pCheck->nErr++;
va_start(ap, zFormat);
if( pCheck->errMsg.nChar ){
- sqlite3StrAccumAppend(&pCheck->errMsg, "\n", 1);
+ sqlite3_str_append(&pCheck->errMsg, "\n", 1);
}
if( pCheck->zPfx ){
- sqlite3XPrintf(&pCheck->errMsg, pCheck->zPfx, pCheck->v1, pCheck->v2);
+ sqlite3_str_appendf(&pCheck->errMsg, pCheck->zPfx, pCheck->v1, pCheck->v2);
}
- sqlite3VXPrintf(&pCheck->errMsg, zFormat, ap);
+ sqlite3_str_vappendf(&pCheck->errMsg, zFormat, ap);
va_end(ap);
- if( pCheck->errMsg.accError==STRACCUM_NOMEM ){
+ if( pCheck->errMsg.accError==SQLITE_NOMEM ){
pCheck->mallocFailed = 1;
}
}
@@ -69314,11 +71876,11 @@ integrity_ck_cleanup:
sqlite3PageFree(sCheck.heap);
sqlite3_free(sCheck.aPgRef);
if( sCheck.mallocFailed ){
- sqlite3StrAccumReset(&sCheck.errMsg);
+ sqlite3_str_reset(&sCheck.errMsg);
sCheck.nErr++;
}
*pnErr = sCheck.nErr;
- if( sCheck.nErr==0 ) sqlite3StrAccumReset(&sCheck.errMsg);
+ if( sCheck.nErr==0 ) sqlite3_str_reset(&sCheck.errMsg);
/* Make sure this analysis did not leave any unref() pages. */
assert( nRef==sqlite3PagerRefcount(pBt->pPager) );
sqlite3BtreeLeave(p);
@@ -70461,7 +73023,7 @@ SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem *p){
if( p->flags & MEM_Null ){
/* Cannot be both MEM_Null and some other type */
assert( (p->flags & (MEM_Int|MEM_Real|MEM_Str|MEM_Blob
- |MEM_RowSet|MEM_Frame|MEM_Agg|MEM_Zero))==0 );
+ |MEM_RowSet|MEM_Frame|MEM_Agg))==0 );
/* If MEM_Null is set, then either the value is a pure NULL (the usual
** case) or it is a pointer set using sqlite3_bind_pointer() or
@@ -70511,6 +73073,51 @@ SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem *p){
}
#endif
+#ifdef SQLITE_DEBUG
+/*
+** Check that string value of pMem agrees with its integer or real value.
+**
+** A single int or real value always converts to the same strings. But
+** many different strings can be converted into the same int or real.
+** If a table contains a numeric value and an index is based on the
+** corresponding string value, then it is important that the string be
+** derived from the numeric value, not the other way around, to ensure
+** that the index and table are consistent. See ticket
+** https://www.sqlite.org/src/info/343634942dd54ab (2018-01-31) for
+** an example.
+**
+** This routine looks at pMem to verify that if it has both a numeric
+** representation and a string representation then the string rep has
+** been derived from the numeric and not the other way around. It returns
+** true if everything is ok and false if there is a problem.
+**
+** This routine is for use inside of assert() statements only.
+*/
+SQLITE_PRIVATE int sqlite3VdbeMemConsistentDualRep(Mem *p){
+ char zBuf[100];
+ char *z;
+ int i, j, incr;
+ if( (p->flags & MEM_Str)==0 ) return 1;
+ if( (p->flags & (MEM_Int|MEM_Real))==0 ) return 1;
+ if( p->flags & MEM_Int ){
+ sqlite3_snprintf(sizeof(zBuf),zBuf,"%lld",p->u.i);
+ }else{
+ sqlite3_snprintf(sizeof(zBuf),zBuf,"%!.15g",p->u.r);
+ }
+ z = p->z;
+ i = j = 0;
+ incr = 1;
+ if( p->enc!=SQLITE_UTF8 ){
+ incr = 2;
+ if( p->enc==SQLITE_UTF16BE ) z++;
+ }
+ while( zBuf[j] ){
+ if( zBuf[j++]!=z[i] ) return 0;
+ i += incr;
+ }
+ return 1;
+}
+#endif /* SQLITE_DEBUG */
/*
** If pMem is an object with a valid string representation, this routine
@@ -70768,26 +73375,24 @@ SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem *pMem, u8 enc, u8 bForce){
** otherwise.
*/
SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){
- int rc = SQLITE_OK;
- if( ALWAYS(pFunc && pFunc->xFinalize) ){
- sqlite3_context ctx;
- Mem t;
- assert( (pMem->flags & MEM_Null)!=0 || pFunc==pMem->u.pDef );
- assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
- memset(&ctx, 0, sizeof(ctx));
- memset(&t, 0, sizeof(t));
- t.flags = MEM_Null;
- t.db = pMem->db;
- ctx.pOut = &t;
- ctx.pMem = pMem;
- ctx.pFunc = pFunc;
- pFunc->xFinalize(&ctx); /* IMP: R-24505-23230 */
- assert( (pMem->flags & MEM_Dyn)==0 );
- if( pMem->szMalloc>0 ) sqlite3DbFreeNN(pMem->db, pMem->zMalloc);
- memcpy(pMem, &t, sizeof(t));
- rc = ctx.isError;
- }
- return rc;
+ sqlite3_context ctx;
+ Mem t;
+ assert( pFunc!=0 );
+ assert( pFunc->xFinalize!=0 );
+ assert( (pMem->flags & MEM_Null)!=0 || pFunc==pMem->u.pDef );
+ assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
+ memset(&ctx, 0, sizeof(ctx));
+ memset(&t, 0, sizeof(t));
+ t.flags = MEM_Null;
+ t.db = pMem->db;
+ ctx.pOut = &t;
+ ctx.pMem = pMem;
+ ctx.pFunc = pFunc;
+ pFunc->xFinalize(&ctx); /* IMP: R-24505-23230 */
+ assert( (pMem->flags & MEM_Dyn)==0 );
+ if( pMem->szMalloc>0 ) sqlite3DbFreeNN(pMem->db, pMem->zMalloc);
+ memcpy(pMem, &t, sizeof(t));
+ return ctx.isError;
}
/*
@@ -70948,6 +73553,16 @@ SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem *pMem){
}
/*
+** Return 1 if pMem represents true, and return 0 if pMem represents false.
+** Return the value ifNull if pMem is NULL.
+*/
+SQLITE_PRIVATE int sqlite3VdbeBooleanValue(Mem *pMem, int ifNull){
+ if( pMem->flags & MEM_Int ) return pMem->u.i!=0;
+ if( pMem->flags & MEM_Null ) return ifNull;
+ return sqlite3VdbeRealValue(pMem)!=0.0;
+}
+
+/*
** The MEM structure is already a MEM_Real. Try to also make it a
** MEM_Int if we can.
*/
@@ -71002,6 +73617,18 @@ SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem *pMem){
return SQLITE_OK;
}
+/* Compare a floating point value to an integer. Return true if the two
+** values are the same within the precision of the floating point value.
+**
+** For some versions of GCC on 32-bit machines, if you do the more obvious
+** comparison of "r1==(double)i" you sometimes get an answer of false even
+** though the r1 and (double)i values are bit-for-bit the same.
+*/
+static int sqlite3RealSameAsInt(double r1, sqlite3_int64 i){
+ double r2 = (double)i;
+ return memcmp(&r1, &r2, sizeof(r1))==0;
+}
+
/*
** Convert pMem so that it has types MEM_Real or MEM_Int or both.
** Invalidate any prior representations.
@@ -71021,7 +73648,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem *pMem){
}else{
i64 i = pMem->u.i;
sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc);
- if( rc==1 && pMem->u.r==(double)i ){
+ if( rc==1 && sqlite3RealSameAsInt(pMem->u.r, i) ){
pMem->u.i = i;
MemSetTypeFlag(pMem, MEM_Int);
}else{
@@ -71153,7 +73780,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetInt64(Mem *pMem, i64 val){
}
/* A no-op destructor */
-static void sqlite3NoopDestructor(void *p){ UNUSED_PARAMETER(p); }
+SQLITE_PRIVATE void sqlite3NoopDestructor(void *p){ UNUSED_PARAMETER(p); }
/*
** Set the value stored in *pMem should already be a NULL.
@@ -71504,6 +74131,7 @@ static SQLITE_NOINLINE const void *valueToText(sqlite3_value* pVal, u8 enc){
assert(pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) || pVal->db==0
|| pVal->db->mallocFailed );
if( pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) ){
+ assert( sqlite3VdbeMemConsistentDualRep(pVal) );
return pVal->z;
}else{
return 0;
@@ -71526,6 +74154,7 @@ SQLITE_PRIVATE const void *sqlite3ValueText(sqlite3_value* pVal, u8 enc){
assert( (enc&3)==(enc&~SQLITE_UTF16_ALIGNED) );
assert( (pVal->flags & MEM_RowSet)==0 );
if( (pVal->flags&(MEM_Str|MEM_Term))==(MEM_Str|MEM_Term) && pVal->enc==enc ){
+ assert( sqlite3VdbeMemConsistentDualRep(pVal) );
return pVal->z;
}
if( pVal->flags&MEM_Null ){
@@ -71741,7 +74370,11 @@ static int valueFromExpr(
assert( pExpr!=0 );
while( (op = pExpr->op)==TK_UPLUS || op==TK_SPAN ) pExpr = pExpr->pLeft;
+#if defined(SQLITE_ENABLE_STAT3_OR_STAT4)
+ if( op==TK_REGISTER ) op = pExpr->op2;
+#else
if( NEVER(op==TK_REGISTER) ) op = pExpr->op2;
+#endif
/* Compressed expressions only appear when parsing the DEFAULT clause
** on a table column definition, and hence only when pCtx==0. This
@@ -71825,18 +74458,25 @@ static int valueFromExpr(
0, SQLITE_DYNAMIC);
}
#endif
-
#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
else if( op==TK_FUNCTION && pCtx!=0 ){
rc = valueFromFunction(db, pExpr, enc, affinity, &pVal, pCtx);
}
#endif
+ else if( op==TK_TRUEFALSE ){
+ pVal = valueNew(db, pCtx);
+ pVal->flags = MEM_Int;
+ pVal->u.i = pExpr->u.zToken[4]==0;
+ }
*ppVal = pVal;
return rc;
no_mem:
- sqlite3OomFault(db);
+#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+ if( pCtx==0 || pCtx->pParse->nErr==0 )
+#endif
+ sqlite3OomFault(db);
sqlite3DbFree(db, zVal);
assert( *ppVal==0 );
#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
@@ -72486,6 +75126,49 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp4Dup8(
return sqlite3VdbeAddOp4(p, op, p1, p2, p3, p4copy, p4type);
}
+#ifndef SQLITE_OMIT_EXPLAIN
+/*
+** Return the address of the current EXPLAIN QUERY PLAN baseline.
+** 0 means "none".
+*/
+SQLITE_PRIVATE int sqlite3VdbeExplainParent(Parse *pParse){
+ VdbeOp *pOp;
+ if( pParse->addrExplain==0 ) return 0;
+ pOp = sqlite3VdbeGetOp(pParse->pVdbe, pParse->addrExplain);
+ return pOp->p2;
+}
+
+/*
+** Add a new OP_Explain opcode.
+**
+** If the bPush flag is true, then make this opcode the parent for
+** subsequent Explains until sqlite3VdbeExplainPop() is called.
+*/
+SQLITE_PRIVATE void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt, ...){
+ if( pParse->explain==2 ){
+ char *zMsg;
+ Vdbe *v = pParse->pVdbe;
+ va_list ap;
+ int iThis;
+ va_start(ap, zFmt);
+ zMsg = sqlite3VMPrintf(pParse->db, zFmt, ap);
+ va_end(ap);
+ v = pParse->pVdbe;
+ iThis = v->nOp;
+ sqlite3VdbeAddOp4(v, OP_Explain, iThis, pParse->addrExplain, 0,
+ zMsg, P4_DYNAMIC);
+ if( bPush) pParse->addrExplain = iThis;
+ }
+}
+
+/*
+** Pop the EXPLAIN QUERY PLAN stack one level.
+*/
+SQLITE_PRIVATE void sqlite3VdbeExplainPop(Parse *pParse){
+ pParse->addrExplain = sqlite3VdbeExplainParent(pParse);
+}
+#endif /* SQLITE_OMIT_EXPLAIN */
+
/*
** Add an OP_ParseSchema opcode. This routine is broken out from
** sqlite3VdbeAddOp4() since it needs to also needs to mark all btrees
@@ -72575,10 +75258,29 @@ SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe *v, int x){
assert( j<p->nLabel );
assert( j>=0 );
if( p->aLabel ){
+#ifdef SQLITE_DEBUG
+ if( p->db->flags & SQLITE_VdbeAddopTrace ){
+ printf("RESOLVE LABEL %d to %d\n", x, v->nOp);
+ }
+#endif
+ assert( p->aLabel[j]==(-1) ); /* Labels may only be resolved once */
p->aLabel[j] = v->nOp;
}
}
+#ifdef SQLITE_COVERAGE_TEST
+/*
+** Return TRUE if and only if the label x has already been resolved.
+** Return FALSE (zero) if label x is still unresolved.
+**
+** This routine is only used inside of testcase() macros, and so it
+** only exists when measuring test coverage.
+*/
+SQLITE_PRIVATE int sqlite3VdbeLabelHasBeenResolved(Vdbe *v, int x){
+ return v->pParse->aLabel && v->pParse->aLabel[ADDR(x)]>=0;
+}
+#endif /* SQLITE_COVERAGE_TEST */
+
/*
** Mark the VDBE as one that can only be run one time.
*/
@@ -72724,6 +75426,32 @@ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){
}
#endif /* SQLITE_DEBUG - the sqlite3AssertMayAbort() function */
+#ifdef SQLITE_DEBUG
+/*
+** Increment the nWrite counter in the VDBE if the cursor is not an
+** ephemeral cursor, or if the cursor argument is NULL.
+*/
+SQLITE_PRIVATE void sqlite3VdbeIncrWriteCounter(Vdbe *p, VdbeCursor *pC){
+ if( pC==0
+ || (pC->eCurType!=CURTYPE_SORTER
+ && pC->eCurType!=CURTYPE_PSEUDO
+ && !pC->isEphemeral)
+ ){
+ p->nWrite++;
+ }
+}
+#endif
+
+#ifdef SQLITE_DEBUG
+/*
+** Assert if an Abort at this point in time might result in a corrupt
+** database.
+*/
+SQLITE_PRIVATE void sqlite3VdbeAssertAbortable(Vdbe *p){
+ assert( p->nWrite==0 || p->usesStmtJournal );
+}
+#endif
+
/*
** This routine is called after all opcodes have been inserted. It loops
** through all the opcodes and fixes up some details.
@@ -72884,6 +75612,17 @@ SQLITE_PRIVATE void sqlite3VdbeVerifyNoResultRow(Vdbe *p){
#endif
/*
+** Generate code (a single OP_Abortable opcode) that will
+** verify that the VDBE program can safely call Abort in the current
+** context.
+*/
+#if defined(SQLITE_DEBUG)
+SQLITE_PRIVATE void sqlite3VdbeVerifyAbortable(Vdbe *p, int onError){
+ if( onError==OE_Abort ) sqlite3VdbeAddOp0(p, OP_Abortable);
+}
+#endif
+
+/*
** This function returns a pointer to the array of opcodes associated with
** the Vdbe passed as the first argument. It is the callers responsibility
** to arrange for the returned array to be eventually freed using the
@@ -73049,6 +75788,7 @@ static void freeP4(sqlite3 *db, int p4type, void *p4){
case P4_REAL:
case P4_INT64:
case P4_DYNAMIC:
+ case P4_DYNBLOB:
case P4_INTARRAY: {
sqlite3DbFree(db, p4);
break;
@@ -73426,23 +76166,23 @@ static void displayP4Expr(StrAccum *p, Expr *pExpr){
const char *zOp = 0;
switch( pExpr->op ){
case TK_STRING:
- sqlite3XPrintf(p, "%Q", pExpr->u.zToken);
+ sqlite3_str_appendf(p, "%Q", pExpr->u.zToken);
break;
case TK_INTEGER:
- sqlite3XPrintf(p, "%d", pExpr->u.iValue);
+ sqlite3_str_appendf(p, "%d", pExpr->u.iValue);
break;
case TK_NULL:
- sqlite3XPrintf(p, "NULL");
+ sqlite3_str_appendf(p, "NULL");
break;
case TK_REGISTER: {
- sqlite3XPrintf(p, "r[%d]", pExpr->iTable);
+ sqlite3_str_appendf(p, "r[%d]", pExpr->iTable);
break;
}
case TK_COLUMN: {
if( pExpr->iColumn<0 ){
- sqlite3XPrintf(p, "rowid");
+ sqlite3_str_appendf(p, "rowid");
}else{
- sqlite3XPrintf(p, "c%d", (int)pExpr->iColumn);
+ sqlite3_str_appendf(p, "c%d", (int)pExpr->iColumn);
}
break;
}
@@ -73474,18 +76214,18 @@ static void displayP4Expr(StrAccum *p, Expr *pExpr){
case TK_NOTNULL: zOp = "NOTNULL"; break;
default:
- sqlite3XPrintf(p, "%s", "expr");
+ sqlite3_str_appendf(p, "%s", "expr");
break;
}
if( zOp ){
- sqlite3XPrintf(p, "%s(", zOp);
+ sqlite3_str_appendf(p, "%s(", zOp);
displayP4Expr(p, pExpr->pLeft);
if( pExpr->pRight ){
- sqlite3StrAccumAppend(p, ",", 1);
+ sqlite3_str_append(p, ",", 1);
displayP4Expr(p, pExpr->pRight);
}
- sqlite3StrAccumAppend(p, ")", 1);
+ sqlite3_str_append(p, ")", 1);
}
}
#endif /* VDBE_DISPLAY_P4 && defined(SQLITE_ENABLE_CURSOR_HINTS) */
@@ -73506,14 +76246,15 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){
int j;
KeyInfo *pKeyInfo = pOp->p4.pKeyInfo;
assert( pKeyInfo->aSortOrder!=0 );
- sqlite3XPrintf(&x, "k(%d", pKeyInfo->nKeyField);
+ sqlite3_str_appendf(&x, "k(%d", pKeyInfo->nKeyField);
for(j=0; j<pKeyInfo->nKeyField; j++){
CollSeq *pColl = pKeyInfo->aColl[j];
const char *zColl = pColl ? pColl->zName : "";
if( strcmp(zColl, "BINARY")==0 ) zColl = "B";
- sqlite3XPrintf(&x, ",%s%s", pKeyInfo->aSortOrder[j] ? "-" : "", zColl);
+ sqlite3_str_appendf(&x, ",%s%s",
+ pKeyInfo->aSortOrder[j] ? "-" : "", zColl);
}
- sqlite3StrAccumAppend(&x, ")", 1);
+ sqlite3_str_append(&x, ")", 1);
break;
}
#ifdef SQLITE_ENABLE_CURSOR_HINTS
@@ -73524,31 +76265,31 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){
#endif
case P4_COLLSEQ: {
CollSeq *pColl = pOp->p4.pColl;
- sqlite3XPrintf(&x, "(%.20s)", pColl->zName);
+ sqlite3_str_appendf(&x, "(%.20s)", pColl->zName);
break;
}
case P4_FUNCDEF: {
FuncDef *pDef = pOp->p4.pFunc;
- sqlite3XPrintf(&x, "%s(%d)", pDef->zName, pDef->nArg);
+ sqlite3_str_appendf(&x, "%s(%d)", pDef->zName, pDef->nArg);
break;
}
#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE)
case P4_FUNCCTX: {
FuncDef *pDef = pOp->p4.pCtx->pFunc;
- sqlite3XPrintf(&x, "%s(%d)", pDef->zName, pDef->nArg);
+ sqlite3_str_appendf(&x, "%s(%d)", pDef->zName, pDef->nArg);
break;
}
#endif
case P4_INT64: {
- sqlite3XPrintf(&x, "%lld", *pOp->p4.pI64);
+ sqlite3_str_appendf(&x, "%lld", *pOp->p4.pI64);
break;
}
case P4_INT32: {
- sqlite3XPrintf(&x, "%d", pOp->p4.i);
+ sqlite3_str_appendf(&x, "%d", pOp->p4.i);
break;
}
case P4_REAL: {
- sqlite3XPrintf(&x, "%.16g", *pOp->p4.pReal);
+ sqlite3_str_appendf(&x, "%.16g", *pOp->p4.pReal);
break;
}
case P4_MEM: {
@@ -73556,9 +76297,9 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){
if( pMem->flags & MEM_Str ){
zP4 = pMem->z;
}else if( pMem->flags & MEM_Int ){
- sqlite3XPrintf(&x, "%lld", pMem->u.i);
+ sqlite3_str_appendf(&x, "%lld", pMem->u.i);
}else if( pMem->flags & MEM_Real ){
- sqlite3XPrintf(&x, "%.16g", pMem->u.r);
+ sqlite3_str_appendf(&x, "%.16g", pMem->u.r);
}else if( pMem->flags & MEM_Null ){
zP4 = "NULL";
}else{
@@ -73570,7 +76311,7 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){
#ifndef SQLITE_OMIT_VIRTUALTABLE
case P4_VTAB: {
sqlite3_vtab *pVtab = pOp->p4.pVtab->pVtab;
- sqlite3XPrintf(&x, "vtab:%p", pVtab);
+ sqlite3_str_appendf(&x, "vtab:%p", pVtab);
break;
}
#endif
@@ -73580,22 +76321,23 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){
int n = ai[0]; /* The first element of an INTARRAY is always the
** count of the number of elements to follow */
for(i=1; i<=n; i++){
- sqlite3XPrintf(&x, ",%d", ai[i]);
+ sqlite3_str_appendf(&x, ",%d", ai[i]);
}
zTemp[0] = '[';
- sqlite3StrAccumAppend(&x, "]", 1);
+ sqlite3_str_append(&x, "]", 1);
break;
}
case P4_SUBPROGRAM: {
- sqlite3XPrintf(&x, "program");
+ sqlite3_str_appendf(&x, "program");
break;
}
+ case P4_DYNBLOB:
case P4_ADVANCE: {
zTemp[0] = 0;
break;
}
case P4_TABLE: {
- sqlite3XPrintf(&x, "%s", pOp->p4.pTab->zName);
+ sqlite3_str_appendf(&x, "%s", pOp->p4.pTab->zName);
break;
}
default: {
@@ -73807,6 +76549,9 @@ SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame *p){
** p->explain==2, only OP_Explain instructions are listed and these
** are shown in a different format. p->explain==2 is used to implement
** EXPLAIN QUERY PLAN.
+** 2018-04-24: In p->explain==2 mode, the OP_Init opcodes of triggers
+** are also shown, so that the boundaries between the main program and
+** each trigger are clear.
**
** When p->explain==1, first the main program is listed, then each of
** the trigger subprograms are listed one by one.
@@ -73822,6 +76567,8 @@ SQLITE_PRIVATE int sqlite3VdbeList(
int i; /* Loop counter */
int rc = SQLITE_OK; /* Return code */
Mem *pMem = &p->aMem[1]; /* First Mem of result set */
+ int bListSubprogs = (p->explain==1 || (db->flags & SQLITE_TriggerEQP)!=0);
+ Op *pOp = 0;
assert( p->explain );
assert( p->magic==VDBE_MAGIC_RUN );
@@ -73834,7 +76581,7 @@ SQLITE_PRIVATE int sqlite3VdbeList(
releaseMemArray(pMem, 8);
p->pResultSet = 0;
- if( p->rc==SQLITE_NOMEM_BKPT ){
+ if( p->rc==SQLITE_NOMEM ){
/* This happens if a malloc() inside a call to sqlite3_column_text() or
** sqlite3_column_text16() failed. */
sqlite3OomFault(db);
@@ -73849,7 +76596,7 @@ SQLITE_PRIVATE int sqlite3VdbeList(
** encountered, but p->pc will eventually catch up to nRow.
*/
nRow = p->nOp;
- if( p->explain==1 ){
+ if( bListSubprogs ){
/* The first 8 memory cells are used for the result set. So we will
** commandeer the 9th cell to use as storage for an array of pointers
** to trigger subprograms. The VDBE is guaranteed to have at least 9
@@ -73867,19 +76614,13 @@ SQLITE_PRIVATE int sqlite3VdbeList(
}
}
- do{
+ while(1){ /* Loop exits via break */
i = p->pc++;
- }while( i<nRow && p->explain==2 && p->aOp[i].opcode!=OP_Explain );
- if( i>=nRow ){
- p->rc = SQLITE_OK;
- rc = SQLITE_DONE;
- }else if( db->u1.isInterrupted ){
- p->rc = SQLITE_INTERRUPT;
- rc = SQLITE_ERROR;
- sqlite3VdbeError(p, sqlite3ErrStr(p->rc));
- }else{
- char *zP4;
- Op *pOp;
+ if( i>=nRow ){
+ p->rc = SQLITE_OK;
+ rc = SQLITE_DONE;
+ break;
+ }
if( i<p->nOp ){
/* The output line number is small enough that we are still in the
** main program. */
@@ -73894,94 +76635,113 @@ SQLITE_PRIVATE int sqlite3VdbeList(
}
pOp = &apSub[j]->aOp[i];
}
- if( p->explain==1 ){
- pMem->flags = MEM_Int;
- pMem->u.i = i; /* Program counter */
- pMem++;
-
- pMem->flags = MEM_Static|MEM_Str|MEM_Term;
- pMem->z = (char*)sqlite3OpcodeName(pOp->opcode); /* Opcode */
- assert( pMem->z!=0 );
- pMem->n = sqlite3Strlen30(pMem->z);
- pMem->enc = SQLITE_UTF8;
- pMem++;
- /* When an OP_Program opcode is encounter (the only opcode that has
- ** a P4_SUBPROGRAM argument), expand the size of the array of subprograms
- ** kept in p->aMem[9].z to hold the new program - assuming this subprogram
- ** has not already been seen.
- */
- if( pOp->p4type==P4_SUBPROGRAM ){
- int nByte = (nSub+1)*sizeof(SubProgram*);
- int j;
- for(j=0; j<nSub; j++){
- if( apSub[j]==pOp->p4.pProgram ) break;
- }
- if( j==nSub && SQLITE_OK==sqlite3VdbeMemGrow(pSub, nByte, nSub!=0) ){
- apSub = (SubProgram **)pSub->z;
- apSub[nSub++] = pOp->p4.pProgram;
- pSub->flags |= MEM_Blob;
- pSub->n = nSub*sizeof(SubProgram*);
+ /* When an OP_Program opcode is encounter (the only opcode that has
+ ** a P4_SUBPROGRAM argument), expand the size of the array of subprograms
+ ** kept in p->aMem[9].z to hold the new program - assuming this subprogram
+ ** has not already been seen.
+ */
+ if( bListSubprogs && pOp->p4type==P4_SUBPROGRAM ){
+ int nByte = (nSub+1)*sizeof(SubProgram*);
+ int j;
+ for(j=0; j<nSub; j++){
+ if( apSub[j]==pOp->p4.pProgram ) break;
+ }
+ if( j==nSub ){
+ p->rc = sqlite3VdbeMemGrow(pSub, nByte, nSub!=0);
+ if( p->rc!=SQLITE_OK ){
+ rc = SQLITE_ERROR;
+ break;
}
+ apSub = (SubProgram **)pSub->z;
+ apSub[nSub++] = pOp->p4.pProgram;
+ pSub->flags |= MEM_Blob;
+ pSub->n = nSub*sizeof(SubProgram*);
+ nRow += pOp->p4.pProgram->nOp;
}
}
+ if( p->explain<2 ) break;
+ if( pOp->opcode==OP_Explain ) break;
+ if( pOp->opcode==OP_Init && p->pc>1 ) break;
+ }
- pMem->flags = MEM_Int;
- pMem->u.i = pOp->p1; /* P1 */
- pMem++;
+ if( rc==SQLITE_OK ){
+ if( db->u1.isInterrupted ){
+ p->rc = SQLITE_INTERRUPT;
+ rc = SQLITE_ERROR;
+ sqlite3VdbeError(p, sqlite3ErrStr(p->rc));
+ }else{
+ char *zP4;
+ if( p->explain==1 ){
+ pMem->flags = MEM_Int;
+ pMem->u.i = i; /* Program counter */
+ pMem++;
+
+ pMem->flags = MEM_Static|MEM_Str|MEM_Term;
+ pMem->z = (char*)sqlite3OpcodeName(pOp->opcode); /* Opcode */
+ assert( pMem->z!=0 );
+ pMem->n = sqlite3Strlen30(pMem->z);
+ pMem->enc = SQLITE_UTF8;
+ pMem++;
+ }
- pMem->flags = MEM_Int;
- pMem->u.i = pOp->p2; /* P2 */
- pMem++;
+ pMem->flags = MEM_Int;
+ pMem->u.i = pOp->p1; /* P1 */
+ pMem++;
- pMem->flags = MEM_Int;
- pMem->u.i = pOp->p3; /* P3 */
- pMem++;
+ pMem->flags = MEM_Int;
+ pMem->u.i = pOp->p2; /* P2 */
+ pMem++;
- if( sqlite3VdbeMemClearAndResize(pMem, 100) ){ /* P4 */
- assert( p->db->mallocFailed );
- return SQLITE_ERROR;
- }
- pMem->flags = MEM_Str|MEM_Term;
- zP4 = displayP4(pOp, pMem->z, pMem->szMalloc);
- if( zP4!=pMem->z ){
- pMem->n = 0;
- sqlite3VdbeMemSetStr(pMem, zP4, -1, SQLITE_UTF8, 0);
- }else{
- assert( pMem->z!=0 );
- pMem->n = sqlite3Strlen30(pMem->z);
- pMem->enc = SQLITE_UTF8;
- }
- pMem++;
+ pMem->flags = MEM_Int;
+ pMem->u.i = pOp->p3; /* P3 */
+ pMem++;
- if( p->explain==1 ){
- if( sqlite3VdbeMemClearAndResize(pMem, 4) ){
+ if( sqlite3VdbeMemClearAndResize(pMem, 100) ){ /* P4 */
assert( p->db->mallocFailed );
return SQLITE_ERROR;
}
pMem->flags = MEM_Str|MEM_Term;
- pMem->n = 2;
- sqlite3_snprintf(3, pMem->z, "%.2x", pOp->p5); /* P5 */
- pMem->enc = SQLITE_UTF8;
+ zP4 = displayP4(pOp, pMem->z, pMem->szMalloc);
+ if( zP4!=pMem->z ){
+ pMem->n = 0;
+ sqlite3VdbeMemSetStr(pMem, zP4, -1, SQLITE_UTF8, 0);
+ }else{
+ assert( pMem->z!=0 );
+ pMem->n = sqlite3Strlen30(pMem->z);
+ pMem->enc = SQLITE_UTF8;
+ }
pMem++;
-
+
+ if( p->explain==1 ){
+ if( sqlite3VdbeMemClearAndResize(pMem, 4) ){
+ assert( p->db->mallocFailed );
+ return SQLITE_ERROR;
+ }
+ pMem->flags = MEM_Str|MEM_Term;
+ pMem->n = 2;
+ sqlite3_snprintf(3, pMem->z, "%.2x", pOp->p5); /* P5 */
+ pMem->enc = SQLITE_UTF8;
+ pMem++;
+
#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS
- if( sqlite3VdbeMemClearAndResize(pMem, 500) ){
- assert( p->db->mallocFailed );
- return SQLITE_ERROR;
- }
- pMem->flags = MEM_Str|MEM_Term;
- pMem->n = displayComment(pOp, zP4, pMem->z, 500);
- pMem->enc = SQLITE_UTF8;
+ if( sqlite3VdbeMemClearAndResize(pMem, 500) ){
+ assert( p->db->mallocFailed );
+ return SQLITE_ERROR;
+ }
+ pMem->flags = MEM_Str|MEM_Term;
+ pMem->n = displayComment(pOp, zP4, pMem->z, 500);
+ pMem->enc = SQLITE_UTF8;
#else
- pMem->flags = MEM_Null; /* Comment */
+ pMem->flags = MEM_Null; /* Comment */
#endif
- }
+ }
- p->nResColumn = 8 - 4*(p->explain-1);
- p->pResultSet = &p->aMem[1];
- p->rc = SQLITE_OK;
- rc = SQLITE_ROW;
+ p->nResColumn = 8 - 4*(p->explain-1);
+ p->pResultSet = &p->aMem[1];
+ p->rc = SQLITE_OK;
+ rc = SQLITE_ROW;
+ }
}
return rc;
}
@@ -74451,6 +77211,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){
pPager = sqlite3BtreePager(pBt);
if( db->aDb[i].safety_level!=PAGER_SYNCHRONOUS_OFF
&& aMJNeeded[sqlite3PagerGetJournalMode(pPager)]
+ && sqlite3PagerIsMemdb(pPager)==0
){
assert( i!=1 );
nTrans++;
@@ -75094,6 +77855,9 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){
sqlite3DbFree(db, p->zErrMsg);
p->zErrMsg = 0;
p->pResultSet = 0;
+#ifdef SQLITE_DEBUG
+ p->nWrite = 0;
+#endif
/* Save profiling information from this VDBE run.
*/
@@ -75226,7 +77990,7 @@ SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){
SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe *p){
sqlite3 *db;
- if( NEVER(p==0) ) return;
+ assert( p!=0 );
db = p->db;
assert( sqlite3_mutex_held(db->mutex) );
sqlite3VdbeClearObject(db, p);
@@ -75622,7 +78386,13 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(
Mem *pMem /* Memory cell to write value into */
){
switch( serial_type ){
- case 10: /* Reserved for future use */
+ case 10: { /* Internal use only: NULL with virtual table
+ ** UPDATE no-change flag set */
+ pMem->flags = MEM_Null|MEM_Zero;
+ pMem->n = 0;
+ pMem->u.nZero = 0;
+ break;
+ }
case 11: /* Reserved for future use */
case 0: { /* Null */
/* EVIDENCE-OF: R-24078-09375 Value is a NULL. */
@@ -76010,13 +78780,10 @@ static int sqlite3IntFloatCompare(i64 i, double r){
i64 y;
double s;
if( r<-9223372036854775808.0 ) return +1;
- if( r>9223372036854775807.0 ) return -1;
+ if( r>=9223372036854775808.0 ) return -1;
y = (i64)r;
if( i<y ) return -1;
- if( i>y ){
- if( y==SMALLEST_INT64 && r>0.0 ) return -1;
- return +1;
- }
+ if( i>y ) return +1;
s = (double)i;
if( s<r ) return -1;
if( s>r ) return +1;
@@ -77175,6 +79942,11 @@ SQLITE_API int sqlite3_value_type(sqlite3_value* pVal){
return aType[pVal->flags&MEM_AffMask];
}
+/* Return true if a parameter to xUpdate represents an unchanged column */
+SQLITE_API int sqlite3_value_nochange(sqlite3_value *pVal){
+ return (pVal->flags&(MEM_Null|MEM_Zero))==(MEM_Null|MEM_Zero);
+}
+
/* Make a copy of an sqlite3_value object
*/
SQLITE_API sqlite3_value *sqlite3_value_dup(const sqlite3_value *pOrig){
@@ -77274,14 +80046,12 @@ SQLITE_API void sqlite3_result_double(sqlite3_context *pCtx, double rVal){
SQLITE_API void sqlite3_result_error(sqlite3_context *pCtx, const char *z, int n){
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
pCtx->isError = SQLITE_ERROR;
- pCtx->fErrorOrAux = 1;
sqlite3VdbeMemSetStr(pCtx->pOut, z, n, SQLITE_UTF8, SQLITE_TRANSIENT);
}
#ifndef SQLITE_OMIT_UTF16
SQLITE_API void sqlite3_result_error16(sqlite3_context *pCtx, const void *z, int n){
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
pCtx->isError = SQLITE_ERROR;
- pCtx->fErrorOrAux = 1;
sqlite3VdbeMemSetStr(pCtx->pOut, z, n, SQLITE_UTF16NATIVE, SQLITE_TRANSIENT);
}
#endif
@@ -77387,8 +80157,7 @@ SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context *pCtx, u64 n){
return SQLITE_OK;
}
SQLITE_API void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){
- pCtx->isError = errCode;
- pCtx->fErrorOrAux = 1;
+ pCtx->isError = errCode ? errCode : -1;
#ifdef SQLITE_DEBUG
if( pCtx->pVdbe ) pCtx->pVdbe->rcApp = errCode;
#endif
@@ -77402,7 +80171,6 @@ SQLITE_API void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){
SQLITE_API void sqlite3_result_error_toobig(sqlite3_context *pCtx){
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
pCtx->isError = SQLITE_TOOBIG;
- pCtx->fErrorOrAux = 1;
sqlite3VdbeMemSetStr(pCtx->pOut, "string or blob too big", -1,
SQLITE_UTF8, SQLITE_STATIC);
}
@@ -77412,7 +80180,6 @@ SQLITE_API void sqlite3_result_error_nomem(sqlite3_context *pCtx){
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
sqlite3VdbeMemSetNull(pCtx->pOut);
pCtx->isError = SQLITE_NOMEM_BKPT;
- pCtx->fErrorOrAux = 1;
sqlite3OomFault(pCtx->pOut->db);
}
@@ -77653,6 +80420,25 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context *p){
}
/*
+** If this routine is invoked from within an xColumn method of a virtual
+** table, then it returns true if and only if the the call is during an
+** UPDATE operation and the value of the column will not be modified
+** by the UPDATE.
+**
+** If this routine is called from any context other than within the
+** xColumn method of a virtual table, then the return value is meaningless
+** and arbitrary.
+**
+** Virtual table implements might use this routine to optimize their
+** performance by substituting a NULL result, or some other light-weight
+** value, as a signal to the xUpdate routine that the column is unchanged.
+*/
+SQLITE_API int sqlite3_vtab_nochange(sqlite3_context *p){
+ assert( p );
+ return sqlite3_value_nochange(p->pOut);
+}
+
+/*
** Return the current time for a statement. If the current time
** is requested more than once within the same run of a single prepared
** statement, the exact same time is returned for each invocation regardless
@@ -77676,28 +80462,6 @@ SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context *p){
}
/*
-** The following is the implementation of an SQL function that always
-** fails with an error message stating that the function is used in the
-** wrong context. The sqlite3_overload_function() API might construct
-** SQL function that use this routine so that the functions will exist
-** for name resolution but are actually overloaded by the xFindFunction
-** method of virtual tables.
-*/
-SQLITE_PRIVATE void sqlite3InvalidFunction(
- sqlite3_context *context, /* The function calling context */
- int NotUsed, /* Number of arguments to the function */
- sqlite3_value **NotUsed2 /* Value of each argument */
-){
- const char *zName = context->pFunc->zName;
- char *zErr;
- UNUSED_PARAMETER2(NotUsed, NotUsed2);
- zErr = sqlite3_mprintf(
- "unable to use function %s in the requested context", zName);
- sqlite3_result_error(context, zErr, -1);
- sqlite3_free(zErr);
-}
-
-/*
** Create a new aggregate context for p and return a pointer to
** its pMem->z element.
*/
@@ -77800,10 +80564,7 @@ SQLITE_API void sqlite3_set_auxdata(
pAuxData->iAuxArg = iArg;
pAuxData->pNextAux = pVdbe->pAuxData;
pVdbe->pAuxData = pAuxData;
- if( pCtx->fErrorOrAux==0 ){
- pCtx->isError = 0;
- pCtx->fErrorOrAux = 1;
- }
+ if( pCtx->isError==0 ) pCtx->isError = -1;
}else if( pAuxData->xDeleteAux ){
pAuxData->xDeleteAux(pAuxData->pAux);
}
@@ -78559,7 +81320,9 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt *pStmt, int op, int resetFlag){
Vdbe *pVdbe = (Vdbe*)pStmt;
u32 v;
#ifdef SQLITE_ENABLE_API_ARMOR
- if( !pStmt ){
+ if( !pStmt
+ || (op!=SQLITE_STMTSTATUS_MEMUSED && (op<0||op>=ArraySize(pVdbe->aCounter)))
+ ){
(void)SQLITE_MISUSE_BKPT;
return 0;
}
@@ -78965,17 +81728,17 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql(
while( *zRawSql ){
const char *zStart = zRawSql;
while( *(zRawSql++)!='\n' && *zRawSql );
- sqlite3StrAccumAppend(&out, "-- ", 3);
+ sqlite3_str_append(&out, "-- ", 3);
assert( (zRawSql - zStart) > 0 );
- sqlite3StrAccumAppend(&out, zStart, (int)(zRawSql-zStart));
+ sqlite3_str_append(&out, zStart, (int)(zRawSql-zStart));
}
}else if( p->nVar==0 ){
- sqlite3StrAccumAppend(&out, zRawSql, sqlite3Strlen30(zRawSql));
+ sqlite3_str_append(&out, zRawSql, sqlite3Strlen30(zRawSql));
}else{
while( zRawSql[0] ){
n = findNextHostParameter(zRawSql, &nToken);
assert( n>0 );
- sqlite3StrAccumAppend(&out, zRawSql, n);
+ sqlite3_str_append(&out, zRawSql, n);
zRawSql += n;
assert( zRawSql[0] || nToken==0 );
if( nToken==0 ) break;
@@ -79001,11 +81764,11 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql(
assert( idx>0 && idx<=p->nVar );
pVar = &p->aVar[idx-1];
if( pVar->flags & MEM_Null ){
- sqlite3StrAccumAppend(&out, "NULL", 4);
+ sqlite3_str_append(&out, "NULL", 4);
}else if( pVar->flags & MEM_Int ){
- sqlite3XPrintf(&out, "%lld", pVar->u.i);
+ sqlite3_str_appendf(&out, "%lld", pVar->u.i);
}else if( pVar->flags & MEM_Real ){
- sqlite3XPrintf(&out, "%!.15g", pVar->u.r);
+ sqlite3_str_appendf(&out, "%!.15g", pVar->u.r);
}else if( pVar->flags & MEM_Str ){
int nOut; /* Number of bytes of the string text to include in output */
#ifndef SQLITE_OMIT_UTF16
@@ -79015,7 +81778,7 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql(
utf8.db = db;
sqlite3VdbeMemSetStr(&utf8, pVar->z, pVar->n, enc, SQLITE_STATIC);
if( SQLITE_NOMEM==sqlite3VdbeChangeEncoding(&utf8, SQLITE_UTF8) ){
- out.accError = STRACCUM_NOMEM;
+ out.accError = SQLITE_NOMEM;
out.nAlloc = 0;
}
pVar = &utf8;
@@ -79028,38 +81791,38 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql(
while( nOut<pVar->n && (pVar->z[nOut]&0xc0)==0x80 ){ nOut++; }
}
#endif
- sqlite3XPrintf(&out, "'%.*q'", nOut, pVar->z);
+ sqlite3_str_appendf(&out, "'%.*q'", nOut, pVar->z);
#ifdef SQLITE_TRACE_SIZE_LIMIT
if( nOut<pVar->n ){
- sqlite3XPrintf(&out, "/*+%d bytes*/", pVar->n-nOut);
+ sqlite3_str_appendf(&out, "/*+%d bytes*/", pVar->n-nOut);
}
#endif
#ifndef SQLITE_OMIT_UTF16
if( enc!=SQLITE_UTF8 ) sqlite3VdbeMemRelease(&utf8);
#endif
}else if( pVar->flags & MEM_Zero ){
- sqlite3XPrintf(&out, "zeroblob(%d)", pVar->u.nZero);
+ sqlite3_str_appendf(&out, "zeroblob(%d)", pVar->u.nZero);
}else{
int nOut; /* Number of bytes of the blob to include in output */
assert( pVar->flags & MEM_Blob );
- sqlite3StrAccumAppend(&out, "x'", 2);
+ sqlite3_str_append(&out, "x'", 2);
nOut = pVar->n;
#ifdef SQLITE_TRACE_SIZE_LIMIT
if( nOut>SQLITE_TRACE_SIZE_LIMIT ) nOut = SQLITE_TRACE_SIZE_LIMIT;
#endif
for(i=0; i<nOut; i++){
- sqlite3XPrintf(&out, "%02x", pVar->z[i]&0xff);
+ sqlite3_str_appendf(&out, "%02x", pVar->z[i]&0xff);
}
- sqlite3StrAccumAppend(&out, "'", 1);
+ sqlite3_str_append(&out, "'", 1);
#ifdef SQLITE_TRACE_SIZE_LIMIT
if( nOut<pVar->n ){
- sqlite3XPrintf(&out, "/*+%d bytes*/", pVar->n-nOut);
+ sqlite3_str_appendf(&out, "/*+%d bytes*/", pVar->n-nOut);
}
#endif
}
}
}
- if( out.accError ) sqlite3StrAccumReset(&out);
+ if( out.accError ) sqlite3_str_reset(&out);
return sqlite3StrAccumFinish(&out);
}
@@ -79333,6 +82096,11 @@ static void applyNumericAffinity(Mem *pRec, int bTryForInt){
pRec->flags |= MEM_Real;
if( bTryForInt ) sqlite3VdbeIntegerAffinity(pRec);
}
+ /* TEXT->NUMERIC is many->one. Hence, it is important to invalidate the
+ ** string representation after computing a numeric equivalent, because the
+ ** string representation might not be the canonical representation for the
+ ** numeric value. Ticket [343634942dd54ab57b7024] 2018-01-31. */
+ pRec->flags &= ~MEM_Str;
}
/*
@@ -79533,7 +82301,7 @@ static void memTracePrint(Mem *p){
if( p->flags & MEM_Undefined ){
printf(" undefined");
}else if( p->flags & MEM_Null ){
- printf(" NULL");
+ printf(p->flags & MEM_Zero ? " NULL-nochng" : " NULL");
}else if( (p->flags & (MEM_Int|MEM_Str))==(MEM_Int|MEM_Str) ){
printf(" si:%lld", p->u.i);
}else if( p->flags & MEM_Int ){
@@ -79801,7 +82569,7 @@ SQLITE_PRIVATE int sqlite3VdbeExec(
assert( pOp>=aOp && pOp<&aOp[p->nOp]);
#ifdef VDBE_PROFILE
- start = sqlite3Hwtime();
+ start = sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime();
#endif
nVmStep++;
#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
@@ -80068,6 +82836,9 @@ case OP_Yield: { /* in1, jump */
*/
case OP_HaltIfNull: { /* in3 */
pIn3 = &aMem[pOp->p3];
+#ifdef SQLITE_DEBUG
+ if( pOp->p2==OE_Abort ){ sqlite3VdbeAssertAbortable(p); }
+#endif
if( (pIn3->flags & MEM_Null)==0 ) break;
/* Fall through into OP_Halt */
}
@@ -80107,6 +82878,9 @@ case OP_Halt: {
int pcx;
pcx = (int)(pOp - aOp);
+#ifdef SQLITE_DEBUG
+ if( pOp->p2==OE_Abort ){ sqlite3VdbeAssertAbortable(p); }
+#endif
if( pOp->p1==SQLITE_OK && p->pFrame ){
/* Halt the sub-program. Return control to the parent frame. */
pFrame = p->pFrame;
@@ -81325,18 +84099,8 @@ case OP_Or: { /* same as TK_OR, in1, in2, out3 */
int v1; /* Left operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */
int v2; /* Right operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */
- pIn1 = &aMem[pOp->p1];
- if( pIn1->flags & MEM_Null ){
- v1 = 2;
- }else{
- v1 = sqlite3VdbeIntValue(pIn1)!=0;
- }
- pIn2 = &aMem[pOp->p2];
- if( pIn2->flags & MEM_Null ){
- v2 = 2;
- }else{
- v2 = sqlite3VdbeIntValue(pIn2)!=0;
- }
+ v1 = sqlite3VdbeBooleanValue(&aMem[pOp->p1], 2);
+ v2 = sqlite3VdbeBooleanValue(&aMem[pOp->p2], 2);
if( pOp->opcode==OP_And ){
static const unsigned char and_logic[] = { 0, 0, 0, 0, 1, 2, 0, 2, 2 };
v1 = and_logic[v1*3+v2];
@@ -81354,6 +84118,35 @@ case OP_Or: { /* same as TK_OR, in1, in2, out3 */
break;
}
+/* Opcode: IsTrue P1 P2 P3 P4 *
+** Synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4
+**
+** This opcode implements the IS TRUE, IS FALSE, IS NOT TRUE, and
+** IS NOT FALSE operators.
+**
+** Interpret the value in register P1 as a boolean value. Store that
+** boolean (a 0 or 1) in register P2. Or if the value in register P1 is
+** NULL, then the P3 is stored in register P2. Invert the answer if P4
+** is 1.
+**
+** The logic is summarized like this:
+**
+** <ul>
+** <li> If P3==0 and P4==0 then r[P2] := r[P1] IS TRUE
+** <li> If P3==1 and P4==1 then r[P2] := r[P1] IS FALSE
+** <li> If P3==0 and P4==1 then r[P2] := r[P1] IS NOT TRUE
+** <li> If P3==1 and P4==0 then r[P2] := r[P1] IS NOT FALSE
+** </ul>
+*/
+case OP_IsTrue: { /* in1, out2 */
+ assert( pOp->p4type==P4_INT32 );
+ assert( pOp->p4.i==0 || pOp->p4.i==1 );
+ assert( pOp->p3==0 || pOp->p3==1 );
+ sqlite3VdbeMemSetInt64(&aMem[pOp->p2],
+ sqlite3VdbeBooleanValue(&aMem[pOp->p1], pOp->p3) ^ pOp->p4.i);
+ break;
+}
+
/* Opcode: Not P1 P2 * * *
** Synopsis: r[P2]= !r[P1]
**
@@ -81364,10 +84157,10 @@ case OP_Or: { /* same as TK_OR, in1, in2, out3 */
case OP_Not: { /* same as TK_NOT, in1, out2 */
pIn1 = &aMem[pOp->p1];
pOut = &aMem[pOp->p2];
- sqlite3VdbeMemSetNull(pOut);
if( (pIn1->flags & MEM_Null)==0 ){
- pOut->flags = MEM_Int;
- pOut->u.i = !sqlite3VdbeIntValue(pIn1);
+ sqlite3VdbeMemSetInt64(pOut, !sqlite3VdbeBooleanValue(pIn1,0));
+ }else{
+ sqlite3VdbeMemSetNull(pOut);
}
break;
}
@@ -81434,30 +84227,25 @@ case OP_Once: { /* jump */
** is considered true if it is numeric and non-zero. If the value
** in P1 is NULL then take the jump if and only if P3 is non-zero.
*/
+case OP_If: { /* jump, in1 */
+ int c;
+ c = sqlite3VdbeBooleanValue(&aMem[pOp->p1], pOp->p3);
+ VdbeBranchTaken(c!=0, 2);
+ if( c ) goto jump_to_p2;
+ break;
+}
+
/* Opcode: IfNot P1 P2 P3 * *
**
** Jump to P2 if the value in register P1 is False. The value
** is considered false if it has a numeric value of zero. If the value
** in P1 is NULL then take the jump if and only if P3 is non-zero.
*/
-case OP_If: /* jump, in1 */
case OP_IfNot: { /* jump, in1 */
int c;
- pIn1 = &aMem[pOp->p1];
- if( pIn1->flags & MEM_Null ){
- c = pOp->p3;
- }else{
-#ifdef SQLITE_OMIT_FLOATING_POINT
- c = sqlite3VdbeIntValue(pIn1)!=0;
-#else
- c = sqlite3VdbeRealValue(pIn1)!=0.0;
-#endif
- if( pOp->opcode==OP_IfNot ) c = !c;
- }
+ c = !sqlite3VdbeBooleanValue(&aMem[pOp->p1], !pOp->p3);
VdbeBranchTaken(c!=0, 2);
- if( c ){
- goto jump_to_p2;
- }
+ if( c ) goto jump_to_p2;
break;
}
@@ -81507,6 +84295,36 @@ case OP_IfNullRow: { /* jump */
break;
}
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+/* Opcode: Offset P1 P2 P3 * *
+** Synopsis: r[P3] = sqlite_offset(P1)
+**
+** Store in register r[P3] the byte offset into the database file that is the
+** start of the payload for the record at which that cursor P1 is currently
+** pointing.
+**
+** P2 is the column number for the argument to the sqlite_offset() function.
+** This opcode does not use P2 itself, but the P2 value is used by the
+** code generator. The P1, P2, and P3 operands to this opcode are the
+** same as for OP_Column.
+**
+** This opcode is only available if SQLite is compiled with the
+** -DSQLITE_ENABLE_OFFSET_SQL_FUNC option.
+*/
+case OP_Offset: { /* out3 */
+ VdbeCursor *pC; /* The VDBE cursor */
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ pC = p->apCsr[pOp->p1];
+ pOut = &p->aMem[pOp->p3];
+ if( NEVER(pC==0) || pC->eCurType!=CURTYPE_BTREE ){
+ sqlite3VdbeMemSetNull(pOut);
+ }else{
+ sqlite3VdbeMemSetInt64(pOut, sqlite3BtreeOffset(pC->uc.pCursor));
+ }
+ break;
+}
+#endif /* SQLITE_ENABLE_OFFSET_SQL_FUNC */
+
/* Opcode: Column P1 P2 P3 P4 P5
** Synopsis: r[P3]=PX
**
@@ -81920,9 +84738,18 @@ case OP_MakeRecord: {
pRec = pLast;
do{
assert( memIsValid(pRec) );
- pRec->uTemp = serial_type = sqlite3VdbeSerialType(pRec, file_format, &len);
+ serial_type = sqlite3VdbeSerialType(pRec, file_format, &len);
if( pRec->flags & MEM_Zero ){
- if( nData ){
+ if( serial_type==0 ){
+ /* Values with MEM_Null and MEM_Zero are created by xColumn virtual
+ ** table methods that never invoke sqlite3_result_xxxxx() while
+ ** computing an unchanging column value in an UPDATE statement.
+ ** Give such values a special internal-use-only serial-type of 10
+ ** so that they can be passed through to xUpdate and have
+ ** a true sqlite3_value_nochange(). */
+ assert( pOp->p5==OPFLAG_NOCHNG_MAGIC || CORRUPT_DB );
+ serial_type = 10;
+ }else if( nData ){
if( sqlite3VdbeMemExpandBlob(pRec) ) goto no_mem;
}else{
nZero += pRec->u.nZero;
@@ -81933,6 +84760,7 @@ case OP_MakeRecord: {
testcase( serial_type==127 );
testcase( serial_type==128 );
nHdr += serial_type<=127 ? 1 : sqlite3VarintLen(serial_type);
+ pRec->uTemp = serial_type;
if( pRec==pData0 ) break;
pRec--;
}while(1);
@@ -82423,6 +85251,8 @@ case OP_ReadCookie: { /* out2 */
*/
case OP_SetCookie: {
Db *pDb;
+
+ sqlite3VdbeIncrWriteCounter(p, 0);
assert( pOp->p2<SQLITE_N_BTREE_META );
assert( pOp->p1>=0 && pOp->p1<db->nDb );
assert( DbMaskTest(p->btreeMask, pOp->p1) );
@@ -83387,6 +86217,7 @@ case OP_NewRowid: { /* out2 */
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
pC = p->apCsr[pOp->p1];
assert( pC!=0 );
+ assert( pC->isTable );
assert( pC->eCurType==CURTYPE_BTREE );
assert( pC->uc.pCursor!=0 );
{
@@ -83543,10 +86374,8 @@ case OP_InsertInt: {
int seekResult; /* Result of prior seek or 0 if no USESEEKRESULT flag */
const char *zDb; /* database name - used by the update hook */
Table *pTab; /* Table structure - used by update and pre-update hooks */
- int op; /* Opcode for update hook: SQLITE_UPDATE or SQLITE_INSERT */
BtreePayload x; /* Payload to be inserted */
- op = 0;
pData = &aMem[pOp->p2];
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
assert( memIsValid(pData) );
@@ -83557,6 +86386,7 @@ case OP_InsertInt: {
assert( (pOp->p5 & OPFLAG_ISNOOP) || pC->isTable );
assert( pOp->p4type==P4_TABLE || pOp->p4type>=P4_STATIC );
REGISTER_TRACE(pOp->p2, pData);
+ sqlite3VdbeIncrWriteCounter(p, pC);
if( pOp->opcode==OP_Insert ){
pKey = &aMem[pOp->p3];
@@ -83574,19 +86404,21 @@ case OP_InsertInt: {
zDb = db->aDb[pC->iDb].zDbSName;
pTab = pOp->p4.pTab;
assert( (pOp->p5 & OPFLAG_ISNOOP) || HasRowid(pTab) );
- op = ((pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT);
}else{
- pTab = 0; /* Not needed. Silence a compiler warning. */
+ pTab = 0;
zDb = 0; /* Not needed. Silence a compiler warning. */
}
#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
/* Invoke the pre-update hook, if any */
- if( db->xPreUpdateCallback
- && pOp->p4type==P4_TABLE
- && !(pOp->p5 & OPFLAG_ISUPDATE)
- ){
- sqlite3VdbePreUpdateHook(p, pC, SQLITE_INSERT, zDb, pTab, x.nKey, pOp->p2);
+ if( pTab ){
+ if( db->xPreUpdateCallback && !(pOp->p5 & OPFLAG_ISUPDATE) ){
+ sqlite3VdbePreUpdateHook(p, pC, SQLITE_INSERT, zDb, pTab, x.nKey,pOp->p2);
+ }
+ if( db->xUpdateCallback==0 || pTab->aCol==0 ){
+ /* Prevent post-update hook from running in cases when it should not */
+ pTab = 0;
+ }
}
if( pOp->p5 & OPFLAG_ISNOOP ) break;
#endif
@@ -83611,8 +86443,12 @@ case OP_InsertInt: {
/* Invoke the update-hook if required. */
if( rc ) goto abort_due_to_error;
- if( db->xUpdateCallback && op ){
- db->xUpdateCallback(db->pUpdateArg, op, zDb, pTab->zName, x.nKey);
+ if( pTab ){
+ assert( db->xUpdateCallback!=0 );
+ assert( pTab->aCol!=0 );
+ db->xUpdateCallback(db->pUpdateArg,
+ (pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT,
+ zDb, pTab->zName, x.nKey);
}
break;
}
@@ -83665,6 +86501,7 @@ case OP_Delete: {
assert( pC->eCurType==CURTYPE_BTREE );
assert( pC->uc.pCursor!=0 );
assert( pC->deferredMoveto==0 );
+ sqlite3VdbeIncrWriteCounter(p, pC);
#ifdef SQLITE_DEBUG
if( pOp->p4type==P4_TABLE && HasRowid(pOp->p4.pTab) && pOp->p5==0 ){
@@ -83833,10 +86670,10 @@ case OP_SorterData: {
** If the P1 cursor must be pointing to a valid row (not a NULL row)
** of a real table, not a pseudo-table.
**
-** If P3!=0 then this opcode is allowed to make an ephermeral pointer
+** If P3!=0 then this opcode is allowed to make an ephemeral pointer
** into the database page. That means that the content of the output
** register will be invalidated as soon as the cursor moves - including
-** moves caused by other cursors that "save" the the current cursors
+** moves caused by other cursors that "save" the current cursors
** position in order that they can write to the same table. If P3==0
** then a copy of the data is made into memory. P3!=0 is faster, but
** P3==0 is safer.
@@ -84283,6 +87120,7 @@ case OP_IdxInsert: { /* in2 */
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
pC = p->apCsr[pOp->p1];
+ sqlite3VdbeIncrWriteCounter(p, pC);
assert( pC!=0 );
assert( isSorter(pC)==(pOp->opcode==OP_SorterInsert) );
pIn2 = &aMem[pOp->p2];
@@ -84329,6 +87167,7 @@ case OP_IdxDelete: {
pC = p->apCsr[pOp->p1];
assert( pC!=0 );
assert( pC->eCurType==CURTYPE_BTREE );
+ sqlite3VdbeIncrWriteCounter(p, pC);
pCrsr = pC->uc.pCursor;
assert( pCrsr!=0 );
assert( pOp->p5==0 );
@@ -84551,6 +87390,7 @@ case OP_Destroy: { /* out2 */
int iMoved;
int iDb;
+ sqlite3VdbeIncrWriteCounter(p, 0);
assert( p->readOnly==0 );
assert( pOp->p1>1 );
pOut = out2Prerelease(p, pOp);
@@ -84600,6 +87440,7 @@ case OP_Destroy: { /* out2 */
case OP_Clear: {
int nChange;
+ sqlite3VdbeIncrWriteCounter(p, 0);
nChange = 0;
assert( p->readOnly==0 );
assert( DbMaskTest(p->btreeMask, pOp->p2) );
@@ -84649,13 +87490,14 @@ case OP_ResetSorter: {
** Allocate a new b-tree in the main database file if P1==0 or in the
** TEMP database file if P1==1 or in an attached database if
** P1>1. The P3 argument must be 1 (BTREE_INTKEY) for a rowid table
-** it must be 2 (BTREE_BLOBKEY) for a index or WITHOUT ROWID table.
+** it must be 2 (BTREE_BLOBKEY) for an index or WITHOUT ROWID table.
** The root page number of the new b-tree is stored in register P2.
*/
case OP_CreateBtree: { /* out2 */
int pgno;
Db *pDb;
+ sqlite3VdbeIncrWriteCounter(p, 0);
pOut = out2Prerelease(p, pOp);
pgno = 0;
assert( pOp->p3==BTREE_INTKEY || pOp->p3==BTREE_BLOBKEY );
@@ -84675,6 +87517,7 @@ case OP_CreateBtree: { /* out2 */
** Run the SQL statement or statements specified in the P4 string.
*/
case OP_SqlExec: {
+ sqlite3VdbeIncrWriteCounter(p, 0);
db->nSqlExec++;
rc = sqlite3_exec(db, pOp->p4.z, 0, 0, 0);
db->nSqlExec--;
@@ -84764,6 +87607,7 @@ case OP_LoadAnalysis: {
** schema consistent with what is on disk.
*/
case OP_DropTable: {
+ sqlite3VdbeIncrWriteCounter(p, 0);
sqlite3UnlinkAndDeleteTable(db, pOp->p1, pOp->p4.z);
break;
}
@@ -84777,6 +87621,7 @@ case OP_DropTable: {
** schema consistent with what is on disk.
*/
case OP_DropIndex: {
+ sqlite3VdbeIncrWriteCounter(p, 0);
sqlite3UnlinkAndDeleteIndex(db, pOp->p1, pOp->p4.z);
break;
}
@@ -84790,6 +87635,7 @@ case OP_DropIndex: {
** schema consistent with what is on disk.
*/
case OP_DropTrigger: {
+ sqlite3VdbeIncrWriteCounter(p, 0);
sqlite3UnlinkAndDeleteTrigger(db, pOp->p1, pOp->p4.z);
break;
}
@@ -85318,12 +88164,17 @@ case OP_AggStep0: {
assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) );
assert( n==0 || (pOp->p2>0 && pOp->p2+n<=(p->nMem+1 - p->nCursor)+1) );
assert( pOp->p3<pOp->p2 || pOp->p3>=pOp->p2+n );
- pCtx = sqlite3DbMallocRawNN(db, sizeof(*pCtx) + (n-1)*sizeof(sqlite3_value*));
+ pCtx = sqlite3DbMallocRawNN(db, n*sizeof(sqlite3_value*) +
+ (sizeof(pCtx[0]) + sizeof(Mem) - sizeof(sqlite3_value*)));
if( pCtx==0 ) goto no_mem;
pCtx->pMem = 0;
+ pCtx->pOut = (Mem*)&(pCtx->argv[n]);
+ sqlite3VdbeMemInit(pCtx->pOut, db, MEM_Null);
pCtx->pFunc = pOp->p4.pFunc;
pCtx->iOp = (int)(pOp - aOp);
pCtx->pVdbe = p;
+ pCtx->skipFlag = 0;
+ pCtx->isError = 0;
pCtx->argc = n;
pOp->p4type = P4_FUNCCTX;
pOp->p4.pCtx = pCtx;
@@ -85334,7 +88185,6 @@ case OP_AggStep: {
int i;
sqlite3_context *pCtx;
Mem *pMem;
- Mem t;
assert( pOp->p4type==P4_FUNCCTX );
pCtx = pOp->p4.pCtx;
@@ -85357,26 +88207,28 @@ case OP_AggStep: {
#endif
pMem->n++;
- sqlite3VdbeMemInit(&t, db, MEM_Null);
- pCtx->pOut = &t;
- pCtx->fErrorOrAux = 0;
- pCtx->skipFlag = 0;
+ assert( pCtx->pOut->flags==MEM_Null );
+ assert( pCtx->isError==0 );
+ assert( pCtx->skipFlag==0 );
(pCtx->pFunc->xSFunc)(pCtx,pCtx->argc,pCtx->argv); /* IMP: R-24505-23230 */
- if( pCtx->fErrorOrAux ){
- if( pCtx->isError ){
- sqlite3VdbeError(p, "%s", sqlite3_value_text(&t));
+ if( pCtx->isError ){
+ if( pCtx->isError>0 ){
+ sqlite3VdbeError(p, "%s", sqlite3_value_text(pCtx->pOut));
rc = pCtx->isError;
}
- sqlite3VdbeMemRelease(&t);
+ if( pCtx->skipFlag ){
+ assert( pOp[-1].opcode==OP_CollSeq );
+ i = pOp[-1].p1;
+ if( i ) sqlite3VdbeMemSetInt64(&aMem[i], 1);
+ pCtx->skipFlag = 0;
+ }
+ sqlite3VdbeMemRelease(pCtx->pOut);
+ pCtx->pOut->flags = MEM_Null;
+ pCtx->isError = 0;
if( rc ) goto abort_due_to_error;
- }else{
- assert( t.flags==MEM_Null );
- }
- if( pCtx->skipFlag ){
- assert( pOp[-1].opcode==OP_CollSeq );
- i = pOp[-1].p1;
- if( i ) sqlite3VdbeMemSetInt64(&aMem[i], 1);
}
+ assert( pCtx->pOut->flags==MEM_Null );
+ assert( pCtx->skipFlag==0 );
break;
}
@@ -85821,12 +88673,18 @@ case OP_VFilter: { /* jump */
#endif /* SQLITE_OMIT_VIRTUALTABLE */
#ifndef SQLITE_OMIT_VIRTUALTABLE
-/* Opcode: VColumn P1 P2 P3 * *
+/* Opcode: VColumn P1 P2 P3 * P5
** Synopsis: r[P3]=vcolumn(P2)
**
-** Store the value of the P2-th column of
-** the row of the virtual-table that the
-** P1 cursor is pointing to into register P3.
+** Store in register P3 the value of the P2-th column of
+** the current row of the virtual-table of cursor P1.
+**
+** If the VColumn opcode is being used to fetch the value of
+** an unchanging column during an UPDATE operation, then the P5
+** value is 1. Otherwise, P5 is 0. The P5 value is returned
+** by sqlite3_vtab_nochange() routine and can be used
+** by virtual table implementations to return special "no-change"
+** marks which can be more efficient, depending on the virtual table.
*/
case OP_VColumn: {
sqlite3_vtab *pVtab;
@@ -85848,10 +88706,17 @@ case OP_VColumn: {
assert( pModule->xColumn );
memset(&sContext, 0, sizeof(sContext));
sContext.pOut = pDest;
- MemSetTypeFlag(pDest, MEM_Null);
+ if( pOp->p5 ){
+ sqlite3VdbeMemSetNull(pDest);
+ pDest->flags = MEM_Null|MEM_Zero;
+ pDest->u.nZero = 0;
+ }else{
+ MemSetTypeFlag(pDest, MEM_Null);
+ }
rc = pModule->xColumn(pCur->uc.pVCur, &sContext, pOp->p2);
sqlite3VtabImportErrmsg(p, pVtab);
- if( sContext.isError ){
+ if( sContext.isError>0 ){
+ sqlite3VdbeError(p, "%s", sqlite3_value_text(pDest));
rc = sContext.isError;
}
sqlite3VdbeChangeEncoding(pDest, encoding);
@@ -85980,6 +88845,7 @@ case OP_VUpdate: {
|| pOp->p5==OE_Abort || pOp->p5==OE_Ignore || pOp->p5==OE_Replace
);
assert( p->readOnly==0 );
+ sqlite3VdbeIncrWriteCounter(p, 0);
pVtab = pOp->p4.pVtab->pVtab;
if( pVtab==0 || NEVER(pVtab->pModule==0) ){
rc = SQLITE_LOCKED;
@@ -86116,6 +88982,7 @@ case OP_Function0: {
pCtx->pFunc = pOp->p4.pFunc;
pCtx->iOp = (int)(pOp - aOp);
pCtx->pVdbe = p;
+ pCtx->isError = 0;
pCtx->argc = n;
pOp->p4type = P4_FUNCCTX;
pOp->p4.pCtx = pCtx;
@@ -86150,16 +89017,17 @@ case OP_Function: {
}
#endif
MemSetTypeFlag(pOut, MEM_Null);
- pCtx->fErrorOrAux = 0;
+ assert( pCtx->isError==0 );
(*pCtx->pFunc->xSFunc)(pCtx, pCtx->argc, pCtx->argv);/* IMP: R-24505-23230 */
/* If the function returned an error, throw an exception */
- if( pCtx->fErrorOrAux ){
- if( pCtx->isError ){
+ if( pCtx->isError ){
+ if( pCtx->isError>0 ){
sqlite3VdbeError(p, "%s", sqlite3_value_text(pOut));
rc = pCtx->isError;
}
sqlite3VdbeDeleteAuxData(db, &p->pAuxData, pCtx->iOp, pOp->p1);
+ pCtx->isError = 0;
if( rc ) goto abort_due_to_error;
}
@@ -86174,7 +89042,13 @@ case OP_Function: {
break;
}
-
+/* Opcode: Trace P1 P2 * P4 *
+**
+** Write P4 on the statement trace output if statement tracing is
+** enabled.
+**
+** Operand P1 must be 0x7fffffff and P2 must positive.
+*/
/* Opcode: Init P1 P2 P3 P4 *
** Synopsis: Start at P2
**
@@ -86193,9 +89067,12 @@ case OP_Function: {
** If P3 is not zero, then it is an address to jump to if an SQLITE_CORRUPT
** error is encountered.
*/
+case OP_Trace:
case OP_Init: { /* jump */
- char *zTrace;
int i;
+#ifndef SQLITE_OMIT_TRACE
+ char *zTrace;
+#endif
/* If the P4 argument is not NULL, then it must be an SQL comment string.
** The "--" string is broken up to prevent false-positives with srcck1.c.
@@ -86207,7 +89084,9 @@ case OP_Init: { /* jump */
** sqlite3_expanded_sql(P) otherwise.
*/
assert( pOp->p4.z==0 || strncmp(pOp->p4.z, "-" "- ", 3)==0 );
- assert( pOp==p->aOp ); /* Always instruction 0 */
+
+ /* OP_Init is always instruction 0 */
+ assert( pOp==p->aOp || pOp->opcode==OP_Trace );
#ifndef SQLITE_OMIT_TRACE
if( (db->mTrace & (SQLITE_TRACE_STMT|SQLITE_TRACE_LEGACY))!=0
@@ -86250,6 +89129,7 @@ case OP_Init: { /* jump */
#endif /* SQLITE_OMIT_TRACE */
assert( pOp->p2>0 );
if( pOp->p1>=sqlite3GlobalConfig.iOnceResetThreshold ){
+ if( pOp->opcode==OP_Trace ) break;
for(i=1; i<p->nOp; i++){
if( p->aOp[i].opcode==OP_Once ) p->aOp[i].p1 = 0;
}
@@ -86283,6 +89163,22 @@ case OP_CursorHint: {
}
#endif /* SQLITE_ENABLE_CURSOR_HINTS */
+#ifdef SQLITE_DEBUG
+/* Opcode: Abortable * * * * *
+**
+** Verify that an Abort can happen. Assert if an Abort at this point
+** might cause database corruption. This opcode only appears in debugging
+** builds.
+**
+** An Abort is safe if either there have been no writes, or if there is
+** an active statement journal.
+*/
+case OP_Abortable: {
+ sqlite3VdbeAssertAbortable(p);
+ break;
+}
+#endif
+
/* Opcode: Noop * * * * *
**
** Do nothing. This instruction is often useful as a jump
@@ -86294,8 +89190,9 @@ case OP_CursorHint: {
** This opcode records information from the optimizer. It is the
** the same as a no-op. This opcodesnever appears in a real VM program.
*/
-default: { /* This is really OP_Noop and OP_Explain */
+default: { /* This is really OP_Noop, OP_Explain */
assert( pOp->opcode==OP_Noop || pOp->opcode==OP_Explain );
+
break;
}
@@ -86309,7 +89206,7 @@ default: { /* This is really OP_Noop and OP_Explain */
#ifdef VDBE_PROFILE
{
- u64 endTime = sqlite3Hwtime();
+ u64 endTime = sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime();
if( endTime>start ) pOrigOp->cycles += endTime - start;
pOrigOp->cnt++;
}
@@ -90194,7 +93091,6 @@ SQLITE_PRIVATE int sqlite3WalkSelectExpr(Walker *pWalker, Select *p){
if( sqlite3WalkExpr(pWalker, p->pHaving) ) return WRC_Abort;
if( sqlite3WalkExprList(pWalker, p->pOrderBy) ) return WRC_Abort;
if( sqlite3WalkExpr(pWalker, p->pLimit) ) return WRC_Abort;
- if( sqlite3WalkExpr(pWalker, p->pOffset) ) return WRC_Abort;
return WRC_Continue;
}
@@ -90211,16 +93107,15 @@ SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker *pWalker, Select *p){
struct SrcList_item *pItem;
pSrc = p->pSrc;
- if( ALWAYS(pSrc) ){
- for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){
- if( pItem->pSelect && sqlite3WalkSelect(pWalker, pItem->pSelect) ){
- return WRC_Abort;
- }
- if( pItem->fg.isTabFunc
- && sqlite3WalkExprList(pWalker, pItem->u1.pFuncArg)
- ){
- return WRC_Abort;
- }
+ assert( pSrc!=0 );
+ for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){
+ if( pItem->pSelect && sqlite3WalkSelect(pWalker, pItem->pSelect) ){
+ return WRC_Abort;
+ }
+ if( pItem->fg.isTabFunc
+ && sqlite3WalkExprList(pWalker, pItem->u1.pFuncArg)
+ ){
+ return WRC_Abort;
}
}
return WRC_Continue;
@@ -90342,29 +93237,31 @@ static void resolveAlias(
assert( pOrig!=0 );
db = pParse->db;
pDup = sqlite3ExprDup(db, pOrig, 0);
- if( pDup==0 ) return;
- if( zType[0]!='G' ) incrAggFunctionDepth(pDup, nSubquery);
- if( pExpr->op==TK_COLLATE ){
- pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken);
- }
- ExprSetProperty(pDup, EP_Alias);
+ if( pDup!=0 ){
+ if( zType[0]!='G' ) incrAggFunctionDepth(pDup, nSubquery);
+ if( pExpr->op==TK_COLLATE ){
+ pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken);
+ }
+ ExprSetProperty(pDup, EP_Alias);
- /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This
- ** prevents ExprDelete() from deleting the Expr structure itself,
- ** allowing it to be repopulated by the memcpy() on the following line.
- ** The pExpr->u.zToken might point into memory that will be freed by the
- ** sqlite3DbFree(db, pDup) on the last line of this block, so be sure to
- ** make a copy of the token before doing the sqlite3DbFree().
- */
- ExprSetProperty(pExpr, EP_Static);
- sqlite3ExprDelete(db, pExpr);
- memcpy(pExpr, pDup, sizeof(*pExpr));
- if( !ExprHasProperty(pExpr, EP_IntValue) && pExpr->u.zToken!=0 ){
- assert( (pExpr->flags & (EP_Reduced|EP_TokenOnly))==0 );
- pExpr->u.zToken = sqlite3DbStrDup(db, pExpr->u.zToken);
- pExpr->flags |= EP_MemToken;
+ /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This
+ ** prevents ExprDelete() from deleting the Expr structure itself,
+ ** allowing it to be repopulated by the memcpy() on the following line.
+ ** The pExpr->u.zToken might point into memory that will be freed by the
+ ** sqlite3DbFree(db, pDup) on the last line of this block, so be sure to
+ ** make a copy of the token before doing the sqlite3DbFree().
+ */
+ ExprSetProperty(pExpr, EP_Static);
+ sqlite3ExprDelete(db, pExpr);
+ memcpy(pExpr, pDup, sizeof(*pExpr));
+ if( !ExprHasProperty(pExpr, EP_IntValue) && pExpr->u.zToken!=0 ){
+ assert( (pExpr->flags & (EP_Reduced|EP_TokenOnly))==0 );
+ pExpr->u.zToken = sqlite3DbStrDup(db, pExpr->u.zToken);
+ pExpr->flags |= EP_MemToken;
+ }
+ sqlite3DbFree(db, pDup);
}
- sqlite3DbFree(db, pDup);
+ ExprSetProperty(pExpr, EP_Alias);
}
@@ -90458,7 +93355,7 @@ static int lookupName(
struct SrcList_item *pMatch = 0; /* The matching pSrcList item */
NameContext *pTopNC = pNC; /* First namecontext in the list */
Schema *pSchema = 0; /* Schema of the expression */
- int isTrigger = 0; /* True if resolved to a trigger column */
+ int eNewExprOp = TK_COLUMN; /* New value for pExpr->op on success */
Table *pTab = 0; /* Table hold the row */
Column *pCol; /* A column of pTab */
@@ -90563,22 +93460,35 @@ static int lookupName(
}
} /* if( pSrcList ) */
-#ifndef SQLITE_OMIT_TRIGGER
+#if !defined(SQLITE_OMIT_TRIGGER) || !defined(SQLITE_OMIT_UPSERT)
/* If we have not already resolved the name, then maybe
- ** it is a new.* or old.* trigger argument reference
+ ** it is a new.* or old.* trigger argument reference. Or
+ ** maybe it is an excluded.* from an upsert.
*/
- if( zDb==0 && zTab!=0 && cntTab==0 && pParse->pTriggerTab!=0 ){
- int op = pParse->eTriggerOp;
- assert( op==TK_DELETE || op==TK_UPDATE || op==TK_INSERT );
- if( op!=TK_DELETE && sqlite3StrICmp("new",zTab) == 0 ){
- pExpr->iTable = 1;
- pTab = pParse->pTriggerTab;
- }else if( op!=TK_INSERT && sqlite3StrICmp("old",zTab)==0 ){
- pExpr->iTable = 0;
- pTab = pParse->pTriggerTab;
- }else{
- pTab = 0;
+ if( zDb==0 && zTab!=0 && cntTab==0 ){
+ pTab = 0;
+#ifndef SQLITE_OMIT_TRIGGER
+ if( pParse->pTriggerTab!=0 ){
+ int op = pParse->eTriggerOp;
+ assert( op==TK_DELETE || op==TK_UPDATE || op==TK_INSERT );
+ if( op!=TK_DELETE && sqlite3StrICmp("new",zTab) == 0 ){
+ pExpr->iTable = 1;
+ pTab = pParse->pTriggerTab;
+ }else if( op!=TK_INSERT && sqlite3StrICmp("old",zTab)==0 ){
+ pExpr->iTable = 0;
+ pTab = pParse->pTriggerTab;
+ }
}
+#endif /* SQLITE_OMIT_TRIGGER */
+#ifndef SQLITE_OMIT_UPSERT
+ if( (pNC->ncFlags & NC_UUpsert)!=0 ){
+ Upsert *pUpsert = pNC->uNC.pUpsert;
+ if( pUpsert && sqlite3StrICmp("excluded",zTab)==0 ){
+ pTab = pUpsert->pUpsertSrc->a[0].pTab;
+ pExpr->iTable = 2;
+ }
+ }
+#endif /* SQLITE_OMIT_UPSERT */
if( pTab ){
int iCol;
@@ -90598,24 +93508,36 @@ static int lookupName(
}
if( iCol<pTab->nCol ){
cnt++;
- if( iCol<0 ){
- pExpr->affinity = SQLITE_AFF_INTEGER;
- }else if( pExpr->iTable==0 ){
- testcase( iCol==31 );
- testcase( iCol==32 );
- pParse->oldmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol));
- }else{
- testcase( iCol==31 );
- testcase( iCol==32 );
- pParse->newmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol));
+#ifndef SQLITE_OMIT_UPSERT
+ if( pExpr->iTable==2 ){
+ testcase( iCol==(-1) );
+ pExpr->iTable = pNC->uNC.pUpsert->regData + iCol;
+ eNewExprOp = TK_REGISTER;
+ ExprSetProperty(pExpr, EP_Alias);
+ }else
+#endif /* SQLITE_OMIT_UPSERT */
+ {
+#ifndef SQLITE_OMIT_TRIGGER
+ if( iCol<0 ){
+ pExpr->affinity = SQLITE_AFF_INTEGER;
+ }else if( pExpr->iTable==0 ){
+ testcase( iCol==31 );
+ testcase( iCol==32 );
+ pParse->oldmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol));
+ }else{
+ testcase( iCol==31 );
+ testcase( iCol==32 );
+ pParse->newmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol));
+ }
+ pExpr->pTab = pTab;
+ pExpr->iColumn = (i16)iCol;
+ eNewExprOp = TK_TRIGGER;
+#endif /* SQLITE_OMIT_TRIGGER */
}
- pExpr->iColumn = (i16)iCol;
- pExpr->pTab = pTab;
- isTrigger = 1;
}
}
}
-#endif /* !defined(SQLITE_OMIT_TRIGGER) */
+#endif /* !defined(SQLITE_OMIT_TRIGGER) || !defined(SQLITE_OMIT_UPSERT) */
/*
** Perhaps the name is a reference to the ROWID
@@ -90650,10 +93572,12 @@ static int lookupName(
** is supported for backwards compatibility only. Hence, we issue a warning
** on sqlite3_log() whenever the capability is used.
*/
- if( (pEList = pNC->pEList)!=0
- && zTab==0
+ if( (pNC->ncFlags & NC_UEList)!=0
&& cnt==0
+ && zTab==0
){
+ pEList = pNC->uNC.pEList;
+ assert( pEList!=0 );
for(j=0; j<pEList->nExpr; j++){
char *zAs = pEList->a[j].zName;
if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){
@@ -90698,10 +93622,16 @@ static int lookupName(
** Because no reference was made to outer contexts, the pNC->nRef
** fields are not changed in any context.
*/
- if( cnt==0 && zTab==0 && ExprHasProperty(pExpr,EP_DblQuoted) ){
- pExpr->op = TK_STRING;
- pExpr->pTab = 0;
- return WRC_Prune;
+ if( cnt==0 && zTab==0 ){
+ assert( pExpr->op==TK_ID );
+ if( ExprHasProperty(pExpr,EP_DblQuoted) ){
+ pExpr->op = TK_STRING;
+ pExpr->pTab = 0;
+ return WRC_Prune;
+ }
+ if( sqlite3ExprIdToTrueFalse(pExpr) ){
+ return WRC_Prune;
+ }
}
/*
@@ -90744,7 +93674,7 @@ static int lookupName(
pExpr->pLeft = 0;
sqlite3ExprDelete(db, pExpr->pRight);
pExpr->pRight = 0;
- pExpr->op = (isTrigger ? TK_TRIGGER : TK_COLUMN);
+ pExpr->op = eNewExprOp;
ExprSetProperty(pExpr, EP_Leaf);
lookupname_end:
if( cnt==1 ){
@@ -90863,7 +93793,8 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
SrcList *pSrcList = pNC->pSrcList;
struct SrcList_item *pItem;
assert( pSrcList && pSrcList->nSrc==1 );
- pItem = pSrcList->a;
+ pItem = pSrcList->a;
+ assert( HasRowid(pItem->pTab) && pItem->pTab->pSelect==0 );
pExpr->op = TK_COLUMN;
pExpr->pTab = pItem->pTab;
pExpr->iTable = pItem->iCursor;
@@ -91049,15 +93980,30 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
notValid(pParse, pNC, "parameters", NC_IsCheck|NC_PartIdx|NC_IdxExpr);
break;
}
+ case TK_IS:
+ case TK_ISNOT: {
+ Expr *pRight;
+ assert( !ExprHasProperty(pExpr, EP_Reduced) );
+ /* Handle special cases of "x IS TRUE", "x IS FALSE", "x IS NOT TRUE",
+ ** and "x IS NOT FALSE". */
+ if( (pRight = pExpr->pRight)->op==TK_ID ){
+ int rc = resolveExprStep(pWalker, pRight);
+ if( rc==WRC_Abort ) return WRC_Abort;
+ if( pRight->op==TK_TRUEFALSE ){
+ pExpr->op2 = pExpr->op;
+ pExpr->op = TK_TRUTH;
+ return WRC_Continue;
+ }
+ }
+ /* Fall thru */
+ }
case TK_BETWEEN:
case TK_EQ:
case TK_NE:
case TK_LT:
case TK_LE:
case TK_GT:
- case TK_GE:
- case TK_IS:
- case TK_ISNOT: {
+ case TK_GE: {
int nLeft, nRight;
if( pParse->db->mallocFailed ) break;
assert( pExpr->pLeft!=0 );
@@ -91160,8 +94106,8 @@ static int resolveOrderByTermToExprList(
memset(&nc, 0, sizeof(nc));
nc.pParse = pParse;
nc.pSrcList = pSelect->pSrc;
- nc.pEList = pEList;
- nc.ncFlags = NC_AllowAgg;
+ nc.uNC.pEList = pEList;
+ nc.ncFlags = NC_AllowAgg|NC_UEList;
nc.nErr = 0;
db = pParse->db;
savedSuppErr = db->suppressErr;
@@ -91462,8 +94408,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){
*/
memset(&sNC, 0, sizeof(sNC));
sNC.pParse = pParse;
- if( sqlite3ResolveExprNames(&sNC, p->pLimit) ||
- sqlite3ResolveExprNames(&sNC, p->pOffset) ){
+ if( sqlite3ResolveExprNames(&sNC, p->pLimit) ){
return WRC_Abort;
}
@@ -91545,7 +94490,9 @@ static int resolveSelectStep(Walker *pWalker, Select *p){
** Minor point: If this is the case, then the expression will be
** re-evaluated for each reference to it.
*/
- sNC.pEList = p->pEList;
+ assert( (sNC.ncFlags & (NC_UAggInfo|NC_UUpsert))==0 );
+ sNC.uNC.pEList = p->pEList;
+ sNC.ncFlags |= NC_UEList;
if( sqlite3ResolveExprNames(&sNC, p->pHaving) ) return WRC_Abort;
if( sqlite3ResolveExprNames(&sNC, p->pWhere) ) return WRC_Abort;
@@ -91778,7 +94725,7 @@ SQLITE_PRIVATE void sqlite3ResolveSelfReference(
Table *pTab, /* The table being referenced */
int type, /* NC_IsCheck or NC_PartIdx or NC_IdxExpr */
Expr *pExpr, /* Expression to resolve. May be NULL. */
- ExprList *pList /* Expression list to resolve. May be NUL. */
+ ExprList *pList /* Expression list to resolve. May be NULL. */
){
SrcList sSrc; /* Fake SrcList for pParse->pNewTable */
NameContext sNC; /* Name context for pParse->pNewTable */
@@ -92459,16 +95406,15 @@ static void heightOfExprList(ExprList *p, int *pnHeight){
}
}
}
-static void heightOfSelect(Select *p, int *pnHeight){
- if( p ){
+static void heightOfSelect(Select *pSelect, int *pnHeight){
+ Select *p;
+ for(p=pSelect; p; p=p->pPrior){
heightOfExpr(p->pWhere, pnHeight);
heightOfExpr(p->pHaving, pnHeight);
heightOfExpr(p->pLimit, pnHeight);
- heightOfExpr(p->pOffset, pnHeight);
heightOfExprList(p->pEList, pnHeight);
heightOfExprList(p->pGroupBy, pnHeight);
heightOfExprList(p->pOrderBy, pnHeight);
- heightOfSelect(p->pPrior, pnHeight);
}
}
@@ -92753,6 +95699,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse *pParse, ExprList *pList, Token *
return 0;
}
pNew->x.pList = pList;
+ ExprSetProperty(pNew, EP_HasFunc);
assert( !ExprHasProperty(pNew, EP_xIsSelect) );
sqlite3ExprSetHeightAndFlags(pParse, pNew);
return pNew;
@@ -93164,6 +96111,7 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags)
pItem->sortOrder = pOldItem->sortOrder;
pItem->done = 0;
pItem->bSpanIsTab = pOldItem->bSpanIsTab;
+ pItem->bSorterRef = pOldItem->bSorterRef;
pItem->u = pOldItem->u;
}
return pNew;
@@ -93262,7 +96210,6 @@ SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *pDup, int flags){
pNew->pNext = pNext;
pNew->pPrior = 0;
pNew->pLimit = sqlite3ExprDup(db, p->pLimit, flags);
- pNew->pOffset = sqlite3ExprDup(db, p->pOffset, flags);
pNew->iLimit = 0;
pNew->iOffset = 0;
pNew->selFlags = p->selFlags & ~SF_UsesEphemeral;
@@ -93456,17 +96403,16 @@ SQLITE_PRIVATE void sqlite3ExprListSetName(
SQLITE_PRIVATE void sqlite3ExprListSetSpan(
Parse *pParse, /* Parsing context */
ExprList *pList, /* List to which to add the span. */
- ExprSpan *pSpan /* The span to be added */
+ const char *zStart, /* Start of the span */
+ const char *zEnd /* End of the span */
){
sqlite3 *db = pParse->db;
assert( pList!=0 || db->mallocFailed!=0 );
if( pList ){
struct ExprList_item *pItem = &pList->a[pList->nExpr-1];
assert( pList->nExpr>0 );
- assert( db->mallocFailed || pItem->pExpr==pSpan->pExpr );
sqlite3DbFree(db, pItem->zSpan);
- pItem->zSpan = sqlite3DbStrNDup(db, (char*)pSpan->zStart,
- (int)(pSpan->zEnd - pSpan->zStart));
+ pItem->zSpan = sqlite3DbSpanDup(db, zStart, zEnd);
}
}
@@ -93536,6 +96482,34 @@ SQLITE_PRIVATE int sqlite3SelectWalkFail(Walker *pWalker, Select *NotUsed){
}
/*
+** If the input expression is an ID with the name "true" or "false"
+** then convert it into an TK_TRUEFALSE term. Return non-zero if
+** the conversion happened, and zero if the expression is unaltered.
+*/
+SQLITE_PRIVATE int sqlite3ExprIdToTrueFalse(Expr *pExpr){
+ assert( pExpr->op==TK_ID || pExpr->op==TK_STRING );
+ if( sqlite3StrICmp(pExpr->u.zToken, "true")==0
+ || sqlite3StrICmp(pExpr->u.zToken, "false")==0
+ ){
+ pExpr->op = TK_TRUEFALSE;
+ return 1;
+ }
+ return 0;
+}
+
+/*
+** The argument must be a TK_TRUEFALSE Expr node. Return 1 if it is TRUE
+** and 0 if it is FALSE.
+*/
+SQLITE_PRIVATE int sqlite3ExprTruthValue(const Expr *pExpr){
+ assert( pExpr->op==TK_TRUEFALSE );
+ assert( sqlite3StrICmp(pExpr->u.zToken,"true")==0
+ || sqlite3StrICmp(pExpr->u.zToken,"false")==0 );
+ return pExpr->u.zToken[4]==0;
+}
+
+
+/*
** These routines are Walker callbacks used to check expressions to
** see if they are "constant" for some definition of constant. The
** Walker.eCode value determines the type of "constant" we are looking
@@ -93582,6 +96556,12 @@ static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){
return WRC_Abort;
}
case TK_ID:
+ /* Convert "true" or "false" in a DEFAULT clause into the
+ ** appropriate TK_TRUEFALSE operator */
+ if( sqlite3ExprIdToTrueFalse(pExpr) ){
+ return WRC_Prune;
+ }
+ /* Fall thru */
case TK_COLUMN:
case TK_AGG_FUNCTION:
case TK_AGG_COLUMN:
@@ -93594,6 +96574,8 @@ static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){
}
/* Fall through */
case TK_IF_NULL_ROW:
+ case TK_REGISTER:
+ testcase( pExpr->op==TK_REGISTER );
testcase( pExpr->op==TK_IF_NULL_ROW );
pWalker->eCode = 0;
return WRC_Abort;
@@ -93611,8 +96593,8 @@ static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){
}
/* Fall through */
default:
- testcase( pExpr->op==TK_SELECT ); /* sqlite3SelectWalkFail will disallow */
- testcase( pExpr->op==TK_EXISTS ); /* sqlite3SelectWalkFail will disallow */
+ testcase( pExpr->op==TK_SELECT ); /* sqlite3SelectWalkFail() disallows */
+ testcase( pExpr->op==TK_EXISTS ); /* sqlite3SelectWalkFail() disallows */
return WRC_Continue;
}
}
@@ -93899,7 +96881,6 @@ static Select *isCandidateForInOpt(Expr *pX){
}
assert( p->pGroupBy==0 ); /* Has no GROUP BY clause */
if( p->pLimit ) return 0; /* Has no LIMIT clause */
- assert( p->pOffset==0 ); /* No LIMIT means no OFFSET */
if( p->pWhere ) return 0; /* Has no WHERE clause */
pSrc = p->pSrc;
assert( pSrc!=0 );
@@ -93989,16 +96970,15 @@ static int sqlite3InRhsIsConstant(Expr *pIn){
** pX->iTable made to point to the ephemeral table instead of an
** existing table.
**
-** The inFlags parameter must contain exactly one of the bits
-** IN_INDEX_MEMBERSHIP or IN_INDEX_LOOP. If inFlags contains
-** IN_INDEX_MEMBERSHIP, then the generated table will be used for a
-** fast membership test. When the IN_INDEX_LOOP bit is set, the
-** IN index will be used to loop over all values of the RHS of the
-** IN operator.
+** The inFlags parameter must contain, at a minimum, one of the bits
+** IN_INDEX_MEMBERSHIP or IN_INDEX_LOOP but not both. If inFlags contains
+** IN_INDEX_MEMBERSHIP, then the generated table will be used for a fast
+** membership test. When the IN_INDEX_LOOP bit is set, the IN index will
+** be used to loop over all values of the RHS of the IN operator.
**
** When IN_INDEX_LOOP is used (and the b-tree will be used to iterate
** through the set members) then the b-tree must not contain duplicates.
-** An epheremal table must be used unless the selected columns are guaranteed
+** An epheremal table will be created unless the selected columns are guaranteed
** to be unique - either because it is an INTEGER PRIMARY KEY or due to
** a UNIQUE constraint or index.
**
@@ -94178,11 +97158,8 @@ SQLITE_PRIVATE int sqlite3FindInIndex(
if( colUsed==(MASKBIT(nExpr)-1) ){
/* If we reach this point, that means the index pIdx is usable */
int iAddr = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v);
-#ifndef SQLITE_OMIT_EXPLAIN
- sqlite3VdbeAddOp4(v, OP_Explain, 0, 0, 0,
- sqlite3MPrintf(db, "USING INDEX %s FOR IN-OPERATOR",pIdx->zName),
- P4_DYNAMIC);
-#endif
+ ExplainQueryPlan((pParse, 0,
+ "USING INDEX %s FOR IN-OPERATOR",pIdx->zName));
sqlite3VdbeAddOp3(v, OP_OpenRead, iTab, pIdx->tnum, iDb);
sqlite3VdbeSetP4KeyInfo(pParse, pIdx);
VdbeComment((v, "%s", pIdx->zName));
@@ -94377,17 +97354,6 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(
jmpIfDynamic = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v);
}
-#ifndef SQLITE_OMIT_EXPLAIN
- if( pParse->explain==2 ){
- char *zMsg = sqlite3MPrintf(pParse->db, "EXECUTE %s%s SUBQUERY %d",
- jmpIfDynamic>=0?"":"CORRELATED ",
- pExpr->op==TK_IN?"LIST":"SCALAR",
- pParse->iNextSelectId
- );
- sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC);
- }
-#endif
-
switch( pExpr->op ){
case TK_IN: {
int addr; /* Address of OP_OpenEphemeral instruction */
@@ -94425,6 +97391,9 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(
Select *pSelect = pExpr->x.pSelect;
ExprList *pEList = pSelect->pEList;
+ ExplainQueryPlan((pParse, 1, "%sLIST SUBQUERY",
+ jmpIfDynamic>=0?"":"CORRELATED "
+ ));
assert( !isRowid );
/* If the LHS and RHS of the IN operator do not match, that
** error will have been caught long before we reach this point. */
@@ -94466,7 +97435,6 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(
ExprList *pList = pExpr->x.pList;
struct ExprList_item *pItem;
int r1, r2, r3;
-
affinity = sqlite3ExprAffinity(pLeft);
if( !affinity ){
affinity = SQLITE_AFF_BLOB;
@@ -94539,6 +97507,7 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(
Select *pSel; /* SELECT statement to encode */
SelectDest dest; /* How to deal with SELECT result */
int nReg; /* Registers to allocate */
+ Expr *pLimit; /* New limit expression */
testcase( pExpr->op==TK_EXISTS );
testcase( pExpr->op==TK_SELECT );
@@ -94546,6 +97515,8 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(
assert( ExprHasProperty(pExpr, EP_xIsSelect) );
pSel = pExpr->x.pSelect;
+ ExplainQueryPlan((pParse, 1, "%sSCALAR SUBQUERY",
+ jmpIfDynamic>=0?"":"CORRELATED "));
nReg = pExpr->op==TK_SELECT ? pSel->pEList->nExpr : 1;
sqlite3SelectDestInit(&dest, 0, pParse->nMem+1);
pParse->nMem += nReg;
@@ -94560,11 +97531,14 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(
sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iSDParm);
VdbeComment((v, "Init EXISTS result"));
}
- sqlite3ExprDelete(pParse->db, pSel->pLimit);
- pSel->pLimit = sqlite3ExprAlloc(pParse->db, TK_INTEGER,
- &sqlite3IntTokens[1], 0);
+ pLimit = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[1], 0);
+ if( pSel->pLimit ){
+ sqlite3ExprDelete(pParse->db, pSel->pLimit->pLeft);
+ pSel->pLimit->pLeft = pLimit;
+ }else{
+ pSel->pLimit = sqlite3PExpr(pParse, TK_LIMIT, pLimit, 0);
+ }
pSel->iLimit = 0;
- pSel->selFlags &= ~SF_MultiValue;
if( sqlite3Select(pParse, pSel, &dest) ){
return 0;
}
@@ -95305,6 +98279,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
return 0;
}
+expr_code_doover:
if( pExpr==0 ){
op = TK_NULL;
}else{
@@ -95344,6 +98319,10 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
codeInteger(pParse, pExpr, 0, target);
return target;
}
+ case TK_TRUEFALSE: {
+ sqlite3VdbeAddOp2(v, OP_Integer, sqlite3ExprTruthValue(pExpr), target);
+ return target;
+ }
#ifndef SQLITE_OMIT_FLOATING_POINT
case TK_FLOAT: {
assert( !ExprHasProperty(pExpr, EP_IntValue) );
@@ -95499,6 +98478,18 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
sqlite3VdbeAddOp2(v, op, r1, inReg);
break;
}
+ case TK_TRUTH: {
+ int isTrue; /* IS TRUE or IS NOT TRUE */
+ int bNormal; /* IS TRUE or IS FALSE */
+ r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, &regFree1);
+ testcase( regFree1==0 );
+ isTrue = sqlite3ExprTruthValue(pExpr->pRight);
+ bNormal = pExpr->op2==TK_IS;
+ testcase( isTrue && bNormal);
+ testcase( !isTrue && bNormal);
+ sqlite3VdbeAddOp4Int(v, OP_IsTrue, r1, inReg, !isTrue, isTrue ^ bNormal);
+ break;
+ }
case TK_ISNULL:
case TK_NOTNULL: {
int addr;
@@ -95670,9 +98661,21 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
if( !pColl ) pColl = db->pDfltColl;
sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (char *)pColl, P4_COLLSEQ);
}
- sqlite3VdbeAddOp4(v, pParse->iSelfTab ? OP_PureFunc0 : OP_Function0,
- constMask, r1, target, (char*)pDef, P4_FUNCDEF);
- sqlite3VdbeChangeP5(v, (u8)nFarg);
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+ if( pDef->funcFlags & SQLITE_FUNC_OFFSET ){
+ Expr *pArg = pFarg->a[0].pExpr;
+ if( pArg->op==TK_COLUMN ){
+ sqlite3VdbeAddOp3(v, OP_Offset, pArg->iTable, pArg->iColumn, target);
+ }else{
+ sqlite3VdbeAddOp2(v, OP_Null, 0, target);
+ }
+ }else
+#endif
+ {
+ sqlite3VdbeAddOp4(v, pParse->iSelfTab ? OP_PureFunc0 : OP_Function0,
+ constMask, r1, target, (char*)pDef, P4_FUNCDEF);
+ sqlite3VdbeChangeP5(v, (u8)nFarg);
+ }
if( nFarg && constMask==0 ){
sqlite3ReleaseTempRange(pParse, r1, nFarg);
}
@@ -95737,7 +98740,8 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
case TK_SPAN:
case TK_COLLATE:
case TK_UPLUS: {
- return sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target);
+ pExpr = pExpr->pLeft;
+ goto expr_code_doover; /* 2018-04-28: Prevent deep recursion. OSSFuzz. */
}
case TK_TRIGGER: {
@@ -95775,10 +98779,9 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
assert( p1>=0 && p1<(pTab->nCol*2+2) );
sqlite3VdbeAddOp2(v, OP_Param, p1, target);
- VdbeComment((v, "%s.%s -> $%d",
+ VdbeComment((v, "r[%d]=%s.%s", target,
(pExpr->iTable ? "new" : "old"),
- (pExpr->iColumn<0 ? "rowid" : pExpr->pTab->aCol[pExpr->iColumn].zName),
- target
+ (pExpr->iColumn<0 ? "rowid" : pExpr->pTab->aCol[pExpr->iColumn].zName)
));
#ifndef SQLITE_OMIT_FLOATING_POINT
@@ -96110,6 +99113,12 @@ SQLITE_PRIVATE int sqlite3ExprCodeExprList(
if( !ConstFactorOk(pParse) ) flags &= ~SQLITE_ECEL_FACTOR;
for(pItem=pList->a, i=0; i<n; i++, pItem++){
Expr *pExpr = pItem->pExpr;
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ if( pItem->bSorterRef ){
+ i--;
+ n--;
+ }else
+#endif
if( (flags & SQLITE_ECEL_REF)!=0 && (j = pItem->u.x.iOrderByCol)>0 ){
if( flags & SQLITE_ECEL_OMITREF ){
i--;
@@ -96262,6 +99271,23 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int
sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
break;
}
+ case TK_TRUTH: {
+ int isNot; /* IS NOT TRUE or IS NOT FALSE */
+ int isTrue; /* IS TRUE or IS NOT TRUE */
+ testcase( jumpIfNull==0 );
+ isNot = pExpr->op2==TK_ISNOT;
+ isTrue = sqlite3ExprTruthValue(pExpr->pRight);
+ testcase( isTrue && isNot );
+ testcase( !isTrue && isNot );
+ if( isTrue ^ isNot ){
+ sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest,
+ isNot ? SQLITE_JUMPIFNULL : 0);
+ }else{
+ sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest,
+ isNot ? SQLITE_JUMPIFNULL : 0);
+ }
+ break;
+ }
case TK_IS:
case TK_ISNOT:
testcase( op==TK_IS );
@@ -96416,6 +99442,26 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int
sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
break;
}
+ case TK_TRUTH: {
+ int isNot; /* IS NOT TRUE or IS NOT FALSE */
+ int isTrue; /* IS TRUE or IS NOT TRUE */
+ testcase( jumpIfNull==0 );
+ isNot = pExpr->op2==TK_ISNOT;
+ isTrue = sqlite3ExprTruthValue(pExpr->pRight);
+ testcase( isTrue && isNot );
+ testcase( !isTrue && isNot );
+ if( isTrue ^ isNot ){
+ /* IS TRUE and IS NOT FALSE */
+ sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest,
+ isNot ? 0 : SQLITE_JUMPIFNULL);
+
+ }else{
+ /* IS FALSE and IS NOT TRUE */
+ sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest,
+ isNot ? 0 : SQLITE_JUMPIFNULL);
+ }
+ break;
+ }
case TK_IS:
case TK_ISNOT:
testcase( pExpr->op==TK_IS );
@@ -96601,8 +99647,10 @@ SQLITE_PRIVATE int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTa
if( pA->op!=TK_COLUMN && pA->op!=TK_AGG_COLUMN && pA->u.zToken ){
if( pA->op==TK_FUNCTION ){
if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2;
+ }else if( pA->op==TK_COLLATE ){
+ if( sqlite3_stricmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2;
}else if( strcmp(pA->u.zToken,pB->u.zToken)!=0 ){
- return pA->op==TK_COLLATE ? 1 : 2;
+ return 2;
}
}
if( (pA->flags & EP_Distinct)!=(pB->flags & EP_Distinct) ) return 2;
@@ -96611,7 +99659,8 @@ SQLITE_PRIVATE int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTa
if( sqlite3ExprCompare(pParse, pA->pLeft, pB->pLeft, iTab) ) return 2;
if( sqlite3ExprCompare(pParse, pA->pRight, pB->pRight, iTab) ) return 2;
if( sqlite3ExprListCompare(pA->x.pList, pB->x.pList, iTab) ) return 2;
- if( ALWAYS((combinedFlags & EP_Reduced)==0) && pA->op!=TK_STRING ){
+ assert( (combinedFlags & EP_Reduced)==0 );
+ if( pA->op!=TK_STRING && pA->op!=TK_TRUEFALSE ){
if( pA->iColumn!=pB->iColumn ) return 2;
if( pA->iTable!=pB->iTable
&& (pA->iTable!=iTab || NEVER(pB->iTable>=0)) ) return 2;
@@ -96704,6 +99753,105 @@ SQLITE_PRIVATE int sqlite3ExprImpliesExpr(Parse *pParse, Expr *pE1, Expr *pE2, i
}
/*
+** This is the Expr node callback for sqlite3ExprImpliesNotNullRow().
+** If the expression node requires that the table at pWalker->iCur
+** have a non-NULL column, then set pWalker->eCode to 1 and abort.
+*/
+static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){
+ /* This routine is only called for WHERE clause expressions and so it
+ ** cannot have any TK_AGG_COLUMN entries because those are only found
+ ** in HAVING clauses. We can get a TK_AGG_FUNCTION in a WHERE clause,
+ ** but that is an illegal construct and the query will be rejected at
+ ** a later stage of processing, so the TK_AGG_FUNCTION case does not
+ ** need to be considered here. */
+ assert( pExpr->op!=TK_AGG_COLUMN );
+ testcase( pExpr->op==TK_AGG_FUNCTION );
+
+ if( ExprHasProperty(pExpr, EP_FromJoin) ) return WRC_Prune;
+ switch( pExpr->op ){
+ case TK_ISNOT:
+ case TK_NOT:
+ case TK_ISNULL:
+ case TK_IS:
+ case TK_OR:
+ case TK_CASE:
+ case TK_IN:
+ case TK_FUNCTION:
+ testcase( pExpr->op==TK_ISNOT );
+ testcase( pExpr->op==TK_NOT );
+ testcase( pExpr->op==TK_ISNULL );
+ testcase( pExpr->op==TK_IS );
+ testcase( pExpr->op==TK_OR );
+ testcase( pExpr->op==TK_CASE );
+ testcase( pExpr->op==TK_IN );
+ testcase( pExpr->op==TK_FUNCTION );
+ return WRC_Prune;
+ case TK_COLUMN:
+ if( pWalker->u.iCur==pExpr->iTable ){
+ pWalker->eCode = 1;
+ return WRC_Abort;
+ }
+ return WRC_Prune;
+
+ /* Virtual tables are allowed to use constraints like x=NULL. So
+ ** a term of the form x=y does not prove that y is not null if x
+ ** is the column of a virtual table */
+ case TK_EQ:
+ case TK_NE:
+ case TK_LT:
+ case TK_LE:
+ case TK_GT:
+ case TK_GE:
+ testcase( pExpr->op==TK_EQ );
+ testcase( pExpr->op==TK_NE );
+ testcase( pExpr->op==TK_LT );
+ testcase( pExpr->op==TK_LE );
+ testcase( pExpr->op==TK_GT );
+ testcase( pExpr->op==TK_GE );
+ if( (pExpr->pLeft->op==TK_COLUMN && IsVirtual(pExpr->pLeft->pTab))
+ || (pExpr->pRight->op==TK_COLUMN && IsVirtual(pExpr->pRight->pTab))
+ ){
+ return WRC_Prune;
+ }
+ default:
+ return WRC_Continue;
+ }
+}
+
+/*
+** Return true (non-zero) if expression p can only be true if at least
+** one column of table iTab is non-null. In other words, return true
+** if expression p will always be NULL or false if every column of iTab
+** is NULL.
+**
+** False negatives are acceptable. In other words, it is ok to return
+** zero even if expression p will never be true of every column of iTab
+** is NULL. A false negative is merely a missed optimization opportunity.
+**
+** False positives are not allowed, however. A false positive may result
+** in an incorrect answer.
+**
+** Terms of p that are marked with EP_FromJoin (and hence that come from
+** the ON or USING clauses of LEFT JOINS) are excluded from the analysis.
+**
+** This routine is used to check if a LEFT JOIN can be converted into
+** an ordinary JOIN. The p argument is the WHERE clause. If the WHERE
+** clause requires that some column of the right table of the LEFT JOIN
+** be non-NULL, then the LEFT JOIN can be safely converted into an
+** ordinary join.
+*/
+SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr *p, int iTab){
+ Walker w;
+ w.xExprCallback = impliesNotNullRow;
+ w.xSelectCallback = 0;
+ w.xSelectCallback2 = 0;
+ w.eCode = 0;
+ w.u.iCur = iTab;
+ sqlite3WalkExpr(&w, p);
+ return w.eCode;
+}
+
+/*
** An instance of the following structure is used by the tree walker
** to determine if an expression can be evaluated by reference to the
** index only, without having to do a search for the corresponding
@@ -96858,8 +100006,9 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
NameContext *pNC = pWalker->u.pNC;
Parse *pParse = pNC->pParse;
SrcList *pSrcList = pNC->pSrcList;
- AggInfo *pAggInfo = pNC->pAggInfo;
+ AggInfo *pAggInfo = pNC->uNC.pAggInfo;
+ assert( pNC->ncFlags & NC_UAggInfo );
switch( pExpr->op ){
case TK_AGG_COLUMN:
case TK_COLUMN: {
@@ -98166,6 +101315,10 @@ static void openStatTable(
"DELETE FROM %Q.%s WHERE %s=%Q",
pDb->zDbSName, zTab, zWhereType, zWhere
);
+#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
+ }else if( db->xPreUpdateCallback ){
+ sqlite3NestedParse(pParse, "DELETE FROM %Q.%s", pDb->zDbSName, zTab);
+#endif
}else{
/* The sqlite_stat[134] table already exists. Delete all rows. */
sqlite3VdbeAddOp2(v, OP_Clear, aRoot[i], iDb);
@@ -98930,6 +102083,9 @@ static void analyzeOneTable(
int regIdxname = iMem++; /* Register containing index name */
int regStat1 = iMem++; /* Value for the stat column of sqlite_stat1 */
int regPrev = iMem; /* MUST BE LAST (see below) */
+#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
+ Table *pStat1 = 0;
+#endif
pParse->nMem = MAX(pParse->nMem, iMem);
v = sqlite3GetVdbe(pParse);
@@ -98940,7 +102096,7 @@ static void analyzeOneTable(
/* Do not gather statistics on views or virtual tables */
return;
}
- if( sqlite3_strlike("sqlite_%", pTab->zName, 0)==0 ){
+ if( sqlite3_strlike("sqlite\\_%", pTab->zName, '\\')==0 ){
/* Do not gather statistics on system tables */
return;
}
@@ -98955,6 +102111,18 @@ static void analyzeOneTable(
}
#endif
+#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
+ if( db->xPreUpdateCallback ){
+ pStat1 = (Table*)sqlite3DbMallocZero(db, sizeof(Table) + 13);
+ if( pStat1==0 ) return;
+ pStat1->zName = (char*)&pStat1[1];
+ memcpy(pStat1->zName, "sqlite_stat1", 13);
+ pStat1->nCol = 3;
+ pStat1->iPKey = -1;
+ sqlite3VdbeAddOp4(pParse->pVdbe, OP_Noop, 0, 0, 0,(char*)pStat1,P4_DYNBLOB);
+ }
+#endif
+
/* Establish a read-lock on the table at the shared-cache level.
** Open a read-only cursor on the table. Also allocate a cursor number
** to use for scanning indexes (iIdxCur). No index cursor is opened at
@@ -99156,6 +102324,9 @@ static void analyzeOneTable(
sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regTemp, "BBB", 0);
sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regNewRowid);
sqlite3VdbeAddOp3(v, OP_Insert, iStatCur, regTemp, regNewRowid);
+#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
+ sqlite3VdbeChangeP4(v, -1, (char*)pStat1, P4_TABLE);
+#endif
sqlite3VdbeChangeP5(v, OPFLAG_APPEND);
/* Add the entries to the stat3 or stat4 table. */
@@ -99219,6 +102390,9 @@ static void analyzeOneTable(
sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regNewRowid);
sqlite3VdbeAddOp3(v, OP_Insert, iStatCur, regTemp, regNewRowid);
sqlite3VdbeChangeP5(v, OPFLAG_APPEND);
+#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
+ sqlite3VdbeChangeP4(v, -1, (char*)pStat1, P4_TABLE);
+#endif
sqlite3VdbeJumpHere(v, jZeroRows);
}
}
@@ -99901,6 +103075,10 @@ static int resolveAttachExpr(NameContext *pName, Expr *pExpr)
**
** If the optional "KEY z" syntax is omitted, an SQL NULL is passed as the
** third argument.
+**
+** If the db->init.reopenMemdb flags is set, then instead of attaching a
+** new database, close the database on db->init.iDb and reopen it as an
+** empty MemDB.
*/
static void attachFunc(
sqlite3_context *context,
@@ -99921,66 +103099,86 @@ static void attachFunc(
sqlite3_vfs *pVfs;
UNUSED_PARAMETER(NotUsed);
-
zFile = (const char *)sqlite3_value_text(argv[0]);
zName = (const char *)sqlite3_value_text(argv[1]);
if( zFile==0 ) zFile = "";
if( zName==0 ) zName = "";
- /* Check for the following errors:
- **
- ** * Too many attached databases,
- ** * Transaction currently open
- ** * Specified database name already being used.
- */
- if( db->nDb>=db->aLimit[SQLITE_LIMIT_ATTACHED]+2 ){
- zErrDyn = sqlite3MPrintf(db, "too many attached databases - max %d",
- db->aLimit[SQLITE_LIMIT_ATTACHED]
- );
- goto attach_error;
- }
- for(i=0; i<db->nDb; i++){
- char *z = db->aDb[i].zDbSName;
- assert( z && zName );
- if( sqlite3StrICmp(z, zName)==0 ){
- zErrDyn = sqlite3MPrintf(db, "database %s is already in use", zName);
+#ifdef SQLITE_ENABLE_DESERIALIZE
+# define REOPEN_AS_MEMDB(db) (db->init.reopenMemdb)
+#else
+# define REOPEN_AS_MEMDB(db) (0)
+#endif
+
+ if( REOPEN_AS_MEMDB(db) ){
+ /* This is not a real ATTACH. Instead, this routine is being called
+ ** from sqlite3_deserialize() to close database db->init.iDb and
+ ** reopen it as a MemDB */
+ pVfs = sqlite3_vfs_find("memdb");
+ if( pVfs==0 ) return;
+ pNew = &db->aDb[db->init.iDb];
+ if( pNew->pBt ) sqlite3BtreeClose(pNew->pBt);
+ pNew->pBt = 0;
+ pNew->pSchema = 0;
+ rc = sqlite3BtreeOpen(pVfs, "x", db, &pNew->pBt, 0, SQLITE_OPEN_MAIN_DB);
+ }else{
+ /* This is a real ATTACH
+ **
+ ** Check for the following errors:
+ **
+ ** * Too many attached databases,
+ ** * Transaction currently open
+ ** * Specified database name already being used.
+ */
+ if( db->nDb>=db->aLimit[SQLITE_LIMIT_ATTACHED]+2 ){
+ zErrDyn = sqlite3MPrintf(db, "too many attached databases - max %d",
+ db->aLimit[SQLITE_LIMIT_ATTACHED]
+ );
goto attach_error;
}
+ for(i=0; i<db->nDb; i++){
+ char *z = db->aDb[i].zDbSName;
+ assert( z && zName );
+ if( sqlite3StrICmp(z, zName)==0 ){
+ zErrDyn = sqlite3MPrintf(db, "database %s is already in use", zName);
+ goto attach_error;
+ }
+ }
+
+ /* Allocate the new entry in the db->aDb[] array and initialize the schema
+ ** hash tables.
+ */
+ if( db->aDb==db->aDbStatic ){
+ aNew = sqlite3DbMallocRawNN(db, sizeof(db->aDb[0])*3 );
+ if( aNew==0 ) return;
+ memcpy(aNew, db->aDb, sizeof(db->aDb[0])*2);
+ }else{
+ aNew = sqlite3DbRealloc(db, db->aDb, sizeof(db->aDb[0])*(db->nDb+1) );
+ if( aNew==0 ) return;
+ }
+ db->aDb = aNew;
+ pNew = &db->aDb[db->nDb];
+ memset(pNew, 0, sizeof(*pNew));
+
+ /* Open the database file. If the btree is successfully opened, use
+ ** it to obtain the database schema. At this point the schema may
+ ** or may not be initialized.
+ */
+ flags = db->openFlags;
+ rc = sqlite3ParseUri(db->pVfs->zName, zFile, &flags, &pVfs, &zPath, &zErr);
+ if( rc!=SQLITE_OK ){
+ if( rc==SQLITE_NOMEM ) sqlite3OomFault(db);
+ sqlite3_result_error(context, zErr, -1);
+ sqlite3_free(zErr);
+ return;
+ }
+ assert( pVfs );
+ flags |= SQLITE_OPEN_MAIN_DB;
+ rc = sqlite3BtreeOpen(pVfs, zPath, db, &pNew->pBt, 0, flags);
+ sqlite3_free( zPath );
+ db->nDb++;
}
-
- /* Allocate the new entry in the db->aDb[] array and initialize the schema
- ** hash tables.
- */
- if( db->aDb==db->aDbStatic ){
- aNew = sqlite3DbMallocRawNN(db, sizeof(db->aDb[0])*3 );
- if( aNew==0 ) return;
- memcpy(aNew, db->aDb, sizeof(db->aDb[0])*2);
- }else{
- aNew = sqlite3DbRealloc(db, db->aDb, sizeof(db->aDb[0])*(db->nDb+1) );
- if( aNew==0 ) return;
- }
- db->aDb = aNew;
- pNew = &db->aDb[db->nDb];
- memset(pNew, 0, sizeof(*pNew));
-
- /* Open the database file. If the btree is successfully opened, use
- ** it to obtain the database schema. At this point the schema may
- ** or may not be initialized.
- */
- flags = db->openFlags;
- rc = sqlite3ParseUri(db->pVfs->zName, zFile, &flags, &pVfs, &zPath, &zErr);
- if( rc!=SQLITE_OK ){
- if( rc==SQLITE_NOMEM ) sqlite3OomFault(db);
- sqlite3_result_error(context, zErr, -1);
- sqlite3_free(zErr);
- return;
- }
- assert( pVfs );
- flags |= SQLITE_OPEN_MAIN_DB;
- rc = sqlite3BtreeOpen(pVfs, zPath, db, &pNew->pBt, 0, flags);
- sqlite3_free( zPath );
- db->nDb++;
- db->skipBtreeMutex = 0;
+ db->noSharedCache = 0;
if( rc==SQLITE_CONSTRAINT ){
rc = SQLITE_ERROR;
zErrDyn = sqlite3MPrintf(db, "database is already attached");
@@ -100006,7 +103204,7 @@ static void attachFunc(
sqlite3BtreeLeave(pNew->pBt);
}
pNew->safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1;
- pNew->zDbSName = sqlite3DbStrDup(db, zName);
+ if( !REOPEN_AS_MEMDB(db) ) pNew->zDbSName = sqlite3DbStrDup(db, zName);
if( rc==SQLITE_OK && pNew->zDbSName==0 ){
rc = SQLITE_NOMEM_BKPT;
}
@@ -100046,13 +103244,16 @@ static void attachFunc(
/* If the file was opened successfully, read the schema for the new database.
** If this fails, or if opening the file failed, then close the file and
- ** remove the entry from the db->aDb[] array. i.e. put everything back the way
- ** we found it.
+ ** remove the entry from the db->aDb[] array. i.e. put everything back the
+ ** way we found it.
*/
if( rc==SQLITE_OK ){
sqlite3BtreeEnterAll(db);
+ db->init.iDb = 0;
+ db->mDbFlags &= ~(DBFLAG_SchemaKnownOk);
rc = sqlite3Init(db, &zErrDyn);
sqlite3BtreeLeaveAll(db);
+ assert( zErrDyn==0 || rc!=SQLITE_OK );
}
#ifdef SQLITE_USER_AUTHENTICATION
if( rc==SQLITE_OK ){
@@ -100064,21 +103265,23 @@ static void attachFunc(
}
#endif
if( rc ){
- int iDb = db->nDb - 1;
- assert( iDb>=2 );
- if( db->aDb[iDb].pBt ){
- sqlite3BtreeClose(db->aDb[iDb].pBt);
- db->aDb[iDb].pBt = 0;
- db->aDb[iDb].pSchema = 0;
- }
- sqlite3ResetAllSchemasOfConnection(db);
- db->nDb = iDb;
- if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){
- sqlite3OomFault(db);
- sqlite3DbFree(db, zErrDyn);
- zErrDyn = sqlite3MPrintf(db, "out of memory");
- }else if( zErrDyn==0 ){
- zErrDyn = sqlite3MPrintf(db, "unable to open database: %s", zFile);
+ if( !REOPEN_AS_MEMDB(db) ){
+ int iDb = db->nDb - 1;
+ assert( iDb>=2 );
+ if( db->aDb[iDb].pBt ){
+ sqlite3BtreeClose(db->aDb[iDb].pBt);
+ db->aDb[iDb].pBt = 0;
+ db->aDb[iDb].pSchema = 0;
+ }
+ sqlite3ResetAllSchemasOfConnection(db);
+ db->nDb = iDb;
+ if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){
+ sqlite3OomFault(db);
+ sqlite3DbFree(db, zErrDyn);
+ zErrDyn = sqlite3MPrintf(db, "out of memory");
+ }else if( zErrDyn==0 ){
+ zErrDyn = sqlite3MPrintf(db, "unable to open database: %s", zFile);
+ }
}
goto attach_error;
}
@@ -100320,6 +103523,9 @@ SQLITE_PRIVATE int sqlite3FixSrcList(
if( sqlite3FixSelect(pFix, pItem->pSelect) ) return 1;
if( sqlite3FixExpr(pFix, pItem->pOn) ) return 1;
#endif
+ if( pItem->fg.isTabFunc && sqlite3FixExprList(pFix, pItem->u1.pFuncArg) ){
+ return 1;
+ }
}
return 0;
}
@@ -100350,8 +103556,13 @@ SQLITE_PRIVATE int sqlite3FixSelect(
if( sqlite3FixExpr(pFix, pSelect->pLimit) ){
return 1;
}
- if( sqlite3FixExpr(pFix, pSelect->pOffset) ){
- return 1;
+ if( pSelect->pWith ){
+ int i;
+ for(i=0; i<pSelect->pWith->nCte; i++){
+ if( sqlite3FixSelect(pFix, pSelect->pWith->a[i].pSelect) ){
+ return 1;
+ }
+ }
}
pSelect = pSelect->pPrior;
}
@@ -100414,6 +103625,18 @@ SQLITE_PRIVATE int sqlite3FixTriggerStep(
if( sqlite3FixExprList(pFix, pStep->pExprList) ){
return 1;
}
+#ifndef SQLITE_OMIT_UPSERT
+ if( pStep->pUpsert ){
+ Upsert *pUp = pStep->pUpsert;
+ if( sqlite3FixExprList(pFix, pUp->pUpsertTarget)
+ || sqlite3FixExpr(pFix, pUp->pUpsertTargetWhere)
+ || sqlite3FixExprList(pFix, pUp->pUpsertSet)
+ || sqlite3FixExpr(pFix, pUp->pUpsertWhere)
+ ){
+ return 1;
+ }
+ }
+#endif
pStep = pStep->pNext;
}
return 0;
@@ -100574,6 +103797,7 @@ SQLITE_PRIVATE void sqlite3AuthRead(
int iDb; /* The index of the database the expression refers to */
int iCol; /* Index of column in table */
+ assert( pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER );
if( db->xAuth==0 ) return;
iDb = sqlite3SchemaToIndex(pParse->db, pSchema);
if( iDb<0 ){
@@ -100582,7 +103806,6 @@ SQLITE_PRIVATE void sqlite3AuthRead(
return;
}
- assert( pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER );
if( pExpr->op==TK_TRIGGER ){
pTab = pParse->pTriggerTab;
}else{
@@ -101041,24 +104264,27 @@ SQLITE_PRIVATE Table *sqlite3LocateTable(
const char *zDbase /* Name of the database. Might be NULL */
){
Table *p;
+ sqlite3 *db = pParse->db;
/* Read the database schema. If an error occurs, leave an error message
** and code in pParse and return NULL. */
- if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
+ if( (db->mDbFlags & DBFLAG_SchemaKnownOk)==0
+ && SQLITE_OK!=sqlite3ReadSchema(pParse)
+ ){
return 0;
}
- p = sqlite3FindTable(pParse->db, zName, zDbase);
+ p = sqlite3FindTable(db, zName, zDbase);
if( p==0 ){
const char *zMsg = flags & LOCATE_VIEW ? "no such view" : "no such table";
#ifndef SQLITE_OMIT_VIRTUALTABLE
- if( sqlite3FindDbName(pParse->db, zDbase)<1 ){
+ if( sqlite3FindDbName(db, zDbase)<1 ){
/* If zName is the not the name of a table in the schema created using
** CREATE, then check to see if it is the name of an virtual table that
** can be an eponymous virtual table. */
- Module *pMod = (Module*)sqlite3HashFind(&pParse->db->aModule, zName);
+ Module *pMod = (Module*)sqlite3HashFind(&db->aModule, zName);
if( pMod==0 && sqlite3_strnicmp(zName, "pragma_", 7)==0 ){
- pMod = sqlite3PragmaVtabRegister(pParse->db, zName);
+ pMod = sqlite3PragmaVtabRegister(db, zName);
}
if( pMod && sqlite3VtabEponymousTableInit(pParse, pMod) ){
return pMod->pEpoTab;
@@ -101223,6 +104449,7 @@ SQLITE_PRIVATE void sqlite3ResetOneSchema(sqlite3 *db, int iDb){
assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
DbSetProperty(db, iDb, DB_ResetWanted);
DbSetProperty(db, 1, DB_ResetWanted);
+ db->mDbFlags &= ~DBFLAG_SchemaKnownOk;
}
if( db->nSchemaLock==0 ){
@@ -101248,7 +104475,7 @@ SQLITE_PRIVATE void sqlite3ResetAllSchemasOfConnection(sqlite3 *db){
sqlite3SchemaClear(pDb->pSchema);
}
}
- db->mDbFlags &= ~DBFLAG_SchemaChange;
+ db->mDbFlags &= ~(DBFLAG_SchemaChange|DBFLAG_SchemaKnownOk);
sqlite3VtabUnlockList(db);
sqlite3BtreeLeaveAll(db);
sqlite3CollapseDatabaseArray(db);
@@ -101793,15 +105020,20 @@ SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token *pName, Token *pType){
if( pType->n==0 ){
/* If there is no type specified, columns have the default affinity
- ** 'BLOB'. */
+ ** 'BLOB' with a default size of 4 bytes. */
pCol->affinity = SQLITE_AFF_BLOB;
pCol->szEst = 1;
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ if( 4>=sqlite3GlobalConfig.szSorterRef ){
+ pCol->colFlags |= COLFLAG_SORTERREF;
+ }
+#endif
}else{
zType = z + sqlite3Strlen30(z) + 1;
memcpy(zType, pType->z, pType->n);
zType[pType->n] = 0;
sqlite3Dequote(zType);
- pCol->affinity = sqlite3AffinityType(zType, &pCol->szEst);
+ pCol->affinity = sqlite3AffinityType(zType, pCol);
pCol->colFlags |= COLFLAG_HASTYPE;
}
p->nCol++;
@@ -101816,10 +105048,24 @@ SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token *pName, Token *pType){
*/
SQLITE_PRIVATE void sqlite3AddNotNull(Parse *pParse, int onError){
Table *p;
+ Column *pCol;
p = pParse->pNewTable;
if( p==0 || NEVER(p->nCol<1) ) return;
- p->aCol[p->nCol-1].notNull = (u8)onError;
+ pCol = &p->aCol[p->nCol-1];
+ pCol->notNull = (u8)onError;
p->tabFlags |= TF_HasNotNull;
+
+ /* Set the uniqNotNull flag on any UNIQUE or PK indexes already created
+ ** on this column. */
+ if( pCol->colFlags & COLFLAG_UNIQUE ){
+ Index *pIdx;
+ for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){
+ assert( pIdx->nKeyCol==1 && pIdx->onError!=OE_None );
+ if( pIdx->aiColumn[0]==p->nCol-1 ){
+ pIdx->uniqNotNull = 1;
+ }
+ }
+ }
}
/*
@@ -101847,7 +105093,7 @@ SQLITE_PRIVATE void sqlite3AddNotNull(Parse *pParse, int onError){
** If none of the substrings in the above table are found,
** SQLITE_AFF_NUMERIC is returned.
*/
-SQLITE_PRIVATE char sqlite3AffinityType(const char *zIn, u8 *pszEst){
+SQLITE_PRIVATE char sqlite3AffinityType(const char *zIn, Column *pCol){
u32 h = 0;
char aff = SQLITE_AFF_NUMERIC;
const char *zChar = 0;
@@ -101884,27 +105130,32 @@ SQLITE_PRIVATE char sqlite3AffinityType(const char *zIn, u8 *pszEst){
}
}
- /* If pszEst is not NULL, store an estimate of the field size. The
+ /* If pCol is not NULL, store an estimate of the field size. The
** estimate is scaled so that the size of an integer is 1. */
- if( pszEst ){
- *pszEst = 1; /* default size is approx 4 bytes */
+ if( pCol ){
+ int v = 0; /* default size is approx 4 bytes */
if( aff<SQLITE_AFF_NUMERIC ){
if( zChar ){
while( zChar[0] ){
if( sqlite3Isdigit(zChar[0]) ){
- int v = 0;
+ /* BLOB(k), VARCHAR(k), CHAR(k) -> r=(k/4+1) */
sqlite3GetInt32(zChar, &v);
- v = v/4 + 1;
- if( v>255 ) v = 255;
- *pszEst = v; /* BLOB(k), VARCHAR(k), CHAR(k) -> r=(k/4+1) */
break;
}
zChar++;
}
}else{
- *pszEst = 5; /* BLOB, TEXT, CLOB -> r=5 (approx 20 bytes)*/
+ v = 16; /* BLOB, TEXT, CLOB -> r=5 (approx 20 bytes)*/
}
}
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ if( v>=sqlite3GlobalConfig.szSorterRef ){
+ pCol->colFlags |= COLFLAG_SORTERREF;
+ }
+#endif
+ v = v/4 + 1;
+ if( v>255 ) v = 255;
+ pCol->szEst = v;
}
return aff;
}
@@ -101919,34 +105170,37 @@ SQLITE_PRIVATE char sqlite3AffinityType(const char *zIn, u8 *pszEst){
** This routine is called by the parser while in the middle of
** parsing a CREATE TABLE statement.
*/
-SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse *pParse, ExprSpan *pSpan){
+SQLITE_PRIVATE void sqlite3AddDefaultValue(
+ Parse *pParse, /* Parsing context */
+ Expr *pExpr, /* The parsed expression of the default value */
+ const char *zStart, /* Start of the default value text */
+ const char *zEnd /* First character past end of defaut value text */
+){
Table *p;
Column *pCol;
sqlite3 *db = pParse->db;
p = pParse->pNewTable;
if( p!=0 ){
pCol = &(p->aCol[p->nCol-1]);
- if( !sqlite3ExprIsConstantOrFunction(pSpan->pExpr, db->init.busy) ){
+ if( !sqlite3ExprIsConstantOrFunction(pExpr, db->init.busy) ){
sqlite3ErrorMsg(pParse, "default value of column [%s] is not constant",
pCol->zName);
}else{
/* A copy of pExpr is used instead of the original, as pExpr contains
- ** tokens that point to volatile memory. The 'span' of the expression
- ** is required by pragma table_info.
+ ** tokens that point to volatile memory.
*/
Expr x;
sqlite3ExprDelete(db, pCol->pDflt);
memset(&x, 0, sizeof(x));
x.op = TK_SPAN;
- x.u.zToken = sqlite3DbStrNDup(db, (char*)pSpan->zStart,
- (int)(pSpan->zEnd - pSpan->zStart));
- x.pLeft = pSpan->pExpr;
+ x.u.zToken = sqlite3DbSpanDup(db, zStart, zEnd);
+ x.pLeft = pExpr;
x.flags = EP_Skip;
pCol->pDflt = sqlite3ExprDup(db, &x, EXPRDUP_REDUCE);
sqlite3DbFree(db, x.u.zToken);
}
}
- sqlite3ExprDelete(db, pSpan->pExpr);
+ sqlite3ExprDelete(db, pExpr);
}
/*
@@ -102177,7 +105431,7 @@ SQLITE_PRIVATE void sqlite3ChangeCookie(Parse *pParse, int iDb){
Vdbe *v = pParse->pVdbe;
assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_SCHEMA_VERSION,
- db->aDb[iDb].pSchema->schema_cookie+1);
+ (int)(1+(unsigned)db->aDb[iDb].pSchema->schema_cookie));
}
/*
@@ -102551,8 +105805,6 @@ SQLITE_PRIVATE void sqlite3EndTable(
p = pParse->pNewTable;
if( p==0 ) return;
- assert( !db->init.busy || !pSelect );
-
/* If the db->init.busy is 1 it means we are reading the SQL off the
** "sqlite_master" or "sqlite_temp_master" table on the disk.
** So do not write to the disk again. Extract the root page number
@@ -102563,6 +105815,10 @@ SQLITE_PRIVATE void sqlite3EndTable(
** table itself. So mark it read-only.
*/
if( db->init.busy ){
+ if( pSelect ){
+ sqlite3ErrorMsg(pParse, "");
+ return;
+ }
p->tnum = db->init.newTnum;
if( p->tnum==1 ) p->tabFlags |= TF_Readonly;
}
@@ -102663,10 +105919,6 @@ SQLITE_PRIVATE void sqlite3EndTable(
pParse->nTab = 2;
addrTop = sqlite3VdbeCurrentAddr(v) + 1;
sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, addrTop);
- sqlite3SelectDestInit(&dest, SRT_Coroutine, regYield);
- sqlite3Select(pParse, pSelect, &dest);
- sqlite3VdbeEndCoroutine(v, regYield);
- sqlite3VdbeJumpHere(v, addrTop - 1);
if( pParse->nErr ) return;
pSelTab = sqlite3ResultSetOfSelect(pParse, pSelect);
if( pSelTab==0 ) return;
@@ -102676,6 +105928,11 @@ SQLITE_PRIVATE void sqlite3EndTable(
pSelTab->nCol = 0;
pSelTab->aCol = 0;
sqlite3DeleteTable(db, pSelTab);
+ sqlite3SelectDestInit(&dest, SRT_Coroutine, regYield);
+ sqlite3Select(pParse, pSelect, &dest);
+ if( pParse->nErr ) return;
+ sqlite3VdbeEndCoroutine(v, regYield);
+ sqlite3VdbeJumpHere(v, addrTop - 1);
addrInsLoop = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm);
VdbeCoverage(v);
sqlite3VdbeAddOp3(v, OP_MakeRecord, dest.iSdst, dest.nSdst, regRec);
@@ -102818,7 +106075,7 @@ SQLITE_PRIVATE void sqlite3CreateView(
** the end.
*/
sEnd = pParse->sLastToken;
- assert( sEnd.z[0]!=0 );
+ assert( sEnd.z[0]!=0 || sEnd.n==0 );
if( sEnd.z[0]!=';' ){
sEnd.z += sEnd.n;
}
@@ -102852,7 +106109,7 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){
int nErr = 0; /* Number of errors encountered */
int n; /* Temporarily holds the number of cursors assigned */
sqlite3 *db = pParse->db; /* Database connection for malloc errors */
-#ifndef SQLITE_OMIT_VIRTUALTABLE
+#ifndef SQLITE_OMIT_VIRTUALTABLE
int rc;
#endif
#ifndef SQLITE_OMIT_AUTHORIZATION
@@ -103507,6 +106764,7 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead);
addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, 0); VdbeCoverage(v);
regRecord = sqlite3GetTempReg(pParse);
+ sqlite3MultiWrite(pParse);
sqlite3GenerateIndexKey(pParse,pIndex,iTab,regRecord,0,&iPartIdxLabel,0,0);
sqlite3VdbeAddOp2(v, OP_SorterInsert, iSorter, regRecord);
@@ -103520,12 +106778,13 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
addr1 = sqlite3VdbeAddOp2(v, OP_SorterSort, iSorter, 0); VdbeCoverage(v);
if( IsUniqueIndex(pIndex) ){
- int j2 = sqlite3VdbeCurrentAddr(v) + 3;
- sqlite3VdbeGoto(v, j2);
+ int j2 = sqlite3VdbeGoto(v, 1);
addr2 = sqlite3VdbeCurrentAddr(v);
+ sqlite3VdbeVerifyAbortable(v, OE_Abort);
sqlite3VdbeAddOp4Int(v, OP_SorterCompare, iSorter, j2, regRecord,
pIndex->nKeyCol); VdbeCoverage(v);
sqlite3UniqueConstraint(pParse, OE_Abort, pIndex);
+ sqlite3VdbeJumpHere(v, j2);
}else{
addr2 = sqlite3VdbeCurrentAddr(v);
}
@@ -103688,7 +106947,11 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
#if SQLITE_USER_AUTHENTICATION
&& sqlite3UserAuthTable(pTab->zName)==0
#endif
- && sqlite3StrNICmp(&pTab->zName[7],"altertab_",9)!=0 ){
+#ifdef SQLITE_ALLOW_SQLITE_MASTER_INDEX
+ && sqlite3StrICmp(&pTab->zName[7],"master")!=0
+#endif
+ && sqlite3StrNICmp(&pTab->zName[7],"altertab_",9)!=0
+ ){
sqlite3ErrorMsg(pParse, "table %s may not be indexed", pTab->zName);
goto exit_create_index;
}
@@ -103779,7 +107042,9 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
*/
if( pList==0 ){
Token prevCol;
- sqlite3TokenInit(&prevCol, pTab->aCol[pTab->nCol-1].zName);
+ Column *pCol = &pTab->aCol[pTab->nCol-1];
+ pCol->colFlags |= COLFLAG_UNIQUE;
+ sqlite3TokenInit(&prevCol, pCol->zName);
pList = sqlite3ExprListAppend(pParse, 0,
sqlite3ExprAlloc(db, TK_ID, &prevCol, 0));
if( pList==0 ) goto exit_create_index;
@@ -104550,9 +107815,10 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm(
goto append_from_error;
}
p = sqlite3SrcListAppend(db, p, pTable, pDatabase);
- if( p==0 || NEVER(p->nSrc==0) ){
+ if( p==0 ){
goto append_from_error;
}
+ assert( p->nSrc>0 );
pItem = &p->a[p->nSrc-1];
assert( pAlias!=0 );
if( pAlias->n ){
@@ -104864,16 +108130,16 @@ SQLITE_PRIVATE void sqlite3UniqueConstraint(
sqlite3StrAccumInit(&errMsg, pParse->db, 0, 0, 200);
if( pIdx->aColExpr ){
- sqlite3XPrintf(&errMsg, "index '%q'", pIdx->zName);
+ sqlite3_str_appendf(&errMsg, "index '%q'", pIdx->zName);
}else{
for(j=0; j<pIdx->nKeyCol; j++){
char *zCol;
assert( pIdx->aiColumn[j]>=0 );
zCol = pTab->aCol[pIdx->aiColumn[j]].zName;
- if( j ) sqlite3StrAccumAppend(&errMsg, ", ", 2);
- sqlite3StrAccumAppendAll(&errMsg, pTab->zName);
- sqlite3StrAccumAppend(&errMsg, ".", 1);
- sqlite3StrAccumAppendAll(&errMsg, zCol);
+ if( j ) sqlite3_str_append(&errMsg, ", ", 2);
+ sqlite3_str_appendall(&errMsg, pTab->zName);
+ sqlite3_str_append(&errMsg, ".", 1);
+ sqlite3_str_appendall(&errMsg, zCol);
}
}
zErr = sqlite3StrAccumFinish(&errMsg);
@@ -105061,6 +108327,18 @@ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoOfIndex(Parse *pParse, Index *pIdx){
pKey->aSortOrder[i] = pIdx->aSortOrder[i];
}
if( pParse->nErr ){
+ assert( pParse->rc==SQLITE_ERROR_MISSING_COLLSEQ );
+ if( pIdx->bNoQuery==0 ){
+ /* Deactivate the index because it contains an unknown collating
+ ** sequence. The only way to reactive the index is to reload the
+ ** schema. Adding the missing collating sequence later does not
+ ** reactive the index. The application had the chance to register
+ ** the missing index using the collation-needed callback. For
+ ** simplicity, SQLite will not give the application a second chance.
+ */
+ pIdx->bNoQuery = 1;
+ pParse->rc = SQLITE_ERROR_RETRY;
+ }
sqlite3KeyInfoUnref(pKey);
pKey = 0;
}
@@ -105246,6 +108524,7 @@ SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq(
assert( !p || p->xCmp );
if( p==0 ){
sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName);
+ pParse->rc = SQLITE_ERROR_MISSING_COLLSEQ;
}
return p;
}
@@ -105546,10 +108825,12 @@ SQLITE_PRIVATE FuncDef *sqlite3FindFunction(
if( createFlag && bestScore<FUNC_PERFECT_MATCH &&
(pBest = sqlite3DbMallocZero(db, sizeof(*pBest)+nName+1))!=0 ){
FuncDef *pOther;
+ u8 *z;
pBest->zName = (const char*)&pBest[1];
pBest->nArg = (u16)nArg;
pBest->funcFlags = enc;
memcpy((char*)&pBest[1], zName, nName+1);
+ for(z=(u8*)pBest->zName; *z; z++) *z = sqlite3UpperToLower[*z];
pOther = (FuncDef*)sqlite3HashInsert(&db->aFunc, pBest->zName, pBest);
if( pOther==pBest ){
sqlite3DbFree(db, pBest);
@@ -105719,6 +109000,8 @@ SQLITE_PRIVATE void sqlite3MaterializeView(
Parse *pParse, /* Parsing context */
Table *pView, /* View definition */
Expr *pWhere, /* Optional WHERE clause to be added */
+ ExprList *pOrderBy, /* Optional ORDER BY clause */
+ Expr *pLimit, /* Optional LIMIT clause */
int iCur /* Cursor number for ephemeral table */
){
SelectDest dest;
@@ -105735,8 +109018,8 @@ SQLITE_PRIVATE void sqlite3MaterializeView(
assert( pFrom->a[0].pOn==0 );
assert( pFrom->a[0].pUsing==0 );
}
- pSel = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, 0,
- SF_IncludeHidden, 0, 0);
+ pSel = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, pOrderBy,
+ SF_IncludeHidden, pLimit);
sqlite3SelectDestInit(&dest, SRT_EphemTab, iCur);
sqlite3Select(pParse, pSel, &dest);
sqlite3SelectDelete(db, pSel);
@@ -105758,29 +109041,29 @@ SQLITE_PRIVATE Expr *sqlite3LimitWhere(
Expr *pWhere, /* The WHERE clause. May be null */
ExprList *pOrderBy, /* The ORDER BY clause. May be null */
Expr *pLimit, /* The LIMIT clause. May be null */
- Expr *pOffset, /* The OFFSET clause. May be null */
char *zStmtType /* Either DELETE or UPDATE. For err msgs. */
){
- Expr *pWhereRowid = NULL; /* WHERE rowid .. */
+ sqlite3 *db = pParse->db;
+ Expr *pLhs = NULL; /* LHS of IN(SELECT...) operator */
Expr *pInClause = NULL; /* WHERE rowid IN ( select ) */
- Expr *pSelectRowid = NULL; /* SELECT rowid ... */
ExprList *pEList = NULL; /* Expression list contaning only pSelectRowid */
SrcList *pSelectSrc = NULL; /* SELECT rowid FROM x ... (dup of pSrc) */
Select *pSelect = NULL; /* Complete SELECT tree */
+ Table *pTab;
/* Check that there isn't an ORDER BY without a LIMIT clause.
*/
- if( pOrderBy && (pLimit == 0) ) {
+ if( pOrderBy && pLimit==0 ) {
sqlite3ErrorMsg(pParse, "ORDER BY without LIMIT on %s", zStmtType);
- goto limit_where_cleanup;
+ sqlite3ExprDelete(pParse->db, pWhere);
+ sqlite3ExprListDelete(pParse->db, pOrderBy);
+ return 0;
}
/* We only need to generate a select expression if there
** is a limit/offset term to enforce.
*/
if( pLimit == 0 ) {
- /* if pLimit is null, pOffset will always be null as well. */
- assert( pOffset == 0 );
return pWhere;
}
@@ -105793,36 +109076,47 @@ SQLITE_PRIVATE Expr *sqlite3LimitWhere(
** );
*/
- pSelectRowid = sqlite3PExpr(pParse, TK_ROW, 0, 0);
- if( pSelectRowid == 0 ) goto limit_where_cleanup;
- pEList = sqlite3ExprListAppend(pParse, 0, pSelectRowid);
- if( pEList == 0 ) goto limit_where_cleanup;
+ pTab = pSrc->a[0].pTab;
+ if( HasRowid(pTab) ){
+ pLhs = sqlite3PExpr(pParse, TK_ROW, 0, 0);
+ pEList = sqlite3ExprListAppend(
+ pParse, 0, sqlite3PExpr(pParse, TK_ROW, 0, 0)
+ );
+ }else{
+ Index *pPk = sqlite3PrimaryKeyIndex(pTab);
+ if( pPk->nKeyCol==1 ){
+ const char *zName = pTab->aCol[pPk->aiColumn[0]].zName;
+ pLhs = sqlite3Expr(db, TK_ID, zName);
+ pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db, TK_ID, zName));
+ }else{
+ int i;
+ for(i=0; i<pPk->nKeyCol; i++){
+ Expr *p = sqlite3Expr(db, TK_ID, pTab->aCol[pPk->aiColumn[i]].zName);
+ pEList = sqlite3ExprListAppend(pParse, pEList, p);
+ }
+ pLhs = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
+ if( pLhs ){
+ pLhs->x.pList = sqlite3ExprListDup(db, pEList, 0);
+ }
+ }
+ }
/* duplicate the FROM clause as it is needed by both the DELETE/UPDATE tree
** and the SELECT subtree. */
+ pSrc->a[0].pTab = 0;
pSelectSrc = sqlite3SrcListDup(pParse->db, pSrc, 0);
- if( pSelectSrc == 0 ) {
- sqlite3ExprListDelete(pParse->db, pEList);
- goto limit_where_cleanup;
- }
+ pSrc->a[0].pTab = pTab;
+ pSrc->a[0].pIBIndex = 0;
/* generate the SELECT expression tree. */
- pSelect = sqlite3SelectNew(pParse,pEList,pSelectSrc,pWhere,0,0,
- pOrderBy,0,pLimit,pOffset);
- if( pSelect == 0 ) return 0;
+ pSelect = sqlite3SelectNew(pParse, pEList, pSelectSrc, pWhere, 0 ,0,
+ pOrderBy,0,pLimit
+ );
/* now generate the new WHERE rowid IN clause for the DELETE/UDPATE */
- pWhereRowid = sqlite3PExpr(pParse, TK_ROW, 0, 0);
- pInClause = pWhereRowid ? sqlite3PExpr(pParse, TK_IN, pWhereRowid, 0) : 0;
+ pInClause = sqlite3PExpr(pParse, TK_IN, pLhs, 0);
sqlite3PExprAddSelect(pParse, pInClause, pSelect);
return pInClause;
-
-limit_where_cleanup:
- sqlite3ExprDelete(pParse->db, pWhere);
- sqlite3ExprListDelete(pParse->db, pOrderBy);
- sqlite3ExprDelete(pParse->db, pLimit);
- sqlite3ExprDelete(pParse->db, pOffset);
- return 0;
}
#endif /* defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) */
/* && !defined(SQLITE_OMIT_SUBQUERY) */
@@ -105837,7 +109131,9 @@ limit_where_cleanup:
SQLITE_PRIVATE void sqlite3DeleteFrom(
Parse *pParse, /* The parser context */
SrcList *pTabList, /* The table from which we should delete things */
- Expr *pWhere /* The WHERE clause. May be null */
+ Expr *pWhere, /* The WHERE clause. May be null */
+ ExprList *pOrderBy, /* ORDER BY clause. May be null */
+ Expr *pLimit /* LIMIT clause. May be null */
){
Vdbe *v; /* The virtual database engine */
Table *pTab; /* The table from which records will be deleted */
@@ -105852,7 +109148,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
AuthContext sContext; /* Authorization context */
NameContext sNC; /* Name context to resolve expressions in */
int iDb; /* Database number */
- int memCnt = -1; /* Memory cell used for change counting */
+ int memCnt = 0; /* Memory cell used for change counting */
int rcauth; /* Value returned by authorization callback */
int eOnePass; /* ONEPASS_OFF or _SINGLE or _MULTI */
int aiCurOnePass[2]; /* The write cursors opened by WHERE_ONEPASS */
@@ -105882,6 +109178,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
}
assert( pTabList->nSrc==1 );
+
/* Locate the table which we want to delete. This table has to be
** put in an SrcList structure because some of the subroutines we
** will be calling are designed to work with multiple tables and expect
@@ -105896,16 +109193,26 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
#ifndef SQLITE_OMIT_TRIGGER
pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0);
isView = pTab->pSelect!=0;
- bComplex = pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0);
#else
# define pTrigger 0
# define isView 0
#endif
+ bComplex = pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0);
#ifdef SQLITE_OMIT_VIEW
# undef isView
# define isView 0
#endif
+#ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
+ if( !isView ){
+ pWhere = sqlite3LimitWhere(
+ pParse, pTabList, pWhere, pOrderBy, pLimit, "DELETE"
+ );
+ pOrderBy = 0;
+ pLimit = 0;
+ }
+#endif
+
/* If pTab is really a view, make sure it has been initialized.
*/
if( sqlite3ViewGetColumnNames(pParse, pTab) ){
@@ -105946,15 +109253,19 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
goto delete_from_cleanup;
}
if( pParse->nested==0 ) sqlite3VdbeCountChanges(v);
- sqlite3BeginWriteOperation(pParse, 1, iDb);
+ sqlite3BeginWriteOperation(pParse, bComplex, iDb);
/* If we are trying to delete from a view, realize that view into
** an ephemeral table.
*/
#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER)
if( isView ){
- sqlite3MaterializeView(pParse, pTab, pWhere, iTabCur);
+ sqlite3MaterializeView(pParse, pTab,
+ pWhere, pOrderBy, pLimit, iTabCur
+ );
iDataCur = iIdxCur = iTabCur;
+ pOrderBy = 0;
+ pLimit = 0;
}
#endif
@@ -105970,7 +109281,10 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
/* Initialize the counter of the number of rows deleted, if
** we are counting rows.
*/
- if( db->flags & SQLITE_CountRows ){
+ if( (db->flags & SQLITE_CountRows)!=0
+ && !pParse->nested
+ && !pParse->pTriggerTab
+ ){
memCnt = ++pParse->nMem;
sqlite3VdbeAddOp2(v, OP_Integer, 0, memCnt);
}
@@ -105998,7 +109312,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
assert( !isView );
sqlite3TableLock(pParse, iDb, pTab->tnum, 1, pTab->zName);
if( HasRowid(pTab) ){
- sqlite3VdbeAddOp4(v, OP_Clear, pTab->tnum, iDb, memCnt,
+ sqlite3VdbeAddOp4(v, OP_Clear, pTab->tnum, iDb, memCnt ? memCnt : -1,
pTab->zName, P4_STATIC);
}
for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
@@ -106043,9 +109357,10 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass);
assert( IsVirtual(pTab)==0 || eOnePass!=ONEPASS_MULTI );
assert( IsVirtual(pTab) || bComplex || eOnePass!=ONEPASS_OFF );
+ if( eOnePass!=ONEPASS_SINGLE ) sqlite3MultiWrite(pParse);
/* Keep track of the number of rows to be deleted */
- if( db->flags & SQLITE_CountRows ){
+ if( memCnt ){
sqlite3VdbeAddOp2(v, OP_AddImm, memCnt, 1);
}
@@ -106148,13 +109463,16 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
if( IsVirtual(pTab) ){
const char *pVTab = (const char *)sqlite3GetVTable(db, pTab);
sqlite3VtabMakeWritable(pParse, pTab);
- sqlite3VdbeAddOp4(v, OP_VUpdate, 0, 1, iKey, pVTab, P4_VTAB);
- sqlite3VdbeChangeP5(v, OE_Abort);
assert( eOnePass==ONEPASS_OFF || eOnePass==ONEPASS_SINGLE );
sqlite3MayAbort(pParse);
- if( eOnePass==ONEPASS_SINGLE && sqlite3IsToplevel(pParse) ){
- pParse->isMultiWrite = 0;
+ if( eOnePass==ONEPASS_SINGLE ){
+ sqlite3VdbeAddOp1(v, OP_Close, iTabCur);
+ if( sqlite3IsToplevel(pParse) ){
+ pParse->isMultiWrite = 0;
+ }
}
+ sqlite3VdbeAddOp4(v, OP_VUpdate, 0, 1, iKey, pVTab, P4_VTAB);
+ sqlite3VdbeChangeP5(v, OE_Abort);
}else
#endif
{
@@ -106188,7 +109506,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
** generating code because of a call to sqlite3NestedParse(), do not
** invoke the callback function.
*/
- if( (db->flags&SQLITE_CountRows) && !pParse->nested && !pParse->pTriggerTab ){
+ if( memCnt ){
sqlite3VdbeAddOp2(v, OP_ResultRow, memCnt, 1);
sqlite3VdbeSetNumCols(v, 1);
sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows deleted", SQLITE_STATIC);
@@ -106198,6 +109516,10 @@ delete_from_cleanup:
sqlite3AuthContextPop(&sContext);
sqlite3SrcListDelete(db, pTabList);
sqlite3ExprDelete(db, pWhere);
+#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT)
+ sqlite3ExprListDelete(db, pOrderBy);
+ sqlite3ExprDelete(db, pLimit);
+#endif
sqlite3DbFree(db, aToOpen);
return;
}
@@ -106355,7 +109677,7 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete(
u8 p5 = 0;
sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur,0,iIdxNoSeek);
sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, (count?OPFLAG_NCHANGE:0));
- if( pParse->nested==0 ){
+ if( pParse->nested==0 || 0==sqlite3_stricmp(pTab->zName, "sqlite_stat1") ){
sqlite3VdbeAppendP4(v, (char*)pTab, P4_TABLE);
}
if( eMode!=ONEPASS_OFF ){
@@ -106576,6 +109898,8 @@ static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){
** iteration of the aggregate loop.
*/
static void sqlite3SkipAccumulatorLoad(sqlite3_context *context){
+ assert( context->isError<=0 );
+ context->isError = -1;
context->skipFlag = 1;
}
@@ -106642,8 +109966,6 @@ static void lengthFunc(
int argc,
sqlite3_value **argv
){
- int len;
-
assert( argc==1 );
UNUSED_PARAMETER(argc);
switch( sqlite3_value_type(argv[0]) ){
@@ -106655,13 +109977,17 @@ static void lengthFunc(
}
case SQLITE_TEXT: {
const unsigned char *z = sqlite3_value_text(argv[0]);
+ const unsigned char *z0;
+ unsigned char c;
if( z==0 ) return;
- len = 0;
- while( *z ){
- len++;
- SQLITE_SKIP_UTF8(z);
+ z0 = z;
+ while( (c = *z)!=0 ){
+ z++;
+ if( c>=0xc0 ){
+ while( (*z & 0xc0)==0x80 ){ z++; z0++; }
+ }
}
- sqlite3_result_int(context, len);
+ sqlite3_result_int(context, (int)(z-z0));
break;
}
default: {
@@ -106788,7 +110114,7 @@ static void printfFunc(
x.apArg = argv+1;
sqlite3StrAccumInit(&str, db, 0, 0, db->aLimit[SQLITE_LIMIT_LENGTH]);
str.printfFlags = SQLITE_PRINTF_SQLFUNC;
- sqlite3XPrintf(&str, zFormat, &x);
+ sqlite3_str_appendf(&str, zFormat, &x);
n = str.nChar;
sqlite3_result_text(context, sqlite3StrAccumFinish(&str), n,
SQLITE_DYNAMIC);
@@ -107239,16 +110565,20 @@ static int patternCompare(
** c or cx.
*/
if( c<=0x80 ){
- u32 cx;
+ char zStop[3];
int bMatch;
if( noCase ){
- cx = sqlite3Toupper(c);
- c = sqlite3Tolower(c);
+ zStop[0] = sqlite3Toupper(c);
+ zStop[1] = sqlite3Tolower(c);
+ zStop[2] = 0;
}else{
- cx = c;
+ zStop[0] = c;
+ zStop[1] = 0;
}
- while( (c2 = *(zString++))!=0 ){
- if( c2!=c && c2!=cx ) continue;
+ while(1){
+ zString += strcspn((const char*)zString, zStop);
+ if( zString[0]==0 ) break;
+ zString++;
bMatch = patternCompare(zPattern,zString,pInfo,matchOther);
if( bMatch!=SQLITE_NOMATCH ) return bMatch;
}
@@ -107732,6 +111062,8 @@ static void replaceFunc(
i64 nOut; /* Maximum size of zOut */
int loopLimit; /* Last zStr[] that might match zPattern[] */
int i, j; /* Loop counters */
+ unsigned cntExpand; /* Number zOut expansions */
+ sqlite3 *db = sqlite3_context_db_handle(context);
assert( argc==3 );
UNUSED_PARAMETER(argc);
@@ -107763,33 +111095,40 @@ static void replaceFunc(
return;
}
loopLimit = nStr - nPattern;
+ cntExpand = 0;
for(i=j=0; i<=loopLimit; i++){
if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
zOut[j++] = zStr[i];
}else{
- u8 *zOld;
- sqlite3 *db = sqlite3_context_db_handle(context);
- nOut += nRep - nPattern;
- testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] );
- testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] );
- if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
- sqlite3_result_error_toobig(context);
- sqlite3_free(zOut);
- return;
- }
- zOld = zOut;
- zOut = sqlite3_realloc64(zOut, (int)nOut);
- if( zOut==0 ){
- sqlite3_result_error_nomem(context);
- sqlite3_free(zOld);
- return;
+ if( nRep>nPattern ){
+ nOut += nRep - nPattern;
+ testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] );
+ testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] );
+ if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
+ sqlite3_result_error_toobig(context);
+ sqlite3_free(zOut);
+ return;
+ }
+ cntExpand++;
+ if( (cntExpand&(cntExpand-1))==0 ){
+ /* Grow the size of the output buffer only on substitutions
+ ** whose index is a power of two: 1, 2, 4, 8, 16, 32, ... */
+ u8 *zOld;
+ zOld = zOut;
+ zOut = sqlite3_realloc64(zOut, (int)nOut + (nOut - nStr - 1));
+ if( zOut==0 ){
+ sqlite3_result_error_nomem(context);
+ sqlite3_free(zOld);
+ return;
+ }
+ }
}
memcpy(&zOut[j], zRep, nRep);
j += nRep;
i += nPattern-1;
}
}
- assert( j+nStr-i+1==nOut );
+ assert( j+nStr-i+1<=nOut );
memcpy(&zOut[j], &zStr[i], nStr-i);
j += nStr - i;
assert( j<=nOut );
@@ -108178,20 +111517,20 @@ static void groupConcatStep(
zSep = ",";
nSep = 1;
}
- if( zSep ) sqlite3StrAccumAppend(pAccum, zSep, nSep);
+ if( zSep ) sqlite3_str_append(pAccum, zSep, nSep);
}
zVal = (char*)sqlite3_value_text(argv[0]);
nVal = sqlite3_value_bytes(argv[0]);
- if( zVal ) sqlite3StrAccumAppend(pAccum, zVal, nVal);
+ if( zVal ) sqlite3_str_append(pAccum, zVal, nVal);
}
}
static void groupConcatFinalize(sqlite3_context *context){
StrAccum *pAccum;
pAccum = sqlite3_aggregate_context(context, 0);
if( pAccum ){
- if( pAccum->accError==STRACCUM_TOOBIG ){
+ if( pAccum->accError==SQLITE_TOOBIG ){
sqlite3_result_error_toobig(context);
- }else if( pAccum->accError==STRACCUM_NOMEM ){
+ }else if( pAccum->accError==SQLITE_NOMEM ){
sqlite3_result_error_nomem(context);
}else{
sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
@@ -108336,6 +111675,10 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){
#ifdef SQLITE_DEBUG
FUNCTION2(affinity, 1, 0, 0, noopFunc, SQLITE_FUNC_AFFINITY),
#endif
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+ FUNCTION2(sqlite_offset, 1, 0, 0, noopFunc, SQLITE_FUNC_OFFSET|
+ SQLITE_FUNC_TYPEOF),
+#endif
FUNCTION(ltrim, 1, 1, 0, trimFunc ),
FUNCTION(ltrim, 2, 1, 0, trimFunc ),
FUNCTION(rtrim, 1, 2, 0, trimFunc ),
@@ -108764,6 +112107,12 @@ static void fkLookupParent(
int iCur = pParse->nTab - 1; /* Cursor number to use */
int iOk = sqlite3VdbeMakeLabel(v); /* jump here if parent key found */
+ sqlite3VdbeVerifyAbortable(v,
+ (!pFKey->isDeferred
+ && !(pParse->db->flags & SQLITE_DeferFKs)
+ && !pParse->pToplevel
+ && !pParse->isMultiWrite) ? OE_Abort : OE_Ignore);
+
/* If nIncr is less than zero, then check at runtime if there are any
** outstanding constraints to resolve. If there are not, there is no need
** to check if deleting this row resolves any outstanding violations.
@@ -109158,7 +112507,7 @@ SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTa
}
pParse->disableTriggers = 1;
- sqlite3DeleteFrom(pParse, sqlite3SrcListDup(db, pName, 0), 0);
+ sqlite3DeleteFrom(pParse, sqlite3SrcListDup(db, pName, 0), 0, 0, 0);
pParse->disableTriggers = 0;
/* If the DELETE has generated immediate foreign key constraint
@@ -109171,6 +112520,7 @@ SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTa
** constraints are violated.
*/
if( (db->flags & SQLITE_DeferFKs)==0 ){
+ sqlite3VdbeVerifyAbortable(v, OE_Abort);
sqlite3VdbeAddOp2(v, OP_FkIfZero, 0, sqlite3VdbeCurrentAddr(v)+2);
VdbeCoverage(v);
sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_FOREIGNKEY,
@@ -109716,7 +113066,7 @@ static Trigger *fkActionTrigger(
sqlite3ExprListAppend(pParse, 0, pRaise),
sqlite3SrcListAppend(db, 0, &tFrom, 0),
pWhere,
- 0, 0, 0, 0, 0, 0
+ 0, 0, 0, 0, 0
);
pWhere = 0;
}
@@ -110067,11 +113417,12 @@ static int readsTable(Parse *p, int iDb, Table *pTab){
** first use of table pTab. On 2nd and subsequent uses, the original
** AutoincInfo structure is used.
**
-** Three memory locations are allocated:
+** Four consecutive registers are allocated:
**
-** (1) Register to hold the name of the pTab table.
-** (2) Register to hold the maximum ROWID of pTab.
-** (3) Register to hold the rowid in sqlite_sequence of pTab
+** (1) The name of the pTab table.
+** (2) The maximum ROWID of pTab.
+** (3) The rowid in sqlite_sequence of pTab
+** (4) The original value of the max ROWID in pTab, or NULL if none
**
** The 2nd register is the one that is returned. That is all the
** insert routine needs to know about.
@@ -110082,11 +113433,26 @@ static int autoIncBegin(
Table *pTab /* The table we are writing to */
){
int memId = 0; /* Register holding maximum rowid */
+ assert( pParse->db->aDb[iDb].pSchema!=0 );
if( (pTab->tabFlags & TF_Autoincrement)!=0
&& (pParse->db->mDbFlags & DBFLAG_Vacuum)==0
){
Parse *pToplevel = sqlite3ParseToplevel(pParse);
AutoincInfo *pInfo;
+ Table *pSeqTab = pParse->db->aDb[iDb].pSchema->pSeqTab;
+
+ /* Verify that the sqlite_sequence table exists and is an ordinary
+ ** rowid table with exactly two columns.
+ ** Ticket d8dc2b3a58cd5dc2918a1d4acb 2018-05-23 */
+ if( pSeqTab==0
+ || !HasRowid(pSeqTab)
+ || IsVirtual(pSeqTab)
+ || pSeqTab->nCol!=2
+ ){
+ pParse->nErr++;
+ pParse->rc = SQLITE_CORRUPT_SEQUENCE;
+ return 0;
+ }
pInfo = pToplevel->pAinc;
while( pInfo && pInfo->pTab!=pTab ){ pInfo = pInfo->pNext; }
@@ -110099,7 +113465,7 @@ static int autoIncBegin(
pInfo->iDb = iDb;
pToplevel->nMem++; /* Register to hold name of table */
pInfo->regCtr = ++pToplevel->nMem; /* Max rowid register */
- pToplevel->nMem++; /* Rowid in sqlite_sequence */
+ pToplevel->nMem +=2; /* Rowid in sqlite_sequence + orig max val */
}
memId = pInfo->regCtr;
}
@@ -110127,15 +113493,17 @@ SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse){
static const int iLn = VDBE_OFFSET_LINENO(2);
static const VdbeOpList autoInc[] = {
/* 0 */ {OP_Null, 0, 0, 0},
- /* 1 */ {OP_Rewind, 0, 9, 0},
+ /* 1 */ {OP_Rewind, 0, 10, 0},
/* 2 */ {OP_Column, 0, 0, 0},
- /* 3 */ {OP_Ne, 0, 7, 0},
+ /* 3 */ {OP_Ne, 0, 9, 0},
/* 4 */ {OP_Rowid, 0, 0, 0},
/* 5 */ {OP_Column, 0, 1, 0},
- /* 6 */ {OP_Goto, 0, 9, 0},
- /* 7 */ {OP_Next, 0, 2, 0},
- /* 8 */ {OP_Integer, 0, 0, 0},
- /* 9 */ {OP_Close, 0, 0, 0}
+ /* 6 */ {OP_AddImm, 0, 0, 0},
+ /* 7 */ {OP_Copy, 0, 0, 0},
+ /* 8 */ {OP_Goto, 0, 11, 0},
+ /* 9 */ {OP_Next, 0, 2, 0},
+ /* 10 */ {OP_Integer, 0, 0, 0},
+ /* 11 */ {OP_Close, 0, 0, 0}
};
VdbeOp *aOp;
pDb = &db->aDb[p->iDb];
@@ -110146,14 +113514,17 @@ SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse){
aOp = sqlite3VdbeAddOpList(v, ArraySize(autoInc), autoInc, iLn);
if( aOp==0 ) break;
aOp[0].p2 = memId;
- aOp[0].p3 = memId+1;
+ aOp[0].p3 = memId+2;
aOp[2].p3 = memId;
aOp[3].p1 = memId-1;
aOp[3].p3 = memId;
aOp[3].p5 = SQLITE_JUMPIFNULL;
aOp[4].p2 = memId+1;
aOp[5].p3 = memId;
- aOp[8].p2 = memId;
+ aOp[6].p1 = memId;
+ aOp[7].p2 = memId+2;
+ aOp[7].p1 = memId;
+ aOp[10].p2 = memId;
}
}
@@ -110200,6 +113571,8 @@ static SQLITE_NOINLINE void autoIncrementEnd(Parse *pParse){
iRec = sqlite3GetTempReg(pParse);
assert( sqlite3SchemaMutexHeld(db, 0, pDb->pSchema) );
+ sqlite3VdbeAddOp3(v, OP_Le, memId+2, sqlite3VdbeCurrentAddr(v)+7, memId);
+ VdbeCoverage(v);
sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenWrite);
aOp = sqlite3VdbeAddOpList(v, ArraySize(autoIncEnd), autoIncEnd, iLn);
if( aOp==0 ) break;
@@ -110337,7 +113710,8 @@ SQLITE_PRIVATE void sqlite3Insert(
SrcList *pTabList, /* Name of table into which we are inserting */
Select *pSelect, /* A SELECT statement to use as the data source */
IdList *pColumn, /* Column names corresponding to IDLIST. */
- int onError /* How to handle constraint errors */
+ int onError, /* How to handle constraint errors */
+ Upsert *pUpsert /* ON CONFLICT clauses for upsert, or NULL */
){
sqlite3 *db; /* The main database structure */
Table *pTab; /* The table to insert into. aka TABLE */
@@ -110632,7 +114006,10 @@ SQLITE_PRIVATE void sqlite3Insert(
/* Initialize the count of rows to be inserted
*/
- if( db->flags & SQLITE_CountRows ){
+ if( (db->flags & SQLITE_CountRows)!=0
+ && !pParse->nested
+ && !pParse->pTriggerTab
+ ){
regRowCount = ++pParse->nMem;
sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount);
}
@@ -110652,6 +114029,19 @@ SQLITE_PRIVATE void sqlite3Insert(
pParse->nMem += pIdx->nColumn;
}
}
+#ifndef SQLITE_OMIT_UPSERT
+ if( pUpsert ){
+ pTabList->a[0].iCursor = iDataCur;
+ pUpsert->pUpsertSrc = pTabList;
+ pUpsert->regData = regData;
+ pUpsert->iDataCur = iDataCur;
+ pUpsert->iIdxCur = iIdxCur;
+ if( pUpsert->pUpsertTarget ){
+ sqlite3UpsertAnalyzeTarget(pParse, pTabList, pUpsert);
+ }
+ }
+#endif
+
/* This is the top of the main insertion loop */
if( useTempTable ){
@@ -110766,7 +114156,8 @@ SQLITE_PRIVATE void sqlite3Insert(
VdbeOp *pOp;
sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regRowid);
pOp = sqlite3VdbeGetOp(v, -1);
- if( ALWAYS(pOp) && pOp->opcode==OP_Null && !IsVirtual(pTab) ){
+ assert( pOp!=0 );
+ if( pOp->opcode==OP_Null && !IsVirtual(pTab) ){
appendFlag = 1;
pOp->opcode = OP_NewRowid;
pOp->p1 = iDataCur;
@@ -110853,7 +114244,7 @@ SQLITE_PRIVATE void sqlite3Insert(
int isReplace; /* Set to true if constraints may cause a replace */
int bUseSeek; /* True to use OPFLAG_SEEKRESULT */
sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur,
- regIns, 0, ipkColumn>=0, onError, endOfLoop, &isReplace, 0
+ regIns, 0, ipkColumn>=0, onError, endOfLoop, &isReplace, 0, pUpsert
);
sqlite3FkCheck(pParse, pTab, 0, regIns, 0, 0);
@@ -110876,7 +114267,7 @@ SQLITE_PRIVATE void sqlite3Insert(
/* Update the count of rows that are inserted
*/
- if( (db->flags & SQLITE_CountRows)!=0 ){
+ if( regRowCount ){
sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1);
}
@@ -110913,7 +114304,7 @@ insert_end:
** generating code because of a call to sqlite3NestedParse(), do not
** invoke the callback function.
*/
- if( (db->flags&SQLITE_CountRows) && !pParse->nested && !pParse->pTriggerTab ){
+ if( regRowCount ){
sqlite3VdbeAddOp2(v, OP_ResultRow, regRowCount, 1);
sqlite3VdbeSetNumCols(v, 1);
sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows inserted", SQLITE_STATIC);
@@ -110922,6 +114313,7 @@ insert_end:
insert_cleanup:
sqlite3SrcListDelete(db, pTabList);
sqlite3ExprListDelete(db, pList);
+ sqlite3UpsertDelete(db, pUpsert);
sqlite3SelectDelete(db, pSelect);
sqlite3IdListDelete(db, pColumn);
sqlite3DbFree(db, aRegIdx);
@@ -110994,6 +114386,44 @@ static int checkConstraintUnchanged(Expr *pExpr, int *aiChng, int chngRowid){
}
/*
+** An instance of the ConstraintAddr object remembers the byte-code addresses
+** for sections of the constraint checks that deal with uniqueness constraints
+** on the rowid and on the upsert constraint.
+**
+** This information is passed into checkReorderConstraintChecks() to insert
+** some OP_Goto operations so that the rowid and upsert constraints occur
+** in the correct order relative to other constraints.
+*/
+typedef struct ConstraintAddr ConstraintAddr;
+struct ConstraintAddr {
+ int ipkTop; /* Subroutine for rowid constraint check */
+ int upsertTop; /* Label for upsert constraint check subroutine */
+ int upsertTop2; /* Copy of upsertTop not cleared by the call */
+ int upsertBtm; /* upsert constraint returns to this label */
+ int ipkBtm; /* Return opcode rowid constraint check */
+};
+
+/*
+** Generate any OP_Goto operations needed to cause constraints to be
+** run that haven't already been run.
+*/
+static void reorderConstraintChecks(Vdbe *v, ConstraintAddr *p){
+ if( p->upsertTop ){
+ testcase( sqlite3VdbeLabelHasBeenResolved(v, p->upsertTop) );
+ sqlite3VdbeGoto(v, p->upsertTop);
+ VdbeComment((v, "call upsert subroutine"));
+ sqlite3VdbeResolveLabel(v, p->upsertBtm);
+ p->upsertTop = 0;
+ }
+ if( p->ipkTop ){
+ sqlite3VdbeGoto(v, p->ipkTop);
+ VdbeComment((v, "call rowid unique-check subroutine"));
+ sqlite3VdbeJumpHere(v, p->ipkBtm);
+ p->ipkTop = 0;
+ }
+}
+
+/*
** Generate code to do constraint checks prior to an INSERT or an UPDATE
** on table pTab.
**
@@ -111088,7 +114518,8 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
u8 overrideError, /* Override onError to this if not OE_Default */
int ignoreDest, /* Jump to this label on an OE_Ignore resolution */
int *pbMayReplace, /* OUT: Set to true if constraint may cause a replace */
- int *aiChng /* column i is unchanged if aiChng[i]<0 */
+ int *aiChng, /* column i is unchanged if aiChng[i]<0 */
+ Upsert *pUpsert /* ON CONFLICT clauses, if any. NULL otherwise */
){
Vdbe *v; /* VDBE under constrution */
Index *pIdx; /* Pointer to one of the indices */
@@ -111101,10 +114532,11 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
int addr1; /* Address of jump instruction */
int seenReplace = 0; /* True if REPLACE is used to resolve INT PK conflict */
int nPkField; /* Number of fields in PRIMARY KEY. 1 for ROWID tables */
- int ipkTop = 0; /* Top of the rowid change constraint check */
- int ipkBottom = 0; /* Bottom of the rowid change constraint check */
+ ConstraintAddr sAddr;/* Address information for constraint reordering */
+ Index *pUpIdx = 0; /* Index to which to apply the upsert */
u8 isUpdate; /* True if this is an UPDATE operation */
u8 bAffinityDone = 0; /* True if the OP_Affinity operation has been run */
+ int upsertBypass = 0; /* Address of Goto to bypass upsert subroutine */
isUpdate = regOldData!=0;
db = pParse->db;
@@ -111112,6 +114544,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
assert( v!=0 );
assert( pTab->pSelect==0 ); /* This table is not a VIEW */
nCol = pTab->nCol;
+ memset(&sAddr, 0, sizeof(sAddr));
/* pPk is the PRIMARY KEY index for WITHOUT ROWID tables and NULL for
** normal rowid tables. nPkField is the number of key fields in the
@@ -111194,6 +114627,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
Expr *pExpr = pCheck->a[i].pExpr;
if( aiChng && checkConstraintUnchanged(pExpr, aiChng, pkChng) ) continue;
allOk = sqlite3VdbeMakeLabel(v);
+ sqlite3VdbeVerifyAbortable(v, onError);
sqlite3ExprIfTrue(pParse, pExpr, allOk, SQLITE_JUMPIFNULL);
if( onError==OE_Ignore ){
sqlite3VdbeGoto(v, ignoreDest);
@@ -111211,6 +114645,46 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
}
#endif /* !defined(SQLITE_OMIT_CHECK) */
+ /* UNIQUE and PRIMARY KEY constraints should be handled in the following
+ ** order:
+ **
+ ** (1) OE_Abort, OE_Fail, OE_Rollback, OE_Ignore
+ ** (2) OE_Update
+ ** (3) OE_Replace
+ **
+ ** OE_Fail and OE_Ignore must happen before any changes are made.
+ ** OE_Update guarantees that only a single row will change, so it
+ ** must happen before OE_Replace. Technically, OE_Abort and OE_Rollback
+ ** could happen in any order, but they are grouped up front for
+ ** convenience.
+ **
+ ** Constraint checking code is generated in this order:
+ ** (A) The rowid constraint
+ ** (B) Unique index constraints that do not have OE_Replace as their
+ ** default conflict resolution strategy
+ ** (C) Unique index that do use OE_Replace by default.
+ **
+ ** The ordering of (2) and (3) is accomplished by making sure the linked
+ ** list of indexes attached to a table puts all OE_Replace indexes last
+ ** in the list. See sqlite3CreateIndex() for where that happens.
+ */
+
+ if( pUpsert ){
+ if( pUpsert->pUpsertTarget==0 ){
+ /* An ON CONFLICT DO NOTHING clause, without a constraint-target.
+ ** Make all unique constraint resolution be OE_Ignore */
+ assert( pUpsert->pUpsertSet==0 );
+ overrideError = OE_Ignore;
+ pUpsert = 0;
+ }else if( (pUpIdx = pUpsert->pUpsertIdx)!=0 ){
+ /* If the constraint-target is on some column other than
+ ** then ROWID, then we might need to move the UPSERT around
+ ** so that it occurs in the correct order. */
+ sAddr.upsertTop = sAddr.upsertTop2 = sqlite3VdbeMakeLabel(v);
+ sAddr.upsertBtm = sqlite3VdbeMakeLabel(v);
+ }
+ }
+
/* If rowid is changing, make sure the new rowid does not previously
** exist in the table.
*/
@@ -111225,13 +114699,13 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
onError = OE_Abort;
}
- if( isUpdate ){
- /* pkChng!=0 does not mean that the rowid has changed, only that
- ** it might have changed. Skip the conflict logic below if the rowid
- ** is unchanged. */
- sqlite3VdbeAddOp3(v, OP_Eq, regNewData, addrRowidOk, regOldData);
- sqlite3VdbeChangeP5(v, SQLITE_NOTNULL);
- VdbeCoverage(v);
+ /* figure out whether or not upsert applies in this case */
+ if( pUpsert && pUpsert->pUpsertIdx==0 ){
+ if( pUpsert->pUpsertSet==0 ){
+ onError = OE_Ignore; /* DO NOTHING is the same as INSERT OR IGNORE */
+ }else{
+ onError = OE_Update; /* DO UPDATE */
+ }
}
/* If the response to a rowid conflict is REPLACE but the response
@@ -111239,21 +114713,34 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
** to defer the running of the rowid conflict checking until after
** the UNIQUE constraints have run.
*/
- if( onError==OE_Replace && overrideError!=OE_Replace ){
- for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
- if( pIdx->onError==OE_Ignore || pIdx->onError==OE_Fail ){
- ipkTop = sqlite3VdbeAddOp0(v, OP_Goto);
- break;
- }
- }
+ assert( OE_Update>OE_Replace );
+ assert( OE_Ignore<OE_Replace );
+ assert( OE_Fail<OE_Replace );
+ assert( OE_Abort<OE_Replace );
+ assert( OE_Rollback<OE_Replace );
+ if( onError>=OE_Replace
+ && (pUpsert || onError!=overrideError)
+ && pTab->pIndex
+ ){
+ sAddr.ipkTop = sqlite3VdbeAddOp0(v, OP_Goto)+1;
+ }
+
+ if( isUpdate ){
+ /* pkChng!=0 does not mean that the rowid has changed, only that
+ ** it might have changed. Skip the conflict logic below if the rowid
+ ** is unchanged. */
+ sqlite3VdbeAddOp3(v, OP_Eq, regNewData, addrRowidOk, regOldData);
+ sqlite3VdbeChangeP5(v, SQLITE_NOTNULL);
+ VdbeCoverage(v);
}
/* Check to see if the new rowid already exists in the table. Skip
** the following conflict logic if it does not. */
+ VdbeNoopComment((v, "uniqueness check for ROWID"));
+ sqlite3VdbeVerifyAbortable(v, onError);
sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, addrRowidOk, regNewData);
VdbeCoverage(v);
- /* Generate code that deals with a rowid collision */
switch( onError ){
default: {
onError = OE_Abort;
@@ -111262,6 +114749,9 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
case OE_Rollback:
case OE_Abort:
case OE_Fail: {
+ testcase( onError==OE_Rollback );
+ testcase( onError==OE_Abort );
+ testcase( onError==OE_Fail );
sqlite3RowidConstraint(pParse, onError, pTab);
break;
}
@@ -111298,14 +114788,13 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
regNewData, 1, 0, OE_Replace, 1, -1);
}else{
#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
- if( HasRowid(pTab) ){
- /* This OP_Delete opcode fires the pre-update-hook only. It does
- ** not modify the b-tree. It is more efficient to let the coming
- ** OP_Insert replace the existing entry than it is to delete the
- ** existing entry and then insert a new one. */
- sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, OPFLAG_ISNOOP);
- sqlite3VdbeAppendP4(v, pTab, P4_TABLE);
- }
+ assert( HasRowid(pTab) );
+ /* This OP_Delete opcode fires the pre-update-hook only. It does
+ ** not modify the b-tree. It is more efficient to let the coming
+ ** OP_Insert replace the existing entry than it is to delete the
+ ** existing entry and then insert a new one. */
+ sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, OPFLAG_ISNOOP);
+ sqlite3VdbeAppendP4(v, pTab, P4_TABLE);
#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */
if( pTab->pIndex ){
sqlite3MultiWrite(pParse);
@@ -111315,16 +114804,22 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
seenReplace = 1;
break;
}
+#ifndef SQLITE_OMIT_UPSERT
+ case OE_Update: {
+ sqlite3UpsertDoUpdate(pParse, pUpsert, pTab, 0, iDataCur);
+ /* Fall through */
+ }
+#endif
case OE_Ignore: {
- /*assert( seenReplace==0 );*/
+ testcase( onError==OE_Ignore );
sqlite3VdbeGoto(v, ignoreDest);
break;
}
}
sqlite3VdbeResolveLabel(v, addrRowidOk);
- if( ipkTop ){
- ipkBottom = sqlite3VdbeAddOp0(v, OP_Goto);
- sqlite3VdbeJumpHere(v, ipkTop);
+ if( sAddr.ipkTop ){
+ sAddr.ipkBtm = sqlite3VdbeAddOp0(v, OP_Goto);
+ sqlite3VdbeJumpHere(v, sAddr.ipkTop-1);
}
}
@@ -111342,12 +114837,21 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
int addrUniqueOk; /* Jump here if the UNIQUE constraint is satisfied */
if( aRegIdx[ix]==0 ) continue; /* Skip indices that do not change */
+ if( pUpIdx==pIdx ){
+ addrUniqueOk = sAddr.upsertBtm;
+ upsertBypass = sqlite3VdbeGoto(v, 0);
+ VdbeComment((v, "Skip upsert subroutine"));
+ sqlite3VdbeResolveLabel(v, sAddr.upsertTop2);
+ }else{
+ addrUniqueOk = sqlite3VdbeMakeLabel(v);
+ }
+ VdbeNoopComment((v, "uniqueness check for %s", pIdx->zName));
if( bAffinityDone==0 ){
sqlite3TableAffinity(v, pTab, regNewData+1);
bAffinityDone = 1;
}
iThisCur = iIdxCur+ix;
- addrUniqueOk = sqlite3VdbeMakeLabel(v);
+
/* Skip partial indices for which the WHERE clause is not true */
if( pIdx->pPartIdxWhere ){
@@ -111407,6 +114911,24 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
onError = OE_Abort;
}
+ /* Figure out if the upsert clause applies to this index */
+ if( pUpIdx==pIdx ){
+ if( pUpsert->pUpsertSet==0 ){
+ onError = OE_Ignore; /* DO NOTHING is the same as INSERT OR IGNORE */
+ }else{
+ onError = OE_Update; /* DO UPDATE */
+ }
+ }
+
+ /* Invoke subroutines to handle IPK replace and upsert prior to running
+ ** the first REPLACE constraint check. */
+ if( onError==OE_Replace ){
+ testcase( sAddr.ipkTop );
+ testcase( sAddr.upsertTop
+ && sqlite3VdbeLabelHasBeenResolved(v,sAddr.upsertTop) );
+ reorderConstraintChecks(v, &sAddr);
+ }
+
/* Collision detection may be omitted if all of the following are true:
** (1) The conflict resolution algorithm is REPLACE
** (2) The table is a WITHOUT ROWID table
@@ -111427,6 +114949,8 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
}
/* Check to see if the new index entry will be unique */
+ sqlite3ExprCachePush(pParse);
+ sqlite3VdbeVerifyAbortable(v, onError);
sqlite3VdbeAddOp4Int(v, OP_NoConflict, iThisCur, addrUniqueOk,
regIdx, pIdx->nKeyCol); VdbeCoverage(v);
@@ -111488,25 +115012,37 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
/* Generate code that executes if the new index entry is not unique */
assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail
- || onError==OE_Ignore || onError==OE_Replace );
+ || onError==OE_Ignore || onError==OE_Replace || onError==OE_Update );
switch( onError ){
case OE_Rollback:
case OE_Abort:
case OE_Fail: {
+ testcase( onError==OE_Rollback );
+ testcase( onError==OE_Abort );
+ testcase( onError==OE_Fail );
sqlite3UniqueConstraint(pParse, onError, pIdx);
break;
}
+#ifndef SQLITE_OMIT_UPSERT
+ case OE_Update: {
+ sqlite3UpsertDoUpdate(pParse, pUpsert, pTab, pIdx, iIdxCur+ix);
+ /* Fall through */
+ }
+#endif
case OE_Ignore: {
+ testcase( onError==OE_Ignore );
sqlite3VdbeGoto(v, ignoreDest);
break;
}
default: {
Trigger *pTrigger = 0;
assert( onError==OE_Replace );
- sqlite3MultiWrite(pParse);
if( db->flags&SQLITE_RecTriggers ){
pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0);
}
+ if( pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0) ){
+ sqlite3MultiWrite(pParse);
+ }
sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur,
regR, nPkField, 0, OE_Replace,
(pIdx==pPk ? ONEPASS_SINGLE : ONEPASS_OFF), iThisCur);
@@ -111514,13 +115050,19 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
break;
}
}
- sqlite3VdbeResolveLabel(v, addrUniqueOk);
+ if( pUpIdx==pIdx ){
+ sqlite3VdbeJumpHere(v, upsertBypass);
+ }else{
+ sqlite3VdbeResolveLabel(v, addrUniqueOk);
+ }
+ sqlite3ExprCachePop(pParse);
if( regR!=regIdx ) sqlite3ReleaseTempRange(pParse, regR, nPkField);
+
}
- if( ipkTop ){
- sqlite3VdbeGoto(v, ipkTop+1);
- sqlite3VdbeJumpHere(v, ipkBottom);
- }
+ testcase( sAddr.ipkTop!=0 );
+ testcase( sAddr.upsertTop
+ && sqlite3VdbeLabelHasBeenResolved(v,sAddr.upsertTop) );
+ reorderConstraintChecks(v, &sAddr);
*pbMayReplace = seenReplace;
VdbeModuleComment((v, "END: GenCnstCks(%d)", seenReplace));
@@ -111863,7 +115405,6 @@ static int xferOptimization(
if( pSelect->pLimit ){
return 0; /* SELECT may not have a LIMIT clause */
}
- assert( pSelect->pOffset==0 ); /* Must be so if pLimit==0 */
if( pSelect->pPrior ){
return 0; /* SELECT may not be a compound query */
}
@@ -112021,6 +115562,7 @@ static int xferOptimization(
emptySrcTest = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0); VdbeCoverage(v);
if( pDest->iPKey>=0 ){
addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid);
+ sqlite3VdbeVerifyAbortable(v, onError);
addr2 = sqlite3VdbeAddOp3(v, OP_NotExists, iDest, 0, regRowid);
VdbeCoverage(v);
sqlite3RowidConstraint(pParse, onError, pDest);
@@ -112575,6 +116117,24 @@ struct sqlite3_api_routines {
int (*bind_pointer)(sqlite3_stmt*,int,void*,const char*,void(*)(void*));
void (*result_pointer)(sqlite3_context*,void*,const char*,void(*)(void*));
void *(*value_pointer)(sqlite3_value*,const char*);
+ int (*vtab_nochange)(sqlite3_context*);
+ int (*value_nochange)(sqlite3_value*);
+ const char *(*vtab_collation)(sqlite3_index_info*,int);
+ /* Version 3.24.0 and later */
+ int (*keyword_count)(void);
+ int (*keyword_name)(int,const char**,int*);
+ int (*keyword_check)(const char*,int);
+ sqlite3_str *(*str_new)(sqlite3*);
+ char *(*str_finish)(sqlite3_str*);
+ void (*str_appendf)(sqlite3_str*, const char *zFormat, ...);
+ void (*str_vappendf)(sqlite3_str*, const char *zFormat, va_list);
+ void (*str_append)(sqlite3_str*, const char *zIn, int N);
+ void (*str_appendall)(sqlite3_str*, const char *zIn);
+ void (*str_appendchar)(sqlite3_str*, int N, char C);
+ void (*str_reset)(sqlite3_str*);
+ int (*str_errcode)(sqlite3_str*);
+ int (*str_length)(sqlite3_str*);
+ char *(*str_value)(sqlite3_str*);
};
/*
@@ -112841,6 +116401,25 @@ typedef int (*sqlite3_loadext_entry)(
#define sqlite3_bind_pointer sqlite3_api->bind_pointer
#define sqlite3_result_pointer sqlite3_api->result_pointer
#define sqlite3_value_pointer sqlite3_api->value_pointer
+/* Version 3.22.0 and later */
+#define sqlite3_vtab_nochange sqlite3_api->vtab_nochange
+#define sqlite3_value_nochange sqlite3_api->value_nochange
+#define sqlite3_vtab_collation sqlite3_api->vtab_collation
+/* Version 3.24.0 and later */
+#define sqlite3_keyword_count sqlite3_api->keyword_count
+#define sqlite3_keyword_name sqlite3_api->keyword_name
+#define sqlite3_keyword_check sqlite3_api->keyword_check
+#define sqlite3_str_new sqlite3_api->str_new
+#define sqlite3_str_finish sqlite3_api->str_finish
+#define sqlite3_str_appendf sqlite3_api->str_appendf
+#define sqlite3_str_vappendf sqlite3_api->str_vappendf
+#define sqlite3_str_append sqlite3_api->str_append
+#define sqlite3_str_appendall sqlite3_api->str_appendall
+#define sqlite3_str_appendchar sqlite3_api->str_appendchar
+#define sqlite3_str_reset sqlite3_api->str_reset
+#define sqlite3_str_errcode sqlite3_api->str_errcode
+#define sqlite3_str_length sqlite3_api->str_length
+#define sqlite3_str_value sqlite3_api->str_value
#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */
#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)
@@ -113275,7 +116854,26 @@ static const sqlite3_api_routines sqlite3Apis = {
sqlite3_prepare16_v3,
sqlite3_bind_pointer,
sqlite3_result_pointer,
- sqlite3_value_pointer
+ sqlite3_value_pointer,
+ /* Version 3.22.0 and later */
+ sqlite3_vtab_nochange,
+ sqlite3_value_nochange,
+ sqlite3_vtab_collation,
+ /* Version 3.24.0 and later */
+ sqlite3_keyword_count,
+ sqlite3_keyword_name,
+ sqlite3_keyword_check,
+ sqlite3_str_new,
+ sqlite3_str_finish,
+ sqlite3_str_appendf,
+ sqlite3_str_vappendf,
+ sqlite3_str_append,
+ sqlite3_str_appendall,
+ sqlite3_str_appendchar,
+ sqlite3_str_reset,
+ sqlite3_str_errcode,
+ sqlite3_str_length,
+ sqlite3_str_value
};
/*
@@ -115378,6 +118976,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
** type: Column declaration type.
** notnull: True if 'NOT NULL' is part of column declaration
** dflt_value: The default value for the column, if any.
+ ** pk: Non-zero for PK fields.
*/
case PragTyp_TABLE_INFO: if( zRight ){
Table *pTab;
@@ -116513,26 +120112,26 @@ static int pragmaVtabConnect(
UNUSED_PARAMETER(argc);
UNUSED_PARAMETER(argv);
sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0);
- sqlite3StrAccumAppendAll(&acc, "CREATE TABLE x");
+ sqlite3_str_appendall(&acc, "CREATE TABLE x");
for(i=0, j=pPragma->iPragCName; i<pPragma->nPragCName; i++, j++){
- sqlite3XPrintf(&acc, "%c\"%s\"", cSep, pragCName[j]);
+ sqlite3_str_appendf(&acc, "%c\"%s\"", cSep, pragCName[j]);
cSep = ',';
}
if( i==0 ){
- sqlite3XPrintf(&acc, "(\"%s\"", pPragma->zName);
+ sqlite3_str_appendf(&acc, "(\"%s\"", pPragma->zName);
cSep = ',';
i++;
}
j = 0;
if( pPragma->mPragFlg & PragFlg_Result1 ){
- sqlite3StrAccumAppendAll(&acc, ",arg HIDDEN");
+ sqlite3_str_appendall(&acc, ",arg HIDDEN");
j++;
}
if( pPragma->mPragFlg & (PragFlg_SchemaOpt|PragFlg_SchemaReq) ){
- sqlite3StrAccumAppendAll(&acc, ",schema HIDDEN");
+ sqlite3_str_appendall(&acc, ",schema HIDDEN");
j++;
}
- sqlite3StrAccumAppend(&acc, ")", 1);
+ sqlite3_str_append(&acc, ")", 1);
sqlite3StrAccumFinish(&acc);
assert( strlen(zBuf) < sizeof(zBuf)-1 );
rc = sqlite3_declare_vtab(db, zBuf);
@@ -116684,13 +120283,13 @@ static int pragmaVtabFilter(
}
}
sqlite3StrAccumInit(&acc, 0, 0, 0, pTab->db->aLimit[SQLITE_LIMIT_SQL_LENGTH]);
- sqlite3StrAccumAppendAll(&acc, "PRAGMA ");
+ sqlite3_str_appendall(&acc, "PRAGMA ");
if( pCsr->azArg[1] ){
- sqlite3XPrintf(&acc, "%Q.", pCsr->azArg[1]);
+ sqlite3_str_appendf(&acc, "%Q.", pCsr->azArg[1]);
}
- sqlite3StrAccumAppendAll(&acc, pTab->pName->zName);
+ sqlite3_str_appendall(&acc, pTab->pName->zName);
if( pCsr->azArg[0] ){
- sqlite3XPrintf(&acc, "=%Q", pCsr->azArg[0]);
+ sqlite3_str_appendf(&acc, "=%Q", pCsr->azArg[0]);
}
zSql = sqlite3StrAccumFinish(&acc);
if( zSql==0 ) return SQLITE_NOMEM;
@@ -116817,7 +120416,7 @@ static void corruptSchema(
char *z;
if( zObj==0 ) zObj = "?";
z = sqlite3MPrintf(db, "malformed database schema (%s)", zObj);
- if( zExtra ) z = sqlite3MPrintf(db, "%z - %s", z, zExtra);
+ if( zExtra && zExtra[0] ) z = sqlite3MPrintf(db, "%z - %s", z, zExtra);
sqlite3DbFree(db, *pData->pzErrMsg);
*pData->pzErrMsg = z;
}
@@ -116933,6 +120532,7 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
const char *zMasterName;
int openedTransaction = 0;
+ assert( (db->mDbFlags & DBFLAG_SchemaKnownOk)==0 );
assert( iDb>=0 && iDb<db->nDb );
assert( db->aDb[iDb].pSchema );
assert( sqlite3_mutex_held(db->mutex) );
@@ -117003,6 +120603,9 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
for(i=0; i<ArraySize(meta); i++){
sqlite3BtreeGetMeta(pDb->pBt, i+1, (u32 *)&meta[i]);
}
+ if( (db->flags & SQLITE_ResetDatabase)!=0 ){
+ memset(meta, 0, sizeof(meta));
+ }
pDb->pSchema->schema_cookie = meta[BTREE_SCHEMA_VERSION-1];
/* If opening a non-empty database, check the text encoding. For the
@@ -117162,6 +120765,7 @@ SQLITE_PRIVATE int sqlite3Init(sqlite3 *db, char **pzErrMsg){
}
/* All other schemas after the main schema. The "temp" schema must be last */
for(i=db->nDb-1; i>0; i--){
+ assert( i==1 || sqlite3BtreeHoldsMutex(db->aDb[i].pBt) );
if( !DbHasProperty(db, i, DB_SchemaLoaded) ){
rc = sqlite3InitOne(db, i, pzErrMsg);
if( rc ) return rc;
@@ -117183,10 +120787,12 @@ SQLITE_PRIVATE int sqlite3ReadSchema(Parse *pParse){
assert( sqlite3_mutex_held(db->mutex) );
if( !db->init.busy ){
rc = sqlite3Init(db, &pParse->zErrMsg);
- }
- if( rc!=SQLITE_OK ){
- pParse->rc = rc;
- pParse->nErr++;
+ if( rc!=SQLITE_OK ){
+ pParse->rc = rc;
+ pParse->nErr++;
+ }else if( db->noSharedCache ){
+ db->mDbFlags |= DBFLAG_SchemaKnownOk;
+ }
}
return rc;
}
@@ -117261,7 +120867,8 @@ SQLITE_PRIVATE int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){
*/
assert( sqlite3_mutex_held(db->mutex) );
if( pSchema ){
- for(i=0; ALWAYS(i<db->nDb); i++){
+ for(i=0; 1; i++){
+ assert( i<db->nDb );
if( db->aDb[i].pSchema==pSchema ){
break;
}
@@ -117396,7 +121003,7 @@ static int sqlite3Prepare(
if( rc==SQLITE_OK && sParse.pVdbe && sParse.explain ){
static const char * const azColName[] = {
"addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment",
- "selectid", "order", "from", "detail"
+ "id", "parent", "notused", "detail"
};
int iFirst, mx;
if( sParse.explain==2 ){
@@ -117442,8 +121049,6 @@ static int sqlite3Prepare(
end_prepare:
sqlite3ParserReset(&sParse);
- rc = sqlite3ApiExit(db, rc);
- assert( (rc&db->errMask)==rc );
return rc;
}
static int sqlite3LockAndPrepare(
@@ -117456,6 +121061,7 @@ static int sqlite3LockAndPrepare(
const char **pzTail /* OUT: End of parsed string */
){
int rc;
+ int cnt = 0;
#ifdef SQLITE_ENABLE_API_ARMOR
if( ppStmt==0 ) return SQLITE_MISUSE_BKPT;
@@ -117466,15 +121072,18 @@ static int sqlite3LockAndPrepare(
}
sqlite3_mutex_enter(db->mutex);
sqlite3BtreeEnterAll(db);
- rc = sqlite3Prepare(db, zSql, nBytes, prepFlags, pOld, ppStmt, pzTail);
- if( rc==SQLITE_SCHEMA ){
- sqlite3ResetOneSchema(db, -1);
- sqlite3_finalize(*ppStmt);
+ do{
+ /* Make multiple attempts to compile the SQL, until it either succeeds
+ ** or encounters a permanent error. A schema problem after one schema
+ ** reset is considered a permanent error. */
rc = sqlite3Prepare(db, zSql, nBytes, prepFlags, pOld, ppStmt, pzTail);
- }
+ assert( rc==SQLITE_OK || *ppStmt==0 );
+ }while( rc==SQLITE_ERROR_RETRY
+ || (rc==SQLITE_SCHEMA && (sqlite3ResetOneSchema(db,-1), cnt++)==0) );
sqlite3BtreeLeaveAll(db);
+ rc = sqlite3ApiExit(db, rc);
+ assert( (rc&db->errMask)==rc );
sqlite3_mutex_leave(db->mutex);
- assert( rc==SQLITE_OK || *ppStmt==0 );
return rc;
}
@@ -117708,8 +121317,7 @@ SQLITE_API int sqlite3_prepare16_v3(
/***/ int sqlite3SelectTrace = 0;
# define SELECTTRACE(K,P,S,X) \
if(sqlite3SelectTrace&(K)) \
- sqlite3DebugPrintf("%*s%s.%p: ",(P)->nSelectIndent*2-2,"",\
- (S)->zSelName,(S)),\
+ sqlite3DebugPrintf("%s/%d/%p: ",(S)->zSelName,(P)->addrExplain,(S)),\
sqlite3DebugPrintf X
#else
# define SELECTTRACE(K,P,S,X)
@@ -117732,6 +121340,20 @@ struct DistinctCtx {
/*
** An instance of the following object is used to record information about
** the ORDER BY (or GROUP BY) clause of query is being coded.
+**
+** The aDefer[] array is used by the sorter-references optimization. For
+** example, assuming there is no index that can be used for the ORDER BY,
+** for the query:
+**
+** SELECT a, bigblob FROM t1 ORDER BY a LIMIT 10;
+**
+** it may be more efficient to add just the "a" values to the sorter, and
+** retrieve the associated "bigblob" values directly from table t1 as the
+** 10 smallest "a" values are extracted from the sorter.
+**
+** When the sorter-reference optimization is used, there is one entry in the
+** aDefer[] array for each database table that may be read as values are
+** extracted from the sorter.
*/
typedef struct SortCtx SortCtx;
struct SortCtx {
@@ -117744,6 +121366,15 @@ struct SortCtx {
int labelDone; /* Jump here when done, ex: LIMIT reached */
u8 sortFlags; /* Zero or more SORTFLAG_* bits */
u8 bOrderedInnerLoop; /* ORDER BY correctly sorts the inner loop */
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ u8 nDefer; /* Number of valid entries in aDefer[] */
+ struct DeferredCsr {
+ Table *pTab; /* Table definition */
+ int iCsr; /* Cursor number for table */
+ int nKey; /* Number of PK columns for table pTab (>=1) */
+ } aDefer[4];
+#endif
+ struct RowLoadInfo *pDeferredRowLoad; /* Deferred row loading info or NULL */
};
#define SORTFLAG_UseSorter 0x01 /* Use SorterOpen instead of OpenEphemeral */
@@ -117761,7 +121392,6 @@ static void clearSelect(sqlite3 *db, Select *p, int bFree){
sqlite3ExprDelete(db, p->pHaving);
sqlite3ExprListDelete(db, p->pOrderBy);
sqlite3ExprDelete(db, p->pLimit);
- sqlite3ExprDelete(db, p->pOffset);
if( OK_IF_ALWAYS_TRUE(p->pWith) ) sqlite3WithDelete(db, p->pWith);
if( bFree ) sqlite3DbFreeNN(db, p);
p = pPrior;
@@ -117794,8 +121424,7 @@ SQLITE_PRIVATE Select *sqlite3SelectNew(
Expr *pHaving, /* the HAVING clause */
ExprList *pOrderBy, /* the ORDER BY clause */
u32 selFlags, /* Flag parameters, such as SF_Distinct */
- Expr *pLimit, /* LIMIT value. NULL means not used */
- Expr *pOffset /* OFFSET value. NULL means no offset */
+ Expr *pLimit /* LIMIT value. NULL means not used */
){
Select *pNew;
Select standin;
@@ -117828,10 +121457,7 @@ SQLITE_PRIVATE Select *sqlite3SelectNew(
pNew->pPrior = 0;
pNew->pNext = 0;
pNew->pLimit = pLimit;
- pNew->pOffset = pOffset;
pNew->pWith = 0;
- assert( pOffset==0 || pLimit!=0 || pParse->nErr>0
- || pParse->db->mallocFailed!=0 );
if( pParse->db->mallocFailed ) {
clearSelect(pParse->db, pNew, pNew!=&standin);
pNew = 0;
@@ -118075,6 +121701,29 @@ static void setJoinExpr(Expr *p, int iTable){
}
}
+/* Undo the work of setJoinExpr(). In the expression tree p, convert every
+** term that is marked with EP_FromJoin and iRightJoinTable==iTable into
+** an ordinary term that omits the EP_FromJoin mark.
+**
+** This happens when a LEFT JOIN is simplified into an ordinary JOIN.
+*/
+static void unsetJoinExpr(Expr *p, int iTable){
+ while( p ){
+ if( ExprHasProperty(p, EP_FromJoin)
+ && (iTable<0 || p->iRightJoinTable==iTable) ){
+ ExprClearProperty(p, EP_FromJoin);
+ }
+ if( p->op==TK_FUNCTION && p->x.pList ){
+ int i;
+ for(i=0; i<p->x.pList->nExpr; i++){
+ unsetJoinExpr(p->x.pList->a[i].pExpr, iTable);
+ }
+ }
+ unsetJoinExpr(p->pLeft, iTable);
+ p = p->pRight;
+ }
+}
+
/*
** This routine processes the join information for a SELECT statement.
** ON and USING clauses are converted into extra terms of the WHERE clause.
@@ -118185,6 +121834,62 @@ static KeyInfo *keyInfoFromExprList(
);
/*
+** An instance of this object holds information (beyond pParse and pSelect)
+** needed to load the next result row that is to be added to the sorter.
+*/
+typedef struct RowLoadInfo RowLoadInfo;
+struct RowLoadInfo {
+ int regResult; /* Store results in array of registers here */
+ u8 ecelFlags; /* Flag argument to ExprCodeExprList() */
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ ExprList *pExtra; /* Extra columns needed by sorter refs */
+ int regExtraResult; /* Where to load the extra columns */
+#endif
+};
+
+/*
+** This routine does the work of loading query data into an array of
+** registers so that it can be added to the sorter.
+*/
+static void innerLoopLoadRow(
+ Parse *pParse, /* Statement under construction */
+ Select *pSelect, /* The query being coded */
+ RowLoadInfo *pInfo /* Info needed to complete the row load */
+){
+ sqlite3ExprCodeExprList(pParse, pSelect->pEList, pInfo->regResult,
+ 0, pInfo->ecelFlags);
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ if( pInfo->pExtra ){
+ sqlite3ExprCodeExprList(pParse, pInfo->pExtra, pInfo->regExtraResult, 0, 0);
+ sqlite3ExprListDelete(pParse->db, pInfo->pExtra);
+ }
+#endif
+}
+
+/*
+** Code the OP_MakeRecord instruction that generates the entry to be
+** added into the sorter.
+**
+** Return the register in which the result is stored.
+*/
+static int makeSorterRecord(
+ Parse *pParse,
+ SortCtx *pSort,
+ Select *pSelect,
+ int regBase,
+ int nBase
+){
+ int nOBSat = pSort->nOBSat;
+ Vdbe *v = pParse->pVdbe;
+ int regOut = ++pParse->nMem;
+ if( pSort->pDeferredRowLoad ){
+ innerLoopLoadRow(pParse, pSelect, pSort->pDeferredRowLoad);
+ }
+ sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase+nOBSat, nBase-nOBSat, regOut);
+ return regOut;
+}
+
+/*
** Generate code that will push the record in registers regData
** through regData+nData-1 onto the sorter.
*/
@@ -118194,7 +121899,7 @@ static void pushOntoSorter(
Select *pSelect, /* The whole SELECT statement */
int regData, /* First register holding data to be sorted */
int regOrigData, /* First register holding data before packing */
- int nData, /* Number of elements in the data array */
+ int nData, /* Number of elements in the regData data array */
int nPrefixReg /* No. of reg prior to regData available for use */
){
Vdbe *v = pParse->pVdbe; /* Stmt under construction */
@@ -118202,16 +121907,32 @@ static void pushOntoSorter(
int nExpr = pSort->pOrderBy->nExpr; /* No. of ORDER BY terms */
int nBase = nExpr + bSeq + nData; /* Fields in sorter record */
int regBase; /* Regs for sorter record */
- int regRecord = ++pParse->nMem; /* Assembled sorter record */
+ int regRecord = 0; /* Assembled sorter record */
int nOBSat = pSort->nOBSat; /* ORDER BY terms to skip */
int op; /* Opcode to add sorter record to sorter */
int iLimit; /* LIMIT counter */
+ int iSkip = 0; /* End of the sorter insert loop */
assert( bSeq==0 || bSeq==1 );
+
+ /* Three cases:
+ ** (1) The data to be sorted has already been packed into a Record
+ ** by a prior OP_MakeRecord. In this case nData==1 and regData
+ ** will be completely unrelated to regOrigData.
+ ** (2) All output columns are included in the sort record. In that
+ ** case regData==regOrigData.
+ ** (3) Some output columns are omitted from the sort record due to
+ ** the SQLITE_ENABLE_SORTER_REFERENCE optimization, or due to the
+ ** SQLITE_ECEL_OMITREF optimization, or due to the
+ ** SortCtx.pDeferredRowLoad optimiation. In any of these cases
+ ** regOrigData is 0 to prevent this routine from trying to copy
+ ** values that might not yet exist.
+ */
assert( nData==1 || regData==regOrigData || regOrigData==0 );
+
if( nPrefixReg ){
assert( nPrefixReg==nExpr+bSeq );
- regBase = regData - nExpr - bSeq;
+ regBase = regData - nPrefixReg;
}else{
regBase = pParse->nMem + 1;
pParse->nMem += nBase;
@@ -118227,7 +121948,6 @@ static void pushOntoSorter(
if( nPrefixReg==0 && nData>0 ){
sqlite3ExprCodeMove(pParse, regData, regBase+nExpr+bSeq, nData);
}
- sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase+nOBSat, nBase-nOBSat, regRecord);
if( nOBSat>0 ){
int regPrevKey; /* The first nOBSat columns of the previous row */
int addrFirst; /* Address of the OP_IfNot opcode */
@@ -118236,6 +121956,7 @@ static void pushOntoSorter(
int nKey; /* Number of sorting key columns, including OP_Sequence */
KeyInfo *pKI; /* Original KeyInfo on the sorter table */
+ regRecord = makeSorterRecord(pParse, pSort, pSelect, regBase, nBase);
regPrevKey = pParse->nMem+1;
pParse->nMem += pSort->nOBSat;
nKey = nExpr - pSort->nOBSat + bSeq;
@@ -118269,6 +121990,34 @@ static void pushOntoSorter(
sqlite3ExprCodeMove(pParse, regBase, regPrevKey, pSort->nOBSat);
sqlite3VdbeJumpHere(v, addrJmp);
}
+ if( iLimit ){
+ /* At this point the values for the new sorter entry are stored
+ ** in an array of registers. They need to be composed into a record
+ ** and inserted into the sorter if either (a) there are currently
+ ** less than LIMIT+OFFSET items or (b) the new record is smaller than
+ ** the largest record currently in the sorter. If (b) is true and there
+ ** are already LIMIT+OFFSET items in the sorter, delete the largest
+ ** entry before inserting the new one. This way there are never more
+ ** than LIMIT+OFFSET items in the sorter.
+ **
+ ** If the new record does not need to be inserted into the sorter,
+ ** jump to the next iteration of the loop. Or, if the
+ ** pSort->bOrderedInnerLoop flag is set to indicate that the inner
+ ** loop delivers items in sorted order, jump to the next iteration
+ ** of the outer loop.
+ */
+ int iCsr = pSort->iECursor;
+ sqlite3VdbeAddOp2(v, OP_IfNotZero, iLimit, sqlite3VdbeCurrentAddr(v)+4);
+ VdbeCoverage(v);
+ sqlite3VdbeAddOp2(v, OP_Last, iCsr, 0);
+ iSkip = sqlite3VdbeAddOp4Int(v, OP_IdxLE,
+ iCsr, 0, regBase+nOBSat, nExpr-nOBSat);
+ VdbeCoverage(v);
+ sqlite3VdbeAddOp1(v, OP_Delete, iCsr);
+ }
+ if( regRecord==0 ){
+ regRecord = makeSorterRecord(pParse, pSort, pSelect, regBase, nBase);
+ }
if( pSort->sortFlags & SORTFLAG_UseSorter ){
op = OP_SorterInsert;
}else{
@@ -118276,33 +122025,10 @@ static void pushOntoSorter(
}
sqlite3VdbeAddOp4Int(v, op, pSort->iECursor, regRecord,
regBase+nOBSat, nBase-nOBSat);
- if( iLimit ){
- int addr;
- int r1 = 0;
- /* Fill the sorter until it contains LIMIT+OFFSET entries. (The iLimit
- ** register is initialized with value of LIMIT+OFFSET.) After the sorter
- ** fills up, delete the least entry in the sorter after each insert.
- ** Thus we never hold more than the LIMIT+OFFSET rows in memory at once */
- addr = sqlite3VdbeAddOp1(v, OP_IfNotZero, iLimit); VdbeCoverage(v);
- sqlite3VdbeAddOp1(v, OP_Last, pSort->iECursor);
- if( pSort->bOrderedInnerLoop ){
- r1 = ++pParse->nMem;
- sqlite3VdbeAddOp3(v, OP_Column, pSort->iECursor, nExpr, r1);
- VdbeComment((v, "seq"));
- }
- sqlite3VdbeAddOp1(v, OP_Delete, pSort->iECursor);
- if( pSort->bOrderedInnerLoop ){
- /* If the inner loop is driven by an index such that values from
- ** the same iteration of the inner loop are in sorted order, then
- ** immediately jump to the next iteration of an inner loop if the
- ** entry from the current iteration does not fit into the top
- ** LIMIT+OFFSET entries of the sorter. */
- int iBrk = sqlite3VdbeCurrentAddr(v) + 2;
- sqlite3VdbeAddOp3(v, OP_Eq, regBase+nExpr, iBrk, r1);
- sqlite3VdbeChangeP5(v, SQLITE_NULLEQ);
- VdbeCoverage(v);
- }
- sqlite3VdbeJumpHere(v, addr);
+ if( iSkip ){
+ assert( pSort->bOrderedInnerLoop==0 || pSort->bOrderedInnerLoop==1 );
+ sqlite3VdbeChangeP2(v, iSkip,
+ sqlite3VdbeCurrentAddr(v) + pSort->bOrderedInnerLoop);
}
}
@@ -118348,6 +122074,87 @@ static void codeDistinct(
sqlite3ReleaseTempReg(pParse, r1);
}
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+/*
+** This function is called as part of inner-loop generation for a SELECT
+** statement with an ORDER BY that is not optimized by an index. It
+** determines the expressions, if any, that the sorter-reference
+** optimization should be used for. The sorter-reference optimization
+** is used for SELECT queries like:
+**
+** SELECT a, bigblob FROM t1 ORDER BY a LIMIT 10
+**
+** If the optimization is used for expression "bigblob", then instead of
+** storing values read from that column in the sorter records, the PK of
+** the row from table t1 is stored instead. Then, as records are extracted from
+** the sorter to return to the user, the required value of bigblob is
+** retrieved directly from table t1. If the values are very large, this
+** can be more efficient than storing them directly in the sorter records.
+**
+** The ExprList_item.bSorterRef flag is set for each expression in pEList
+** for which the sorter-reference optimization should be enabled.
+** Additionally, the pSort->aDefer[] array is populated with entries
+** for all cursors required to evaluate all selected expressions. Finally.
+** output variable (*ppExtra) is set to an expression list containing
+** expressions for all extra PK values that should be stored in the
+** sorter records.
+*/
+static void selectExprDefer(
+ Parse *pParse, /* Leave any error here */
+ SortCtx *pSort, /* Sorter context */
+ ExprList *pEList, /* Expressions destined for sorter */
+ ExprList **ppExtra /* Expressions to append to sorter record */
+){
+ int i;
+ int nDefer = 0;
+ ExprList *pExtra = 0;
+ for(i=0; i<pEList->nExpr; i++){
+ struct ExprList_item *pItem = &pEList->a[i];
+ if( pItem->u.x.iOrderByCol==0 ){
+ Expr *pExpr = pItem->pExpr;
+ Table *pTab = pExpr->pTab;
+ if( pExpr->op==TK_COLUMN && pExpr->iColumn>=0 && pTab && !IsVirtual(pTab)
+ && (pTab->aCol[pExpr->iColumn].colFlags & COLFLAG_SORTERREF)
+ ){
+ int j;
+ for(j=0; j<nDefer; j++){
+ if( pSort->aDefer[j].iCsr==pExpr->iTable ) break;
+ }
+ if( j==nDefer ){
+ if( nDefer==ArraySize(pSort->aDefer) ){
+ continue;
+ }else{
+ int nKey = 1;
+ int k;
+ Index *pPk = 0;
+ if( !HasRowid(pTab) ){
+ pPk = sqlite3PrimaryKeyIndex(pTab);
+ nKey = pPk->nKeyCol;
+ }
+ for(k=0; k<nKey; k++){
+ Expr *pNew = sqlite3PExpr(pParse, TK_COLUMN, 0, 0);
+ if( pNew ){
+ pNew->iTable = pExpr->iTable;
+ pNew->pTab = pExpr->pTab;
+ pNew->iColumn = pPk ? pPk->aiColumn[k] : -1;
+ pExtra = sqlite3ExprListAppend(pParse, pExtra, pNew);
+ }
+ }
+ pSort->aDefer[nDefer].pTab = pExpr->pTab;
+ pSort->aDefer[nDefer].iCsr = pExpr->iTable;
+ pSort->aDefer[nDefer].nKey = nKey;
+ nDefer++;
+ }
+ }
+ pItem->bSorterRef = 1;
+ }
+ }
+ }
+ pSort->nDefer = (u8)nDefer;
+ *ppExtra = pExtra;
+}
+#endif
+
/*
** This routine generates the code for the inside of the inner loop
** of a SELECT.
@@ -118374,6 +122181,7 @@ static void selectInnerLoop(
int iParm = pDest->iSDParm; /* First argument to disposal method */
int nResultCol; /* Number of result columns */
int nPrefixReg = 0; /* Number of extra registers before regResult */
+ RowLoadInfo sRowLoadInfo; /* Info for deferred row loading */
/* Usually, regResult is the first cell in an array of memory cells
** containing the current result row. In this case regOrig is set to the
@@ -118420,10 +122228,14 @@ static void selectInnerLoop(
VdbeComment((v, "%s", p->pEList->a[i].zName));
}
}else if( eDest!=SRT_Exists ){
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ ExprList *pExtra = 0;
+#endif
/* If the destination is an EXISTS(...) expression, the actual
** values returned by the SELECT are not required.
*/
- u8 ecelFlags;
+ u8 ecelFlags; /* "ecel" is an abbreviation of "ExprCodeExprList" */
+ ExprList *pEList;
if( eDest==SRT_Mem || eDest==SRT_Output || eDest==SRT_Coroutine ){
ecelFlags = SQLITE_ECEL_DUP;
}else{
@@ -118437,18 +122249,68 @@ static void selectInnerLoop(
** This allows the p->pEList field to be omitted from the sorted record,
** saving space and CPU cycles. */
ecelFlags |= (SQLITE_ECEL_OMITREF|SQLITE_ECEL_REF);
+
for(i=pSort->nOBSat; i<pSort->pOrderBy->nExpr; i++){
int j;
if( (j = pSort->pOrderBy->a[i].u.x.iOrderByCol)>0 ){
p->pEList->a[j-1].u.x.iOrderByCol = i+1-pSort->nOBSat;
}
}
- regOrig = 0;
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ selectExprDefer(pParse, pSort, p->pEList, &pExtra);
+ if( pExtra && pParse->db->mallocFailed==0 ){
+ /* If there are any extra PK columns to add to the sorter records,
+ ** allocate extra memory cells and adjust the OpenEphemeral
+ ** instruction to account for the larger records. This is only
+ ** required if there are one or more WITHOUT ROWID tables with
+ ** composite primary keys in the SortCtx.aDefer[] array. */
+ VdbeOp *pOp = sqlite3VdbeGetOp(v, pSort->addrSortIndex);
+ pOp->p2 += (pExtra->nExpr - pSort->nDefer);
+ pOp->p4.pKeyInfo->nAllField += (pExtra->nExpr - pSort->nDefer);
+ pParse->nMem += pExtra->nExpr;
+ }
+#endif
+
+ /* Adjust nResultCol to account for columns that are omitted
+ ** from the sorter by the optimizations in this branch */
+ pEList = p->pEList;
+ for(i=0; i<pEList->nExpr; i++){
+ if( pEList->a[i].u.x.iOrderByCol>0
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ || pEList->a[i].bSorterRef
+#endif
+ ){
+ nResultCol--;
+ regOrig = 0;
+ }
+ }
+
+ testcase( regOrig );
+ testcase( eDest==SRT_Set );
+ testcase( eDest==SRT_Mem );
+ testcase( eDest==SRT_Coroutine );
+ testcase( eDest==SRT_Output );
assert( eDest==SRT_Set || eDest==SRT_Mem
|| eDest==SRT_Coroutine || eDest==SRT_Output );
}
- nResultCol = sqlite3ExprCodeExprList(pParse,p->pEList,regResult,
- 0,ecelFlags);
+ sRowLoadInfo.regResult = regResult;
+ sRowLoadInfo.ecelFlags = ecelFlags;
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ sRowLoadInfo.pExtra = pExtra;
+ sRowLoadInfo.regExtraResult = regResult + nResultCol;
+ if( pExtra ) nResultCol += pExtra->nExpr;
+#endif
+ if( p->iLimit
+ && (ecelFlags & SQLITE_ECEL_OMITREF)!=0
+ && nPrefixReg>0
+ ){
+ assert( pSort!=0 );
+ assert( hasDistinct==0 );
+ pSort->pDeferredRowLoad = &sRowLoadInfo;
+ regOrig = 0;
+ }else{
+ innerLoopLoadRow(pParse, p, &sRowLoadInfo);
+ }
}
/* If the DISTINCT keyword was present on the SELECT statement
@@ -118564,7 +122426,8 @@ static void selectInnerLoop(
}
#endif
if( pSort ){
- pushOntoSorter(pParse, pSort, p, r1+nPrefixReg,regResult,1,nPrefixReg);
+ assert( regResult==regOrig );
+ pushOntoSorter(pParse, pSort, p, r1+nPrefixReg, regOrig, 1, nPrefixReg);
}else{
int r2 = sqlite3GetTempReg(pParse);
sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, r2);
@@ -118831,11 +122694,7 @@ static const char *selectOpName(int id){
** is determined by the zUsage argument.
*/
static void explainTempTable(Parse *pParse, const char *zUsage){
- if( pParse->explain==2 ){
- Vdbe *v = pParse->pVdbe;
- char *zMsg = sqlite3MPrintf(pParse->db, "USE TEMP B-TREE FOR %s", zUsage);
- sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC);
- }
+ ExplainQueryPlan((pParse, 0, "USE TEMP B-TREE FOR %s", zUsage));
}
/*
@@ -118853,42 +122712,6 @@ static void explainTempTable(Parse *pParse, const char *zUsage){
# define explainSetInteger(y,z)
#endif
-#if !defined(SQLITE_OMIT_EXPLAIN) && !defined(SQLITE_OMIT_COMPOUND_SELECT)
-/*
-** Unless an "EXPLAIN QUERY PLAN" command is being processed, this function
-** is a no-op. Otherwise, it adds a single row of output to the EQP result,
-** where the caption is of one of the two forms:
-**
-** "COMPOSITE SUBQUERIES iSub1 and iSub2 (op)"
-** "COMPOSITE SUBQUERIES iSub1 and iSub2 USING TEMP B-TREE (op)"
-**
-** where iSub1 and iSub2 are the integers passed as the corresponding
-** function parameters, and op is the text representation of the parameter
-** of the same name. The parameter "op" must be one of TK_UNION, TK_EXCEPT,
-** TK_INTERSECT or TK_ALL. The first form is used if argument bUseTmp is
-** false, or the second form if it is true.
-*/
-static void explainComposite(
- Parse *pParse, /* Parse context */
- int op, /* One of TK_UNION, TK_EXCEPT etc. */
- int iSub1, /* Subquery id 1 */
- int iSub2, /* Subquery id 2 */
- int bUseTmp /* True if a temp table was used */
-){
- assert( op==TK_UNION || op==TK_EXCEPT || op==TK_INTERSECT || op==TK_ALL );
- if( pParse->explain==2 ){
- Vdbe *v = pParse->pVdbe;
- char *zMsg = sqlite3MPrintf(
- pParse->db, "COMPOUND SUBQUERIES %d AND %d %s(%s)", iSub1, iSub2,
- bUseTmp?"USING TEMP B-TREE ":"", selectOpName(op)
- );
- sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC);
- }
-}
-#else
-/* No-op versions of the explainXXX() functions and macros. */
-# define explainComposite(v,w,x,y,z)
-#endif
/*
** If the inner loop was generated using a non-null pOrderBy argument,
@@ -118906,7 +122729,7 @@ static void generateSortTail(
Vdbe *v = pParse->pVdbe; /* The prepared statement */
int addrBreak = pSort->labelDone; /* Jump here to exit loop */
int addrContinue = sqlite3VdbeMakeLabel(v); /* Jump here for next cycle */
- int addr;
+ int addr; /* Top of output loop. Jump for Next. */
int addrOnce = 0;
int iTab;
ExprList *pOrderBy = pSort->pOrderBy;
@@ -118915,11 +122738,11 @@ static void generateSortTail(
int regRow;
int regRowid;
int iCol;
- int nKey;
+ int nKey; /* Number of key columns in sorter record */
int iSortTab; /* Sorter cursor to read from */
- int nSortData; /* Trailing values to read from sorter */
int i;
int bSeq; /* True if sorter record includes seq. no. */
+ int nRefKey = 0;
struct ExprList_item *aOutEx = p->pEList->a;
assert( addrBreak<0 );
@@ -118928,15 +122751,24 @@ static void generateSortTail(
sqlite3VdbeGoto(v, addrBreak);
sqlite3VdbeResolveLabel(v, pSort->labelBkOut);
}
+
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ /* Open any cursors needed for sorter-reference expressions */
+ for(i=0; i<pSort->nDefer; i++){
+ Table *pTab = pSort->aDefer[i].pTab;
+ int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
+ sqlite3OpenTable(pParse, pSort->aDefer[i].iCsr, iDb, pTab, OP_OpenRead);
+ nRefKey = MAX(nRefKey, pSort->aDefer[i].nKey);
+ }
+#endif
+
iTab = pSort->iECursor;
if( eDest==SRT_Output || eDest==SRT_Coroutine || eDest==SRT_Mem ){
regRowid = 0;
regRow = pDest->iSdst;
- nSortData = nColumn;
}else{
regRowid = sqlite3GetTempReg(pParse);
regRow = sqlite3GetTempRange(pParse, nColumn);
- nSortData = nColumn;
}
nKey = pOrderBy->nExpr - pSort->nOBSat;
if( pSort->sortFlags & SORTFLAG_UseSorter ){
@@ -118945,7 +122777,8 @@ static void generateSortTail(
if( pSort->labelBkOut ){
addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v);
}
- sqlite3VdbeAddOp3(v, OP_OpenPseudo, iSortTab, regSortOut, nKey+1+nSortData);
+ sqlite3VdbeAddOp3(v, OP_OpenPseudo, iSortTab, regSortOut,
+ nKey+1+nColumn+nRefKey);
if( addrOnce ) sqlite3VdbeJumpHere(v, addrOnce);
addr = 1 + sqlite3VdbeAddOp2(v, OP_SorterSort, iTab, addrBreak);
VdbeCoverage(v);
@@ -118958,15 +122791,59 @@ static void generateSortTail(
iSortTab = iTab;
bSeq = 1;
}
- for(i=0, iCol=nKey+bSeq; i<nSortData; i++){
- int iRead;
- if( aOutEx[i].u.x.iOrderByCol ){
- iRead = aOutEx[i].u.x.iOrderByCol-1;
- }else{
- iRead = iCol++;
+ for(i=0, iCol=nKey+bSeq-1; i<nColumn; i++){
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ if( aOutEx[i].bSorterRef ) continue;
+#endif
+ if( aOutEx[i].u.x.iOrderByCol==0 ) iCol++;
+ }
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ if( pSort->nDefer ){
+ int iKey = iCol+1;
+ int regKey = sqlite3GetTempRange(pParse, nRefKey);
+
+ for(i=0; i<pSort->nDefer; i++){
+ int iCsr = pSort->aDefer[i].iCsr;
+ Table *pTab = pSort->aDefer[i].pTab;
+ int nKey = pSort->aDefer[i].nKey;
+
+ sqlite3VdbeAddOp1(v, OP_NullRow, iCsr);
+ if( HasRowid(pTab) ){
+ sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iKey++, regKey);
+ sqlite3VdbeAddOp3(v, OP_SeekRowid, iCsr,
+ sqlite3VdbeCurrentAddr(v)+1, regKey);
+ }else{
+ int k;
+ int iJmp;
+ assert( sqlite3PrimaryKeyIndex(pTab)->nKeyCol==nKey );
+ for(k=0; k<nKey; k++){
+ sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iKey++, regKey+k);
+ }
+ iJmp = sqlite3VdbeCurrentAddr(v);
+ sqlite3VdbeAddOp4Int(v, OP_SeekGE, iCsr, iJmp+2, regKey, nKey);
+ sqlite3VdbeAddOp4Int(v, OP_IdxLE, iCsr, iJmp+3, regKey, nKey);
+ sqlite3VdbeAddOp1(v, OP_NullRow, iCsr);
+ }
+ }
+ sqlite3ReleaseTempRange(pParse, regKey, nRefKey);
+ }
+#endif
+ for(i=nColumn-1; i>=0; i--){
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ if( aOutEx[i].bSorterRef ){
+ sqlite3ExprCode(pParse, aOutEx[i].pExpr, regRow+i);
+ }else
+#endif
+ {
+ int iRead;
+ if( aOutEx[i].u.x.iOrderByCol ){
+ iRead = aOutEx[i].u.x.iOrderByCol-1;
+ }else{
+ iRead = iCol--;
+ }
+ sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iRead, regRow+i);
+ VdbeComment((v, "%s", aOutEx[i].zName?aOutEx[i].zName : aOutEx[i].zSpan));
}
- sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iRead, regRow+i);
- VdbeComment((v, "%s", aOutEx[i].zName ? aOutEx[i].zName : aOutEx[i].zSpan));
}
switch( eDest ){
case SRT_Table:
@@ -119073,8 +122950,9 @@ static const char *columnTypeImpl(
assert( pExpr!=0 );
assert( pNC->pSrcList!=0 );
+ assert( pExpr->op!=TK_AGG_COLUMN ); /* This routine runes before aggregates
+ ** are processed */
switch( pExpr->op ){
- case TK_AGG_COLUMN:
case TK_COLUMN: {
/* The expression is a column. Locate the table the column is being
** extracted from in NameContext.pSrcList. This table may be real
@@ -119083,8 +122961,6 @@ static const char *columnTypeImpl(
Table *pTab = 0; /* Table structure column is extracted from */
Select *pS = 0; /* Select the column is extracted from */
int iCol = pExpr->iColumn; /* Index of column in pTab */
- testcase( pExpr->op==TK_AGG_COLUMN );
- testcase( pExpr->op==TK_COLUMN );
while( pNC && !pTab ){
SrcList *pTabList = pNC->pSrcList;
for(j=0;j<pTabList->nSrc && pTabList->a[j].iCursor!=pExpr->iTable;j++);
@@ -119285,9 +123161,10 @@ static void generateColumnNames(
}
#endif
- if( pParse->colNamesSet || db->mallocFailed ) return;
+ if( pParse->colNamesSet ) return;
/* Column names are determined by the left-most term of a compound select */
while( pSelect->pPrior ) pSelect = pSelect->pPrior;
+ SELECTTRACE(1,pParse,pSelect,("generating column names\n"));
pTabList = pSelect->pSrc;
pEList = pSelect->pEList;
assert( v!=0 );
@@ -119396,12 +123273,12 @@ SQLITE_PRIVATE int sqlite3ColumnsFromExprList(
pColExpr = pColExpr->pRight;
assert( pColExpr!=0 );
}
- if( (pColExpr->op==TK_COLUMN || pColExpr->op==TK_AGG_COLUMN)
- && pColExpr->pTab!=0
- ){
+ assert( pColExpr->op!=TK_AGG_COLUMN );
+ if( pColExpr->op==TK_COLUMN ){
/* For columns use the column name name */
int iCol = pColExpr->iColumn;
Table *pTab = pColExpr->pTab;
+ assert( pTab!=0 );
if( iCol<0 ) iCol = pTab->iPKey;
zName = iCol>=0 ? pTab->aCol[iCol].zName : "rowid";
}else if( pColExpr->op==TK_ID ){
@@ -119561,7 +123438,7 @@ SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse *pParse){
/*
** Compute the iLimit and iOffset fields of the SELECT based on the
-** pLimit and pOffset expressions. pLimit and pOffset hold the expressions
+** pLimit expressions. pLimit->pLeft and pLimit->pRight hold the expressions
** that appear in the original SQL statement after the LIMIT and OFFSET
** keywords. Or NULL if those keywords are omitted. iLimit and iOffset
** are the integer memory register numbers for counters used to compute
@@ -119569,15 +123446,15 @@ SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse *pParse){
** iLimit and iOffset are negative.
**
** This routine changes the values of iLimit and iOffset only if
-** a limit or offset is defined by pLimit and pOffset. iLimit and
-** iOffset should have been preset to appropriate default values (zero)
+** a limit or offset is defined by pLimit->pLeft and pLimit->pRight. iLimit
+** and iOffset should have been preset to appropriate default values (zero)
** prior to calling this routine.
**
** The iOffset register (if it exists) is initialized to the value
** of the OFFSET. The iLimit register is initialized to LIMIT. Register
** iOffset+1 is initialized to LIMIT+OFFSET.
**
-** Only if pLimit!=0 or pOffset!=0 do the limit registers get
+** Only if pLimit->pLeft!=0 do the limit registers get
** redefined. The UNION ALL operator uses this property to force
** the reuse of the same limit and offset registers across multiple
** SELECT statements.
@@ -119587,6 +123464,8 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){
int iLimit = 0;
int iOffset;
int n;
+ Expr *pLimit = p->pLimit;
+
if( p->iLimit ) return;
/*
@@ -119596,12 +123475,13 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){
** no rows.
*/
sqlite3ExprCacheClear(pParse);
- assert( p->pOffset==0 || p->pLimit!=0 );
- if( p->pLimit ){
+ if( pLimit ){
+ assert( pLimit->op==TK_LIMIT );
+ assert( pLimit->pLeft!=0 );
p->iLimit = iLimit = ++pParse->nMem;
v = sqlite3GetVdbe(pParse);
assert( v!=0 );
- if( sqlite3ExprIsInteger(p->pLimit, &n) ){
+ if( sqlite3ExprIsInteger(pLimit->pLeft, &n) ){
sqlite3VdbeAddOp2(v, OP_Integer, n, iLimit);
VdbeComment((v, "LIMIT counter"));
if( n==0 ){
@@ -119611,15 +123491,15 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){
p->selFlags |= SF_FixedLimit;
}
}else{
- sqlite3ExprCode(pParse, p->pLimit, iLimit);
+ sqlite3ExprCode(pParse, pLimit->pLeft, iLimit);
sqlite3VdbeAddOp1(v, OP_MustBeInt, iLimit); VdbeCoverage(v);
VdbeComment((v, "LIMIT counter"));
sqlite3VdbeAddOp2(v, OP_IfNot, iLimit, iBreak); VdbeCoverage(v);
}
- if( p->pOffset ){
+ if( pLimit->pRight ){
p->iOffset = iOffset = ++pParse->nMem;
pParse->nMem++; /* Allocate an extra register for limit+offset */
- sqlite3ExprCode(pParse, p->pOffset, iOffset);
+ sqlite3ExprCode(pParse, pLimit->pRight, iOffset);
sqlite3VdbeAddOp1(v, OP_MustBeInt, iOffset); VdbeCoverage(v);
VdbeComment((v, "OFFSET counter"));
sqlite3VdbeAddOp3(v, OP_OffsetLimit, iLimit, iOffset+1, iOffset);
@@ -119749,7 +123629,7 @@ static void generateWithRecursiveQuery(
int i; /* Loop counter */
int rc; /* Result code */
ExprList *pOrderBy; /* The ORDER BY clause */
- Expr *pLimit, *pOffset; /* Saved LIMIT and OFFSET */
+ Expr *pLimit; /* Saved LIMIT and OFFSET */
int regLimit, regOffset; /* Registers used by LIMIT and OFFSET */
/* Obtain authorization to do a recursive query */
@@ -119760,10 +123640,9 @@ static void generateWithRecursiveQuery(
p->nSelectRow = 320; /* 4 billion rows */
computeLimitRegisters(pParse, p, addrBreak);
pLimit = p->pLimit;
- pOffset = p->pOffset;
regLimit = p->iLimit;
regOffset = p->iOffset;
- p->pLimit = p->pOffset = 0;
+ p->pLimit = 0;
p->iLimit = p->iOffset = 0;
pOrderBy = p->pOrderBy;
@@ -119809,6 +123688,7 @@ static void generateWithRecursiveQuery(
/* Store the results of the setup-query in Queue. */
pSetup->pNext = 0;
+ ExplainQueryPlan((pParse, 1, "SETUP"));
rc = sqlite3Select(pParse, pSetup, &destQueue);
pSetup->pNext = p;
if( rc ) goto end_of_recursive_query;
@@ -119843,6 +123723,7 @@ static void generateWithRecursiveQuery(
sqlite3ErrorMsg(pParse, "recursive aggregate queries not supported");
}else{
p->pPrior = 0;
+ ExplainQueryPlan((pParse, 1, "RECURSIVE STEP"));
sqlite3Select(pParse, p, &destQueue);
assert( p->pPrior==0 );
p->pPrior = pSetup;
@@ -119856,7 +123737,6 @@ end_of_recursive_query:
sqlite3ExprListDelete(pParse->db, p->pOrderBy);
p->pOrderBy = pOrderBy;
p->pLimit = pLimit;
- p->pOffset = pOffset;
return;
}
#endif /* SQLITE_OMIT_CTE */
@@ -119875,36 +123755,38 @@ static int multiSelectOrderBy(
** on a VALUES clause.
**
** Because the Select object originates from a VALUES clause:
-** (1) It has no LIMIT or OFFSET
+** (1) There is no LIMIT or OFFSET or else there is a LIMIT of exactly 1
** (2) All terms are UNION ALL
** (3) There is no ORDER BY clause
+**
+** The "LIMIT of exactly 1" case of condition (1) comes about when a VALUES
+** clause occurs within scalar expression (ex: "SELECT (VALUES(1),(2),(3))").
+** The sqlite3CodeSubselect will have added the LIMIT 1 clause in tht case.
+** Since the limit is exactly 1, we only need to evalutes the left-most VALUES.
*/
static int multiSelectValues(
Parse *pParse, /* Parsing context */
Select *p, /* The right-most of SELECTs to be coded */
SelectDest *pDest /* What to do with query results */
){
- Select *pPrior;
int nRow = 1;
int rc = 0;
+ int bShowAll = p->pLimit==0;
assert( p->selFlags & SF_MultiValue );
do{
assert( p->selFlags & SF_Values );
assert( p->op==TK_ALL || (p->op==TK_SELECT && p->pPrior==0) );
- assert( p->pLimit==0 );
- assert( p->pOffset==0 );
assert( p->pNext==0 || p->pEList->nExpr==p->pNext->pEList->nExpr );
if( p->pPrior==0 ) break;
assert( p->pPrior->pNext==p );
p = p->pPrior;
- nRow++;
+ nRow += bShowAll;
}while(1);
+ ExplainQueryPlan((pParse, 0, "SCAN %d CONSTANT ROW%s", nRow,
+ nRow==1 ? "" : "S"));
while( p ){
- pPrior = p->pPrior;
- p->pPrior = 0;
- rc = sqlite3Select(pParse, p, pDest);
- p->pPrior = pPrior;
- if( rc ) break;
+ selectInnerLoop(pParse, p, -1, 0, 0, pDest, 1, 1);
+ if( !bShowAll ) break;
p->nSelectRow = nRow;
p = p->pNext;
}
@@ -119953,10 +123835,6 @@ static int multiSelect(
SelectDest dest; /* Alternative data destination */
Select *pDelete = 0; /* Chain of simple selects to delete */
sqlite3 *db; /* Database connection */
-#ifndef SQLITE_OMIT_EXPLAIN
- int iSub1 = 0; /* EQP id of left-hand query */
- int iSub2 = 0; /* EQP id of right-hand query */
-#endif
/* Make sure there is no ORDER BY or LIMIT clause on prior SELECTs. Only
** the last (right-most) SELECT in the series may have an ORDER BY or LIMIT.
@@ -120007,226 +123885,231 @@ static int multiSelect(
*/
if( p->pOrderBy ){
return multiSelectOrderBy(pParse, p, pDest);
- }else
+ }else{
- /* Generate code for the left and right SELECT statements.
- */
- switch( p->op ){
- case TK_ALL: {
- int addr = 0;
- int nLimit;
- assert( !pPrior->pLimit );
- pPrior->iLimit = p->iLimit;
- pPrior->iOffset = p->iOffset;
- pPrior->pLimit = p->pLimit;
- pPrior->pOffset = p->pOffset;
- explainSetInteger(iSub1, pParse->iNextSelectId);
- rc = sqlite3Select(pParse, pPrior, &dest);
- p->pLimit = 0;
- p->pOffset = 0;
- if( rc ){
- goto multi_select_end;
- }
- p->pPrior = 0;
- p->iLimit = pPrior->iLimit;
- p->iOffset = pPrior->iOffset;
- if( p->iLimit ){
- addr = sqlite3VdbeAddOp1(v, OP_IfNot, p->iLimit); VdbeCoverage(v);
- VdbeComment((v, "Jump ahead if LIMIT reached"));
- if( p->iOffset ){
- sqlite3VdbeAddOp3(v, OP_OffsetLimit,
- p->iLimit, p->iOffset+1, p->iOffset);
+#ifndef SQLITE_OMIT_EXPLAIN
+ if( pPrior->pPrior==0 ){
+ ExplainQueryPlan((pParse, 1, "COMPOUND QUERY"));
+ ExplainQueryPlan((pParse, 1, "LEFT-MOST SUBQUERY"));
+ }
+#endif
+
+ /* Generate code for the left and right SELECT statements.
+ */
+ switch( p->op ){
+ case TK_ALL: {
+ int addr = 0;
+ int nLimit;
+ assert( !pPrior->pLimit );
+ pPrior->iLimit = p->iLimit;
+ pPrior->iOffset = p->iOffset;
+ pPrior->pLimit = p->pLimit;
+ rc = sqlite3Select(pParse, pPrior, &dest);
+ p->pLimit = 0;
+ if( rc ){
+ goto multi_select_end;
+ }
+ p->pPrior = 0;
+ p->iLimit = pPrior->iLimit;
+ p->iOffset = pPrior->iOffset;
+ if( p->iLimit ){
+ addr = sqlite3VdbeAddOp1(v, OP_IfNot, p->iLimit); VdbeCoverage(v);
+ VdbeComment((v, "Jump ahead if LIMIT reached"));
+ if( p->iOffset ){
+ sqlite3VdbeAddOp3(v, OP_OffsetLimit,
+ p->iLimit, p->iOffset+1, p->iOffset);
+ }
}
+ ExplainQueryPlan((pParse, 1, "UNION ALL"));
+ rc = sqlite3Select(pParse, p, &dest);
+ testcase( rc!=SQLITE_OK );
+ pDelete = p->pPrior;
+ p->pPrior = pPrior;
+ p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow);
+ if( pPrior->pLimit
+ && sqlite3ExprIsInteger(pPrior->pLimit->pLeft, &nLimit)
+ && nLimit>0 && p->nSelectRow > sqlite3LogEst((u64)nLimit)
+ ){
+ p->nSelectRow = sqlite3LogEst((u64)nLimit);
+ }
+ if( addr ){
+ sqlite3VdbeJumpHere(v, addr);
+ }
+ break;
}
- explainSetInteger(iSub2, pParse->iNextSelectId);
- rc = sqlite3Select(pParse, p, &dest);
- testcase( rc!=SQLITE_OK );
- pDelete = p->pPrior;
- p->pPrior = pPrior;
- p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow);
- if( pPrior->pLimit
- && sqlite3ExprIsInteger(pPrior->pLimit, &nLimit)
- && nLimit>0 && p->nSelectRow > sqlite3LogEst((u64)nLimit)
- ){
- p->nSelectRow = sqlite3LogEst((u64)nLimit);
- }
- if( addr ){
- sqlite3VdbeJumpHere(v, addr);
- }
- break;
- }
- case TK_EXCEPT:
- case TK_UNION: {
- int unionTab; /* Cursor number of the temporary table holding result */
- u8 op = 0; /* One of the SRT_ operations to apply to self */
- int priorOp; /* The SRT_ operation to apply to prior selects */
- Expr *pLimit, *pOffset; /* Saved values of p->nLimit and p->nOffset */
- int addr;
- SelectDest uniondest;
-
- testcase( p->op==TK_EXCEPT );
- testcase( p->op==TK_UNION );
- priorOp = SRT_Union;
- if( dest.eDest==priorOp ){
- /* We can reuse a temporary table generated by a SELECT to our
- ** right.
+ case TK_EXCEPT:
+ case TK_UNION: {
+ int unionTab; /* Cursor number of the temp table holding result */
+ u8 op = 0; /* One of the SRT_ operations to apply to self */
+ int priorOp; /* The SRT_ operation to apply to prior selects */
+ Expr *pLimit; /* Saved values of p->nLimit */
+ int addr;
+ SelectDest uniondest;
+
+ testcase( p->op==TK_EXCEPT );
+ testcase( p->op==TK_UNION );
+ priorOp = SRT_Union;
+ if( dest.eDest==priorOp ){
+ /* We can reuse a temporary table generated by a SELECT to our
+ ** right.
+ */
+ assert( p->pLimit==0 ); /* Not allowed on leftward elements */
+ unionTab = dest.iSDParm;
+ }else{
+ /* We will need to create our own temporary table to hold the
+ ** intermediate results.
+ */
+ unionTab = pParse->nTab++;
+ assert( p->pOrderBy==0 );
+ addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, unionTab, 0);
+ assert( p->addrOpenEphm[0] == -1 );
+ p->addrOpenEphm[0] = addr;
+ findRightmost(p)->selFlags |= SF_UsesEphemeral;
+ assert( p->pEList );
+ }
+
+ /* Code the SELECT statements to our left
*/
- assert( p->pLimit==0 ); /* Not allowed on leftward elements */
- assert( p->pOffset==0 ); /* Not allowed on leftward elements */
- unionTab = dest.iSDParm;
- }else{
- /* We will need to create our own temporary table to hold the
- ** intermediate results.
+ assert( !pPrior->pOrderBy );
+ sqlite3SelectDestInit(&uniondest, priorOp, unionTab);
+ rc = sqlite3Select(pParse, pPrior, &uniondest);
+ if( rc ){
+ goto multi_select_end;
+ }
+
+ /* Code the current SELECT statement
*/
- unionTab = pParse->nTab++;
+ if( p->op==TK_EXCEPT ){
+ op = SRT_Except;
+ }else{
+ assert( p->op==TK_UNION );
+ op = SRT_Union;
+ }
+ p->pPrior = 0;
+ pLimit = p->pLimit;
+ p->pLimit = 0;
+ uniondest.eDest = op;
+ ExplainQueryPlan((pParse, 1, "%s USING TEMP B-TREE",
+ selectOpName(p->op)));
+ rc = sqlite3Select(pParse, p, &uniondest);
+ testcase( rc!=SQLITE_OK );
+ /* Query flattening in sqlite3Select() might refill p->pOrderBy.
+ ** Be sure to delete p->pOrderBy, therefore, to avoid a memory leak. */
+ sqlite3ExprListDelete(db, p->pOrderBy);
+ pDelete = p->pPrior;
+ p->pPrior = pPrior;
+ p->pOrderBy = 0;
+ if( p->op==TK_UNION ){
+ p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow);
+ }
+ sqlite3ExprDelete(db, p->pLimit);
+ p->pLimit = pLimit;
+ p->iLimit = 0;
+ p->iOffset = 0;
+
+ /* Convert the data in the temporary table into whatever form
+ ** it is that we currently need.
+ */
+ assert( unionTab==dest.iSDParm || dest.eDest!=priorOp );
+ if( dest.eDest!=priorOp ){
+ int iCont, iBreak, iStart;
+ assert( p->pEList );
+ iBreak = sqlite3VdbeMakeLabel(v);
+ iCont = sqlite3VdbeMakeLabel(v);
+ computeLimitRegisters(pParse, p, iBreak);
+ sqlite3VdbeAddOp2(v, OP_Rewind, unionTab, iBreak); VdbeCoverage(v);
+ iStart = sqlite3VdbeCurrentAddr(v);
+ selectInnerLoop(pParse, p, unionTab,
+ 0, 0, &dest, iCont, iBreak);
+ sqlite3VdbeResolveLabel(v, iCont);
+ sqlite3VdbeAddOp2(v, OP_Next, unionTab, iStart); VdbeCoverage(v);
+ sqlite3VdbeResolveLabel(v, iBreak);
+ sqlite3VdbeAddOp2(v, OP_Close, unionTab, 0);
+ }
+ break;
+ }
+ default: assert( p->op==TK_INTERSECT ); {
+ int tab1, tab2;
+ int iCont, iBreak, iStart;
+ Expr *pLimit;
+ int addr;
+ SelectDest intersectdest;
+ int r1;
+
+ /* INTERSECT is different from the others since it requires
+ ** two temporary tables. Hence it has its own case. Begin
+ ** by allocating the tables we will need.
+ */
+ tab1 = pParse->nTab++;
+ tab2 = pParse->nTab++;
assert( p->pOrderBy==0 );
- addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, unionTab, 0);
+
+ addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab1, 0);
assert( p->addrOpenEphm[0] == -1 );
p->addrOpenEphm[0] = addr;
findRightmost(p)->selFlags |= SF_UsesEphemeral;
assert( p->pEList );
- }
-
- /* Code the SELECT statements to our left
- */
- assert( !pPrior->pOrderBy );
- sqlite3SelectDestInit(&uniondest, priorOp, unionTab);
- explainSetInteger(iSub1, pParse->iNextSelectId);
- rc = sqlite3Select(pParse, pPrior, &uniondest);
- if( rc ){
- goto multi_select_end;
- }
-
- /* Code the current SELECT statement
- */
- if( p->op==TK_EXCEPT ){
- op = SRT_Except;
- }else{
- assert( p->op==TK_UNION );
- op = SRT_Union;
- }
- p->pPrior = 0;
- pLimit = p->pLimit;
- p->pLimit = 0;
- pOffset = p->pOffset;
- p->pOffset = 0;
- uniondest.eDest = op;
- explainSetInteger(iSub2, pParse->iNextSelectId);
- rc = sqlite3Select(pParse, p, &uniondest);
- testcase( rc!=SQLITE_OK );
- /* Query flattening in sqlite3Select() might refill p->pOrderBy.
- ** Be sure to delete p->pOrderBy, therefore, to avoid a memory leak. */
- sqlite3ExprListDelete(db, p->pOrderBy);
- pDelete = p->pPrior;
- p->pPrior = pPrior;
- p->pOrderBy = 0;
- if( p->op==TK_UNION ){
- p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow);
- }
- sqlite3ExprDelete(db, p->pLimit);
- p->pLimit = pLimit;
- p->pOffset = pOffset;
- p->iLimit = 0;
- p->iOffset = 0;
-
- /* Convert the data in the temporary table into whatever form
- ** it is that we currently need.
- */
- assert( unionTab==dest.iSDParm || dest.eDest!=priorOp );
- if( dest.eDest!=priorOp ){
- int iCont, iBreak, iStart;
+
+ /* Code the SELECTs to our left into temporary table "tab1".
+ */
+ sqlite3SelectDestInit(&intersectdest, SRT_Union, tab1);
+ rc = sqlite3Select(pParse, pPrior, &intersectdest);
+ if( rc ){
+ goto multi_select_end;
+ }
+
+ /* Code the current SELECT into temporary table "tab2"
+ */
+ addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab2, 0);
+ assert( p->addrOpenEphm[1] == -1 );
+ p->addrOpenEphm[1] = addr;
+ p->pPrior = 0;
+ pLimit = p->pLimit;
+ p->pLimit = 0;
+ intersectdest.iSDParm = tab2;
+ ExplainQueryPlan((pParse, 1, "%s USING TEMP B-TREE",
+ selectOpName(p->op)));
+ rc = sqlite3Select(pParse, p, &intersectdest);
+ testcase( rc!=SQLITE_OK );
+ pDelete = p->pPrior;
+ p->pPrior = pPrior;
+ if( p->nSelectRow>pPrior->nSelectRow ){
+ p->nSelectRow = pPrior->nSelectRow;
+ }
+ sqlite3ExprDelete(db, p->pLimit);
+ p->pLimit = pLimit;
+
+ /* Generate code to take the intersection of the two temporary
+ ** tables.
+ */
assert( p->pEList );
iBreak = sqlite3VdbeMakeLabel(v);
iCont = sqlite3VdbeMakeLabel(v);
computeLimitRegisters(pParse, p, iBreak);
- sqlite3VdbeAddOp2(v, OP_Rewind, unionTab, iBreak); VdbeCoverage(v);
- iStart = sqlite3VdbeCurrentAddr(v);
- selectInnerLoop(pParse, p, unionTab,
+ sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); VdbeCoverage(v);
+ r1 = sqlite3GetTempReg(pParse);
+ iStart = sqlite3VdbeAddOp2(v, OP_RowData, tab1, r1);
+ sqlite3VdbeAddOp4Int(v, OP_NotFound, tab2, iCont, r1, 0);
+ VdbeCoverage(v);
+ sqlite3ReleaseTempReg(pParse, r1);
+ selectInnerLoop(pParse, p, tab1,
0, 0, &dest, iCont, iBreak);
sqlite3VdbeResolveLabel(v, iCont);
- sqlite3VdbeAddOp2(v, OP_Next, unionTab, iStart); VdbeCoverage(v);
+ sqlite3VdbeAddOp2(v, OP_Next, tab1, iStart); VdbeCoverage(v);
sqlite3VdbeResolveLabel(v, iBreak);
- sqlite3VdbeAddOp2(v, OP_Close, unionTab, 0);
+ sqlite3VdbeAddOp2(v, OP_Close, tab2, 0);
+ sqlite3VdbeAddOp2(v, OP_Close, tab1, 0);
+ break;
}
- break;
}
- default: assert( p->op==TK_INTERSECT ); {
- int tab1, tab2;
- int iCont, iBreak, iStart;
- Expr *pLimit, *pOffset;
- int addr;
- SelectDest intersectdest;
- int r1;
-
- /* INTERSECT is different from the others since it requires
- ** two temporary tables. Hence it has its own case. Begin
- ** by allocating the tables we will need.
- */
- tab1 = pParse->nTab++;
- tab2 = pParse->nTab++;
- assert( p->pOrderBy==0 );
-
- addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab1, 0);
- assert( p->addrOpenEphm[0] == -1 );
- p->addrOpenEphm[0] = addr;
- findRightmost(p)->selFlags |= SF_UsesEphemeral;
- assert( p->pEList );
-
- /* Code the SELECTs to our left into temporary table "tab1".
- */
- sqlite3SelectDestInit(&intersectdest, SRT_Union, tab1);
- explainSetInteger(iSub1, pParse->iNextSelectId);
- rc = sqlite3Select(pParse, pPrior, &intersectdest);
- if( rc ){
- goto multi_select_end;
- }
-
- /* Code the current SELECT into temporary table "tab2"
- */
- addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab2, 0);
- assert( p->addrOpenEphm[1] == -1 );
- p->addrOpenEphm[1] = addr;
- p->pPrior = 0;
- pLimit = p->pLimit;
- p->pLimit = 0;
- pOffset = p->pOffset;
- p->pOffset = 0;
- intersectdest.iSDParm = tab2;
- explainSetInteger(iSub2, pParse->iNextSelectId);
- rc = sqlite3Select(pParse, p, &intersectdest);
- testcase( rc!=SQLITE_OK );
- pDelete = p->pPrior;
- p->pPrior = pPrior;
- if( p->nSelectRow>pPrior->nSelectRow ) p->nSelectRow = pPrior->nSelectRow;
- sqlite3ExprDelete(db, p->pLimit);
- p->pLimit = pLimit;
- p->pOffset = pOffset;
-
- /* Generate code to take the intersection of the two temporary
- ** tables.
- */
- assert( p->pEList );
- iBreak = sqlite3VdbeMakeLabel(v);
- iCont = sqlite3VdbeMakeLabel(v);
- computeLimitRegisters(pParse, p, iBreak);
- sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); VdbeCoverage(v);
- r1 = sqlite3GetTempReg(pParse);
- iStart = sqlite3VdbeAddOp2(v, OP_RowData, tab1, r1);
- sqlite3VdbeAddOp4Int(v, OP_NotFound, tab2, iCont, r1, 0); VdbeCoverage(v);
- sqlite3ReleaseTempReg(pParse, r1);
- selectInnerLoop(pParse, p, tab1,
- 0, 0, &dest, iCont, iBreak);
- sqlite3VdbeResolveLabel(v, iCont);
- sqlite3VdbeAddOp2(v, OP_Next, tab1, iStart); VdbeCoverage(v);
- sqlite3VdbeResolveLabel(v, iBreak);
- sqlite3VdbeAddOp2(v, OP_Close, tab2, 0);
- sqlite3VdbeAddOp2(v, OP_Close, tab1, 0);
- break;
+
+ #ifndef SQLITE_OMIT_EXPLAIN
+ if( p->pNext==0 ){
+ ExplainQueryPlanPop(pParse);
}
+ #endif
}
-
- explainComposite(pParse, p->op, iSub1, iSub2, p->op!=TK_ALL);
-
+
/* Compute collating sequences used by
** temporary tables needed to implement the compound select.
** Attach the KeyInfo structure to all temporary tables.
@@ -120564,10 +124447,6 @@ static int multiSelectOrderBy(
ExprList *pOrderBy; /* The ORDER BY clause */
int nOrderBy; /* Number of terms in the ORDER BY clause */
int *aPermute; /* Mapping from ORDER BY terms to result set columns */
-#ifndef SQLITE_OMIT_EXPLAIN
- int iSub1; /* EQP id of left-hand query */
- int iSub2; /* EQP id of right-hand query */
-#endif
assert( p->pOrderBy!=0 );
assert( pKeyDup==0 ); /* "Managed" code needs this. Ticket #3382. */
@@ -120679,8 +124558,6 @@ static int multiSelectOrderBy(
}
sqlite3ExprDelete(db, p->pLimit);
p->pLimit = 0;
- sqlite3ExprDelete(db, p->pOffset);
- p->pOffset = 0;
regAddrA = ++pParse->nMem;
regAddrB = ++pParse->nMem;
@@ -120689,6 +124566,8 @@ static int multiSelectOrderBy(
sqlite3SelectDestInit(&destA, SRT_Coroutine, regAddrA);
sqlite3SelectDestInit(&destB, SRT_Coroutine, regAddrB);
+ ExplainQueryPlan((pParse, 1, "MERGE (%s)", selectOpName(p->op)));
+
/* Generate a coroutine to evaluate the SELECT statement to the
** left of the compound operator - the "A" select.
*/
@@ -120696,7 +124575,7 @@ static int multiSelectOrderBy(
addr1 = sqlite3VdbeAddOp3(v, OP_InitCoroutine, regAddrA, 0, addrSelectA);
VdbeComment((v, "left SELECT"));
pPrior->iLimit = regLimitA;
- explainSetInteger(iSub1, pParse->iNextSelectId);
+ ExplainQueryPlan((pParse, 1, "LEFT"));
sqlite3Select(pParse, pPrior, &destA);
sqlite3VdbeEndCoroutine(v, regAddrA);
sqlite3VdbeJumpHere(v, addr1);
@@ -120711,7 +124590,7 @@ static int multiSelectOrderBy(
savedOffset = p->iOffset;
p->iLimit = regLimitB;
p->iOffset = 0;
- explainSetInteger(iSub2, pParse->iNextSelectId);
+ ExplainQueryPlan((pParse, 1, "RIGHT"));
sqlite3Select(pParse, p, &destB);
p->iLimit = savedLimit;
p->iOffset = savedOffset;
@@ -120823,7 +124702,7 @@ static int multiSelectOrderBy(
/*** TBD: Insert subroutine calls to close cursors on incomplete
**** subqueries ****/
- explainComposite(pParse, p->op, iSub1, iSub2, 0);
+ ExplainQueryPlanPop(pParse);
return pParse->nErr!=0;
}
#endif
@@ -121070,12 +124949,11 @@ static void substSelect(
** (19) If the subquery uses LIMIT then the outer query may not
** have a WHERE clause.
**
-** (**) Subsumed into (17d3). Was: If the sub-query is a compound select,
-** then it must not use an ORDER BY clause - Ticket #3773. Because
-** of (17d3), then only way to have a compound subquery is if it is
-** the only term in the FROM clause of the outer query. But if the
-** only term in the FROM clause has an ORDER BY, then it will be
-** implemented as a co-routine and the flattener will never be called.
+** (20) If the sub-query is a compound select, then it must not use
+** an ORDER BY clause. Ticket #3773. We could relax this constraint
+** somewhat by saying that the terms of the ORDER BY clause must
+** appear as unmodified result columns in the outer query. But we
+** have other optimizations in mind to deal with that case.
**
** (21) If the subquery uses LIMIT then the outer query may not be
** DISTINCT. (See ticket [752e1646fc]).
@@ -121145,7 +125023,7 @@ static int flattenSubquery(
** became arbitrary expressions, we were forced to add restrictions (13)
** and (14). */
if( pSub->pLimit && p->pLimit ) return 0; /* Restriction (13) */
- if( pSub->pOffset ) return 0; /* Restriction (14) */
+ if( pSub->pLimit && pSub->pLimit->pRight ) return 0; /* Restriction (14) */
if( (p->selFlags & SF_Compound)!=0 && pSub->pLimit ){
return 0; /* Restriction (15) */
}
@@ -121209,6 +125087,9 @@ static int flattenSubquery(
** queries.
*/
if( pSub->pPrior ){
+ if( pSub->pOrderBy ){
+ return 0; /* Restriction (20) */
+ }
if( isAgg || (p->selFlags & SF_Distinct)!=0 || pSrc->nSrc!=1 ){
return 0; /* (17d1), (17d2), or (17d3) */
}
@@ -121243,15 +125124,6 @@ static int flattenSubquery(
*/
assert( (p->selFlags & SF_Recursive)==0 || pSub->pPrior==0 );
- /* Ex-restriction (20):
- ** A compound subquery must be the only term in the FROM clause of the
- ** outer query by restriction (17d3). But if that term also has an
- ** ORDER BY clause, then the subquery will be implemented by co-routine
- ** and so the flattener will never be invoked. Hence, it is not possible
- ** for the subquery to be a compound and have an ORDER BY clause.
- */
- assert( pSub->pPrior==0 || pSub->pOrderBy==0 );
-
/***** If we reach this point, flattening is permitted. *****/
SELECTTRACE(1,pParse,p,("flatten %s.%p from term %d\n",
pSub->zSelName, pSub, iFrom));
@@ -121299,16 +125171,13 @@ static int flattenSubquery(
Select *pNew;
ExprList *pOrderBy = p->pOrderBy;
Expr *pLimit = p->pLimit;
- Expr *pOffset = p->pOffset;
Select *pPrior = p->pPrior;
p->pOrderBy = 0;
p->pSrc = 0;
p->pPrior = 0;
p->pLimit = 0;
- p->pOffset = 0;
pNew = sqlite3SelectDup(db, p, 0);
sqlite3SelectSetName(pNew, pSub->zSelName);
- p->pOffset = pOffset;
p->pLimit = pLimit;
p->pOrderBy = pOrderBy;
p->pSrc = pSrc;
@@ -121320,9 +125189,8 @@ static int flattenSubquery(
if( pPrior ) pPrior->pNext = pNew;
pNew->pNext = p;
p->pPrior = pNew;
- SELECTTRACE(2,pParse,p,
- ("compound-subquery flattener creates %s.%p as peer\n",
- pNew->zSelName, pNew));
+ SELECTTRACE(2,pParse,p,("compound-subquery flattener"
+ " creates %s.%p as peer\n",pNew->zSelName, pNew));
}
if( db->mallocFailed ) return 1;
}
@@ -121456,7 +125324,6 @@ static int flattenSubquery(
pOrderBy->a[i].u.x.iOrderByCol = 0;
}
assert( pParent->pOrderBy==0 );
- assert( pSub->pPrior==0 );
pParent->pOrderBy = pOrderBy;
pSub->pOrderBy = 0;
}
@@ -121540,12 +125407,22 @@ static int flattenSubquery(
** (3) The inner query has a LIMIT clause (since the changes to the WHERE
** close would change the meaning of the LIMIT).
**
-** (4) The inner query is the right operand of a LEFT JOIN. (The caller
-** enforces this restriction since this routine does not have enough
-** information to know.)
+** (4) The inner query is the right operand of a LEFT JOIN and the
+** expression to be pushed down does not come from the ON clause
+** on that LEFT JOIN.
**
** (5) The WHERE clause expression originates in the ON or USING clause
-** of a LEFT JOIN.
+** of a LEFT JOIN where iCursor is not the right-hand table of that
+** left join. An example:
+**
+** SELECT *
+** FROM (SELECT 1 AS a1 UNION ALL SELECT 2) AS aa
+** JOIN (SELECT 1 AS b2 UNION ALL SELECT 2) AS bb ON (a1=b2)
+** LEFT JOIN (SELECT 8 AS c3 UNION ALL SELECT 9) AS cc ON (b2=2);
+**
+** The correct answer is three rows: (1,1,NULL),(2,2,8),(2,2,9).
+** But if the (b2=2) term were to be pushed down into the bb subquery,
+** then the (1,1,NULL) row would be suppressed.
**
** Return 0 if no changes are made and non-zero if one or more WHERE clause
** terms are duplicated into the subquery.
@@ -121554,7 +125431,8 @@ static int pushDownWhereTerms(
Parse *pParse, /* Parse context (for malloc() and error reporting) */
Select *pSubq, /* The subquery whose WHERE clause is to be augmented */
Expr *pWhere, /* The WHERE clause of the outer query */
- int iCursor /* Cursor number of the subquery */
+ int iCursor, /* Cursor number of the subquery */
+ int isLeftJoin /* True if pSubq is the right term of a LEFT JOIN */
){
Expr *pNew;
int nChng = 0;
@@ -121578,15 +125456,25 @@ static int pushDownWhereTerms(
return 0; /* restriction (3) */
}
while( pWhere->op==TK_AND ){
- nChng += pushDownWhereTerms(pParse, pSubq, pWhere->pRight, iCursor);
+ nChng += pushDownWhereTerms(pParse, pSubq, pWhere->pRight,
+ iCursor, isLeftJoin);
pWhere = pWhere->pLeft;
}
- if( ExprHasProperty(pWhere,EP_FromJoin) ) return 0; /* restriction (5) */
+ if( isLeftJoin
+ && (ExprHasProperty(pWhere,EP_FromJoin)==0
+ || pWhere->iRightJoinTable!=iCursor)
+ ){
+ return 0; /* restriction (4) */
+ }
+ if( ExprHasProperty(pWhere,EP_FromJoin) && pWhere->iRightJoinTable!=iCursor ){
+ return 0; /* restriction (5) */
+ }
if( sqlite3ExprIsTableConstant(pWhere, iCursor) ){
nChng++;
while( pSubq ){
SubstContext x;
pNew = sqlite3ExprDup(pParse->db, pWhere, 0);
+ unsetJoinExpr(pNew, -1);
x.pParse = pParse;
x.iTable = iCursor;
x.iNewTable = iCursor;
@@ -121606,42 +125494,44 @@ static int pushDownWhereTerms(
#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */
/*
-** Based on the contents of the AggInfo structure indicated by the first
-** argument, this function checks if the following are true:
+** The pFunc is the only aggregate function in the query. Check to see
+** if the query is a candidate for the min/max optimization.
**
-** * the query contains just a single aggregate function,
-** * the aggregate function is either min() or max(), and
-** * the argument to the aggregate function is a column value.
+** If the query is a candidate for the min/max optimization, then set
+** *ppMinMax to be an ORDER BY clause to be used for the optimization
+** and return either WHERE_ORDERBY_MIN or WHERE_ORDERBY_MAX depending on
+** whether pFunc is a min() or max() function.
**
-** If all of the above are true, then WHERE_ORDERBY_MIN or WHERE_ORDERBY_MAX
-** is returned as appropriate. Also, *ppMinMax is set to point to the
-** list of arguments passed to the aggregate before returning.
+** If the query is not a candidate for the min/max optimization, return
+** WHERE_ORDERBY_NORMAL (which must be zero).
**
-** Or, if the conditions above are not met, *ppMinMax is set to 0 and
-** WHERE_ORDERBY_NORMAL is returned.
+** This routine must be called after aggregate functions have been
+** located but before their arguments have been subjected to aggregate
+** analysis.
*/
-static u8 minMaxQuery(AggInfo *pAggInfo, ExprList **ppMinMax){
- int eRet = WHERE_ORDERBY_NORMAL; /* Return value */
-
- *ppMinMax = 0;
- if( pAggInfo->nFunc==1 ){
- Expr *pExpr = pAggInfo->aFunc[0].pExpr; /* Aggregate function */
- ExprList *pEList = pExpr->x.pList; /* Arguments to agg function */
-
- assert( pExpr->op==TK_AGG_FUNCTION );
- if( pEList && pEList->nExpr==1 && pEList->a[0].pExpr->op==TK_AGG_COLUMN ){
- const char *zFunc = pExpr->u.zToken;
- if( sqlite3StrICmp(zFunc, "min")==0 ){
- eRet = WHERE_ORDERBY_MIN;
- *ppMinMax = pEList;
- }else if( sqlite3StrICmp(zFunc, "max")==0 ){
- eRet = WHERE_ORDERBY_MAX;
- *ppMinMax = pEList;
- }
- }
- }
-
- assert( *ppMinMax==0 || (*ppMinMax)->nExpr==1 );
+static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){
+ int eRet = WHERE_ORDERBY_NORMAL; /* Return value */
+ ExprList *pEList = pFunc->x.pList; /* Arguments to agg function */
+ const char *zFunc; /* Name of aggregate function pFunc */
+ ExprList *pOrderBy;
+ u8 sortOrder;
+
+ assert( *ppMinMax==0 );
+ assert( pFunc->op==TK_AGG_FUNCTION );
+ if( pEList==0 || pEList->nExpr!=1 ) return eRet;
+ zFunc = pFunc->u.zToken;
+ if( sqlite3StrICmp(zFunc, "min")==0 ){
+ eRet = WHERE_ORDERBY_MIN;
+ sortOrder = SQLITE_SO_ASC;
+ }else if( sqlite3StrICmp(zFunc, "max")==0 ){
+ eRet = WHERE_ORDERBY_MAX;
+ sortOrder = SQLITE_SO_DESC;
+ }else{
+ return eRet;
+ }
+ *ppMinMax = pOrderBy = sqlite3ExprListDup(db, pEList, 0);
+ assert( pOrderBy!=0 || db->mallocFailed );
+ if( pOrderBy ) pOrderBy->a[0].sortOrder = sortOrder;
return eRet;
}
@@ -121772,7 +125662,6 @@ static int convertCompoundSelectToSubquery(Walker *pWalker, Select *p){
assert( pNew->pPrior!=0 );
pNew->pPrior->pNext = pNew;
pNew->pLimit = 0;
- pNew->pOffset = 0;
return WRC_Continue;
}
@@ -122028,19 +125917,19 @@ static int selectExpander(Walker *pWalker, Select *p){
sqlite3 *db = pParse->db;
Expr *pE, *pRight, *pExpr;
u16 selFlags = p->selFlags;
+ u32 elistFlags = 0;
p->selFlags |= SF_Expanded;
if( db->mallocFailed ){
return WRC_Abort;
}
- if( NEVER(p->pSrc==0) || (selFlags & SF_Expanded)!=0 ){
+ assert( p->pSrc!=0 );
+ if( (selFlags & SF_Expanded)!=0 ){
return WRC_Prune;
}
pTabList = p->pSrc;
pEList = p->pEList;
- if( OK_IF_ALWAYS_TRUE(p->pWith) ){
- sqlite3WithPush(pParse, p->pWith, 0);
- }
+ sqlite3WithPush(pParse, p->pWith, 0);
/* Make sure cursor numbers have been assigned to all entries in
** the FROM clause of the SELECT statement.
@@ -122140,6 +126029,7 @@ static int selectExpander(Walker *pWalker, Select *p){
assert( pE->op!=TK_DOT || pE->pRight!=0 );
assert( pE->op!=TK_DOT || (pE->pLeft!=0 && pE->pLeft->op==TK_ID) );
if( pE->op==TK_DOT && pE->pRight->op==TK_ASTERISK ) break;
+ elistFlags |= pE->flags;
}
if( k<pEList->nExpr ){
/*
@@ -122155,6 +126045,7 @@ static int selectExpander(Walker *pWalker, Select *p){
for(k=0; k<pEList->nExpr; k++){
pE = a[k].pExpr;
+ elistFlags |= pE->flags;
pRight = pE->pRight;
assert( pE->op!=TK_DOT || pRight!=0 );
if( pE->op!=TK_ASTERISK
@@ -122284,9 +126175,14 @@ static int selectExpander(Walker *pWalker, Select *p){
sqlite3ExprListDelete(db, pEList);
p->pEList = pNew;
}
- if( p->pEList && p->pEList->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){
- sqlite3ErrorMsg(pParse, "too many columns in result set");
- return WRC_Abort;
+ if( p->pEList ){
+ if( p->pEList->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){
+ sqlite3ErrorMsg(pParse, "too many columns in result set");
+ return WRC_Abort;
+ }
+ if( (elistFlags & (EP_HasFunc|EP_Subquery))!=0 ){
+ p->selFlags |= SF_ComplexResult;
+ }
}
return WRC_Continue;
}
@@ -122594,14 +126490,11 @@ static void explainSimpleCount(
){
if( pParse->explain==2 ){
int bCover = (pIdx!=0 && (HasRowid(pTab) || !IsPrimaryKeyIndex(pIdx)));
- char *zEqp = sqlite3MPrintf(pParse->db, "SCAN TABLE %s%s%s",
+ sqlite3VdbeExplain(pParse, 0, "SCAN TABLE %s%s%s",
pTab->zName,
bCover ? " USING COVERING INDEX " : "",
bCover ? pIdx->zName : ""
);
- sqlite3VdbeAddOp4(
- pParse->pVdbe, OP_Explain, pParse->iSelectId, 0, 0, zEqp, P4_DYNAMIC
- );
}
}
#else
@@ -122609,14 +126502,6 @@ static void explainSimpleCount(
#endif
/*
-** Context object for havingToWhereExprCb().
-*/
-struct HavingToWhereCtx {
- Expr **ppWhere;
- ExprList *pGroupBy;
-};
-
-/*
** sqlite3WalkExpr() callback used by havingToWhere().
**
** If the node passed to the callback is a TK_AND node, return
@@ -122629,15 +126514,16 @@ struct HavingToWhereCtx {
*/
static int havingToWhereExprCb(Walker *pWalker, Expr *pExpr){
if( pExpr->op!=TK_AND ){
- struct HavingToWhereCtx *p = pWalker->u.pHavingCtx;
- if( sqlite3ExprIsConstantOrGroupBy(pWalker->pParse, pExpr, p->pGroupBy) ){
+ Select *pS = pWalker->u.pSelect;
+ if( sqlite3ExprIsConstantOrGroupBy(pWalker->pParse, pExpr, pS->pGroupBy) ){
sqlite3 *db = pWalker->pParse->db;
Expr *pNew = sqlite3ExprAlloc(db, TK_INTEGER, &sqlite3IntTokens[1], 0);
if( pNew ){
- Expr *pWhere = *(p->ppWhere);
+ Expr *pWhere = pS->pWhere;
SWAP(Expr, *pNew, *pExpr);
pNew = sqlite3ExprAnd(db, pWhere, pNew);
- *(p->ppWhere) = pNew;
+ pS->pWhere = pNew;
+ pWalker->eCode = 1;
}
}
return WRC_Prune;
@@ -122660,23 +126546,19 @@ static int havingToWhereExprCb(Walker *pWalker, Expr *pExpr){
** entirely of constants and expressions that are also GROUP BY terms that
** use the "BINARY" collation sequence.
*/
-static void havingToWhere(
- Parse *pParse,
- ExprList *pGroupBy,
- Expr *pHaving,
- Expr **ppWhere
-){
- struct HavingToWhereCtx sCtx;
+static void havingToWhere(Parse *pParse, Select *p){
Walker sWalker;
-
- sCtx.ppWhere = ppWhere;
- sCtx.pGroupBy = pGroupBy;
-
memset(&sWalker, 0, sizeof(sWalker));
sWalker.pParse = pParse;
sWalker.xExprCallback = havingToWhereExprCb;
- sWalker.u.pHavingCtx = &sCtx;
- sqlite3WalkExpr(&sWalker, pHaving);
+ sWalker.u.pSelect = p;
+ sqlite3WalkExpr(&sWalker, p->pHaving);
+#if SELECTTRACE_ENABLED
+ if( sWalker.eCode && (sqlite3SelectTrace & 0x100)!=0 ){
+ SELECTTRACE(0x100,pParse,p,("Move HAVING terms into WHERE:\n"));
+ sqlite3TreeViewSelect(0, p, 0);
+ }
+#endif
}
/*
@@ -122822,21 +126704,18 @@ SQLITE_PRIVATE int sqlite3Select(
AggInfo sAggInfo; /* Information used by aggregate queries */
int iEnd; /* Address of the end of the query */
sqlite3 *db; /* The database connection */
-
-#ifndef SQLITE_OMIT_EXPLAIN
- int iRestoreSelectId = pParse->iSelectId;
- pParse->iSelectId = pParse->iNextSelectId++;
-#endif
+ ExprList *pMinMaxOrderBy = 0; /* Added ORDER BY for min/max queries */
+ u8 minMaxFlag; /* Flag for min/max queries */
db = pParse->db;
+ v = sqlite3GetVdbe(pParse);
if( p==0 || db->mallocFailed || pParse->nErr ){
return 1;
}
if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1;
memset(&sAggInfo, 0, sizeof(sAggInfo));
#if SELECTTRACE_ENABLED
- pParse->nSelectIndent++;
- SELECTTRACE(1,pParse,p, ("begin processing:\n"));
+ SELECTTRACE(1,pParse,p, ("begin processing:\n", pParse->addrExplain));
if( sqlite3SelectTrace & 0x100 ){
sqlite3TreeViewSelect(0, p, 0);
}
@@ -122867,27 +126746,39 @@ SQLITE_PRIVATE int sqlite3Select(
assert( p->pEList!=0 );
isAgg = (p->selFlags & SF_Aggregate)!=0;
#if SELECTTRACE_ENABLED
- if( sqlite3SelectTrace & 0x100 ){
- SELECTTRACE(0x100,pParse,p, ("after name resolution:\n"));
+ if( sqlite3SelectTrace & 0x104 ){
+ SELECTTRACE(0x104,pParse,p, ("after name resolution:\n"));
sqlite3TreeViewSelect(0, p, 0);
}
#endif
- /* Get a pointer the VDBE under construction, allocating a new VDBE if one
- ** does not already exist */
- v = sqlite3GetVdbe(pParse);
- if( v==0 ) goto select_end;
if( pDest->eDest==SRT_Output ){
generateColumnNames(pParse, p);
}
- /* Try to flatten subqueries in the FROM clause up into the main query
+ /* Try to various optimizations (flattening subqueries, and strength
+ ** reduction of join operators) in the FROM clause up into the main query
*/
#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW)
for(i=0; !p->pPrior && i<pTabList->nSrc; i++){
struct SrcList_item *pItem = &pTabList->a[i];
Select *pSub = pItem->pSelect;
Table *pTab = pItem->pTab;
+
+ /* Convert LEFT JOIN into JOIN if there are terms of the right table
+ ** of the LEFT JOIN used in the WHERE clause.
+ */
+ if( (pItem->fg.jointype & JT_LEFT)!=0
+ && sqlite3ExprImpliesNonNullRow(p->pWhere, pItem->iCursor)
+ && OptimizationEnabled(db, SQLITE_SimplifyJoin)
+ ){
+ SELECTTRACE(0x100,pParse,p,
+ ("LEFT-JOIN simplifies to JOIN on term %d\n",i));
+ pItem->fg.jointype &= ~(JT_LEFT|JT_OUTER);
+ unsetJoinExpr(p->pWhere, pItem->iCursor);
+ }
+
+ /* No futher action if this term of the FROM clause is no a subquery */
if( pSub==0 ) continue;
/* Catch mismatch in the declared columns of a view and the number of
@@ -122908,7 +126799,9 @@ SQLITE_PRIVATE int sqlite3Select(
if( (pSub->selFlags & SF_Aggregate)!=0 ) continue;
assert( pSub->pGroupBy==0 );
- /* If the subquery contains an ORDER BY clause and if
+ /* If the outer query contains a "complex" result set (that is,
+ ** if the result set of the outer query uses functions or subqueries)
+ ** and if the subquery contains an ORDER BY clause and if
** it will be implemented as a co-routine, then do not flatten. This
** restriction allows SQL constructs like this:
**
@@ -122917,9 +126810,16 @@ SQLITE_PRIVATE int sqlite3Select(
**
** The expensive_function() is only computed on the 10 rows that
** are output, rather than every row of the table.
+ **
+ ** The requirement that the outer query have a complex result set
+ ** means that flattening does occur on simpler SQL constraints without
+ ** the expensive_function() like:
+ **
+ ** SELECT x FROM (SELECT x FROM tab ORDER BY y LIMIT 10);
*/
if( pSub->pOrderBy!=0
&& i==0
+ && (p->selFlags & SF_ComplexResult)!=0
&& (pTabList->nSrc==1
|| (pTabList->a[1].fg.jointype&(JT_LEFT|JT_CROSS))!=0)
){
@@ -122944,11 +126844,13 @@ SQLITE_PRIVATE int sqlite3Select(
*/
if( p->pPrior ){
rc = multiSelect(pParse, p, pDest);
- explainSetInteger(pParse->iSelectId, iRestoreSelectId);
#if SELECTTRACE_ENABLED
- SELECTTRACE(1,pParse,p,("end compound-select processing\n"));
- pParse->nSelectIndent--;
+ SELECTTRACE(0x1,pParse,p,("end compound-select processing\n"));
+ if( (sqlite3SelectTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){
+ sqlite3TreeViewSelect(0, p, 0);
+ }
#endif
+ if( p->pNext==0 ) ExplainQueryPlanPop(pParse);
return rc;
}
#endif
@@ -123020,8 +126922,9 @@ SQLITE_PRIVATE int sqlite3Select(
/* Make copies of constant WHERE-clause terms in the outer query down
** inside the subquery. This can help the subquery to run more efficiently.
*/
- if( (pItem->fg.jointype & JT_OUTER)==0
- && pushDownWhereTerms(pParse, pSub, p->pWhere, pItem->iCursor)
+ if( OptimizationEnabled(db, SQLITE_PushDown)
+ && pushDownWhereTerms(pParse, pSub, p->pWhere, pItem->iCursor,
+ (pItem->fg.jointype & JT_OUTER)!=0)
){
#if SELECTTRACE_ENABLED
if( sqlite3SelectTrace & 0x100 ){
@@ -123029,6 +126932,8 @@ SQLITE_PRIVATE int sqlite3Select(
sqlite3TreeViewSelect(0, p, 0);
}
#endif
+ }else{
+ SELECTTRACE(0x100,pParse,p,("Push-down not possible\n"));
}
zSavedAuthContext = pParse->zAuthContext;
@@ -123057,7 +126962,7 @@ SQLITE_PRIVATE int sqlite3Select(
VdbeComment((v, "%s", pItem->pTab->zName));
pItem->addrFillSub = addrTop;
sqlite3SelectDestInit(&dest, SRT_Coroutine, pItem->regReturn);
- explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId);
+ ExplainQueryPlan((pParse, 1, "CO-ROUTINE 0x%p", pSub));
sqlite3Select(pParse, pSub, &dest);
pItem->pTab->nRowLogEst = pSub->nSelectRow;
pItem->fg.viaCoroutine = 1;
@@ -123092,12 +126997,11 @@ SQLITE_PRIVATE int sqlite3Select(
pPrior = isSelfJoinView(pTabList, pItem);
if( pPrior ){
sqlite3VdbeAddOp2(v, OP_OpenDup, pItem->iCursor, pPrior->iCursor);
- explainSetInteger(pItem->iSelectId, pPrior->iSelectId);
assert( pPrior->pSelect!=0 );
pSub->nSelectRow = pPrior->pSelect->nSelectRow;
}else{
sqlite3SelectDestInit(&dest, SRT_EphemTab, pItem->iCursor);
- explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId);
+ ExplainQueryPlan((pParse, 1, "MATERIALIZE 0x%p", pSub));
sqlite3Select(pParse, pSub, &dest);
}
pItem->pTab->nRowLogEst = pSub->nSelectRow;
@@ -123231,6 +127135,7 @@ SQLITE_PRIVATE int sqlite3Select(
wctrlFlags |= p->selFlags & SF_FixedLimit;
/* Begin the database scan. */
+ SELECTTRACE(1,pParse,p,("WhereBegin\n"));
pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, sSort.pOrderBy,
p->pEList, wctrlFlags, p->nSelectRow);
if( pWInfo==0 ) goto select_end;
@@ -123323,7 +127228,8 @@ SQLITE_PRIVATE int sqlite3Select(
memset(&sNC, 0, sizeof(sNC));
sNC.pParse = pParse;
sNC.pSrcList = pTabList;
- sNC.pAggInfo = &sAggInfo;
+ sNC.uNC.pAggInfo = &sAggInfo;
+ VVA_ONLY( sNC.ncFlags = NC_UAggInfo; )
sAggInfo.mnReg = pParse->nMem+1;
sAggInfo.nSortingColumn = pGroupBy ? pGroupBy->nExpr : 0;
sAggInfo.pGroupBy = pGroupBy;
@@ -123332,12 +127238,19 @@ SQLITE_PRIVATE int sqlite3Select(
if( pHaving ){
if( pGroupBy ){
assert( pWhere==p->pWhere );
- havingToWhere(pParse, pGroupBy, pHaving, &p->pWhere);
+ assert( pHaving==p->pHaving );
+ assert( pGroupBy==p->pGroupBy );
+ havingToWhere(pParse, p);
pWhere = p->pWhere;
}
sqlite3ExprAnalyzeAggregates(&sNC, pHaving);
}
sAggInfo.nAccumulator = sAggInfo.nColumn;
+ if( p->pGroupBy==0 && p->pHaving==0 && sAggInfo.nFunc==1 ){
+ minMaxFlag = minMaxQuery(db, sAggInfo.aFunc[0].pExpr, &pMinMaxOrderBy);
+ }else{
+ minMaxFlag = WHERE_ORDERBY_NORMAL;
+ }
for(i=0; i<sAggInfo.nFunc; i++){
assert( !ExprHasProperty(sAggInfo.aFunc[i].pExpr, EP_xIsSelect) );
sNC.ncFlags |= NC_InAggFunc;
@@ -123346,6 +127259,24 @@ SQLITE_PRIVATE int sqlite3Select(
}
sAggInfo.mxReg = pParse->nMem;
if( db->mallocFailed ) goto select_end;
+#if SELECTTRACE_ENABLED
+ if( sqlite3SelectTrace & 0x400 ){
+ int ii;
+ SELECTTRACE(0x400,pParse,p,("After aggregate analysis:\n"));
+ sqlite3TreeViewSelect(0, p, 0);
+ for(ii=0; ii<sAggInfo.nColumn; ii++){
+ sqlite3DebugPrintf("agg-column[%d] iMem=%d\n",
+ ii, sAggInfo.aCol[ii].iMem);
+ sqlite3TreeViewExpr(0, sAggInfo.aCol[ii].pExpr, 0);
+ }
+ for(ii=0; ii<sAggInfo.nFunc; ii++){
+ sqlite3DebugPrintf("agg-func[%d]: iMem=%d\n",
+ ii, sAggInfo.aFunc[ii].iMem);
+ sqlite3TreeViewExpr(0, sAggInfo.aFunc[ii].pExpr, 0);
+ }
+ }
+#endif
+
/* Processing for aggregates with GROUP BY is very different and
** much more complex than aggregates without a GROUP BY.
@@ -123396,6 +127327,7 @@ SQLITE_PRIVATE int sqlite3Select(
** in the right order to begin with.
*/
sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset);
+ SELECTTRACE(1,pParse,p,("WhereBegin\n"));
pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pGroupBy, 0,
WHERE_GROUPBY | (orderByGrp ? WHERE_SORTBYGROUP : 0), 0
);
@@ -123575,7 +127507,6 @@ SQLITE_PRIVATE int sqlite3Select(
} /* endif pGroupBy. Begin aggregate queries without GROUP BY: */
else {
- ExprList *pDel = 0;
#ifndef SQLITE_OMIT_BTREECOUNT
Table *pTab;
if( (pTab = isSimpleCount(p, &sAggInfo))!=0 ){
@@ -123637,67 +127568,32 @@ SQLITE_PRIVATE int sqlite3Select(
}else
#endif /* SQLITE_OMIT_BTREECOUNT */
{
- /* Check if the query is of one of the following forms:
- **
- ** SELECT min(x) FROM ...
- ** SELECT max(x) FROM ...
- **
- ** If it is, then ask the code in where.c to attempt to sort results
- ** as if there was an "ORDER ON x" or "ORDER ON x DESC" clause.
- ** If where.c is able to produce results sorted in this order, then
- ** add vdbe code to break out of the processing loop after the
- ** first iteration (since the first iteration of the loop is
- ** guaranteed to operate on the row with the minimum or maximum
- ** value of x, the only row required).
- **
- ** A special flag must be passed to sqlite3WhereBegin() to slightly
- ** modify behavior as follows:
- **
- ** + If the query is a "SELECT min(x)", then the loop coded by
- ** where.c should not iterate over any values with a NULL value
- ** for x.
- **
- ** + The optimizer code in where.c (the thing that decides which
- ** index or indices to use) should place a different priority on
- ** satisfying the 'ORDER BY' clause than it does in other cases.
- ** Refer to code and comments in where.c for details.
- */
- ExprList *pMinMax = 0;
- u8 flag = WHERE_ORDERBY_NORMAL;
-
- assert( p->pGroupBy==0 );
- assert( flag==0 );
- if( p->pHaving==0 ){
- flag = minMaxQuery(&sAggInfo, &pMinMax);
- }
- assert( flag==0 || (pMinMax!=0 && pMinMax->nExpr==1) );
-
- if( flag ){
- pMinMax = sqlite3ExprListDup(db, pMinMax, 0);
- pDel = pMinMax;
- assert( db->mallocFailed || pMinMax!=0 );
- if( !db->mallocFailed ){
- pMinMax->a[0].sortOrder = flag!=WHERE_ORDERBY_MIN ?1:0;
- pMinMax->a[0].pExpr->op = TK_COLUMN;
- }
- }
-
/* This case runs if the aggregate has no GROUP BY clause. The
** processing is much simpler since there is only a single row
** of output.
*/
+ assert( p->pGroupBy==0 );
resetAccumulator(pParse, &sAggInfo);
- pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pMinMax, 0,flag,0);
+
+ /* If this query is a candidate for the min/max optimization, then
+ ** minMaxFlag will have been previously set to either
+ ** WHERE_ORDERBY_MIN or WHERE_ORDERBY_MAX and pMinMaxOrderBy will
+ ** be an appropriate ORDER BY expression for the optimization.
+ */
+ assert( minMaxFlag==WHERE_ORDERBY_NORMAL || pMinMaxOrderBy!=0 );
+ assert( pMinMaxOrderBy==0 || pMinMaxOrderBy->nExpr==1 );
+
+ SELECTTRACE(1,pParse,p,("WhereBegin\n"));
+ pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pMinMaxOrderBy,
+ 0, minMaxFlag, 0);
if( pWInfo==0 ){
- sqlite3ExprListDelete(db, pDel);
goto select_end;
}
updateAccumulator(pParse, &sAggInfo);
- assert( pMinMax==0 || pMinMax->nExpr==1 );
if( sqlite3WhereIsOrdered(pWInfo)>0 ){
sqlite3VdbeGoto(v, sqlite3WhereBreakLabel(pWInfo));
VdbeComment((v, "%s() by index",
- (flag==WHERE_ORDERBY_MIN?"min":"max")));
+ (minMaxFlag==WHERE_ORDERBY_MIN?"min":"max")));
}
sqlite3WhereEnd(pWInfo);
finalizeAggFunctions(pParse, &sAggInfo);
@@ -123707,7 +127603,6 @@ SQLITE_PRIVATE int sqlite3Select(
sqlite3ExprIfFalse(pParse, pHaving, addrEnd, SQLITE_JUMPIFNULL);
selectInnerLoop(pParse, p, -1, 0, 0,
pDest, addrEnd, addrEnd);
- sqlite3ExprListDelete(db, pDel);
}
sqlite3VdbeResolveLabel(v, addrEnd);
@@ -123723,6 +127618,7 @@ SQLITE_PRIVATE int sqlite3Select(
if( sSort.pOrderBy ){
explainTempTable(pParse,
sSort.nOBSat>0 ? "RIGHT PART OF ORDER BY":"ORDER BY");
+ assert( p->pEList==pEList );
generateSortTail(pParse, p, &sSort, pEList->nExpr, pDest);
}
@@ -123738,14 +127634,16 @@ SQLITE_PRIVATE int sqlite3Select(
** successful coding of the SELECT.
*/
select_end:
- explainSetInteger(pParse->iSelectId, iRestoreSelectId);
-
+ sqlite3ExprListDelete(db, pMinMaxOrderBy);
sqlite3DbFree(db, sAggInfo.aCol);
sqlite3DbFree(db, sAggInfo.aFunc);
#if SELECTTRACE_ENABLED
- SELECTTRACE(1,pParse,p,("end processing\n"));
- pParse->nSelectIndent--;
+ SELECTTRACE(0x1,pParse,p,("end processing\n"));
+ if( (sqlite3SelectTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){
+ sqlite3TreeViewSelect(0, p, 0);
+ }
#endif
+ ExplainQueryPlanPop(pParse);
return rc;
}
@@ -123979,6 +127877,8 @@ SQLITE_PRIVATE void sqlite3DeleteTriggerStep(sqlite3 *db, TriggerStep *pTriggerS
sqlite3ExprListDelete(db, pTmp->pExprList);
sqlite3SelectDelete(db, pTmp->pSelect);
sqlite3IdListDelete(db, pTmp->pIdList);
+ sqlite3UpsertDelete(db, pTmp->pUpsert);
+ sqlite3DbFree(db, pTmp->zSpan);
sqlite3DbFree(db, pTmp);
}
@@ -124294,13 +128194,29 @@ triggerfinish_cleanup:
}
/*
+** Duplicate a range of text from an SQL statement, then convert all
+** whitespace characters into ordinary space characters.
+*/
+static char *triggerSpanDup(sqlite3 *db, const char *zStart, const char *zEnd){
+ char *z = sqlite3DbSpanDup(db, zStart, zEnd);
+ int i;
+ if( z ) for(i=0; z[i]; i++) if( sqlite3Isspace(z[i]) ) z[i] = ' ';
+ return z;
+}
+
+/*
** Turn a SELECT statement (that the pSelect parameter points to) into
** a trigger step. Return a pointer to a TriggerStep structure.
**
** The parser calls this routine when it finds a SELECT statement in
** body of a TRIGGER.
*/
-SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3 *db, Select *pSelect){
+SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(
+ sqlite3 *db, /* Database connection */
+ Select *pSelect, /* The SELECT statement */
+ const char *zStart, /* Start of SQL text */
+ const char *zEnd /* End of SQL text */
+){
TriggerStep *pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep));
if( pTriggerStep==0 ) {
sqlite3SelectDelete(db, pSelect);
@@ -124309,6 +128225,7 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3 *db, Select *pSelec
pTriggerStep->op = TK_SELECT;
pTriggerStep->pSelect = pSelect;
pTriggerStep->orconf = OE_Default;
+ pTriggerStep->zSpan = triggerSpanDup(db, zStart, zEnd);
return pTriggerStep;
}
@@ -124321,7 +128238,9 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3 *db, Select *pSelec
static TriggerStep *triggerStepAllocate(
sqlite3 *db, /* Database connection */
u8 op, /* Trigger opcode */
- Token *pName /* The target name */
+ Token *pName, /* The target name */
+ const char *zStart, /* Start of SQL text */
+ const char *zEnd /* End of SQL text */
){
TriggerStep *pTriggerStep;
@@ -124332,6 +128251,7 @@ static TriggerStep *triggerStepAllocate(
sqlite3Dequote(z);
pTriggerStep->zTarget = z;
pTriggerStep->op = op;
+ pTriggerStep->zSpan = triggerSpanDup(db, zStart, zEnd);
}
return pTriggerStep;
}
@@ -124348,19 +128268,26 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep(
Token *pTableName, /* Name of the table into which we insert */
IdList *pColumn, /* List of columns in pTableName to insert into */
Select *pSelect, /* A SELECT statement that supplies values */
- u8 orconf /* The conflict algorithm (OE_Abort, OE_Replace, etc.) */
+ u8 orconf, /* The conflict algorithm (OE_Abort, OE_Replace, etc.) */
+ Upsert *pUpsert, /* ON CONFLICT clauses for upsert */
+ const char *zStart, /* Start of SQL text */
+ const char *zEnd /* End of SQL text */
){
TriggerStep *pTriggerStep;
assert(pSelect != 0 || db->mallocFailed);
- pTriggerStep = triggerStepAllocate(db, TK_INSERT, pTableName);
+ pTriggerStep = triggerStepAllocate(db, TK_INSERT, pTableName, zStart, zEnd);
if( pTriggerStep ){
pTriggerStep->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE);
pTriggerStep->pIdList = pColumn;
+ pTriggerStep->pUpsert = pUpsert;
pTriggerStep->orconf = orconf;
}else{
+ testcase( pColumn );
sqlite3IdListDelete(db, pColumn);
+ testcase( pUpsert );
+ sqlite3UpsertDelete(db, pUpsert);
}
sqlite3SelectDelete(db, pSelect);
@@ -124377,11 +128304,13 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep(
Token *pTableName, /* Name of the table to be updated */
ExprList *pEList, /* The SET clause: list of column and new values */
Expr *pWhere, /* The WHERE clause */
- u8 orconf /* The conflict algorithm. (OE_Abort, OE_Ignore, etc) */
+ u8 orconf, /* The conflict algorithm. (OE_Abort, OE_Ignore, etc) */
+ const char *zStart, /* Start of SQL text */
+ const char *zEnd /* End of SQL text */
){
TriggerStep *pTriggerStep;
- pTriggerStep = triggerStepAllocate(db, TK_UPDATE, pTableName);
+ pTriggerStep = triggerStepAllocate(db, TK_UPDATE, pTableName, zStart, zEnd);
if( pTriggerStep ){
pTriggerStep->pExprList = sqlite3ExprListDup(db, pEList, EXPRDUP_REDUCE);
pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE);
@@ -124400,11 +128329,13 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep(
SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep(
sqlite3 *db, /* Database connection */
Token *pTableName, /* The table from which rows are deleted */
- Expr *pWhere /* The WHERE clause */
+ Expr *pWhere, /* The WHERE clause */
+ const char *zStart, /* Start of SQL text */
+ const char *zEnd /* End of SQL text */
){
TriggerStep *pTriggerStep;
- pTriggerStep = triggerStepAllocate(db, TK_DELETE, pTableName);
+ pTriggerStep = triggerStepAllocate(db, TK_DELETE, pTableName, zStart, zEnd);
if( pTriggerStep ){
pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE);
pTriggerStep->orconf = OE_Default;
@@ -124659,13 +128590,21 @@ static int codeTriggerProgram(
pParse->eOrconf = (orconf==OE_Default)?pStep->orconf:(u8)orconf;
assert( pParse->okConstFactor==0 );
+#ifndef SQLITE_OMIT_TRACE
+ if( pStep->zSpan ){
+ sqlite3VdbeAddOp4(v, OP_Trace, 0x7fffffff, 1, 0,
+ sqlite3MPrintf(db, "-- %s", pStep->zSpan),
+ P4_DYNAMIC);
+ }
+#endif
+
switch( pStep->op ){
case TK_UPDATE: {
sqlite3Update(pParse,
targetSrcList(pParse, pStep),
sqlite3ExprListDup(db, pStep->pExprList, 0),
sqlite3ExprDup(db, pStep->pWhere, 0),
- pParse->eOrconf
+ pParse->eOrconf, 0, 0, 0
);
break;
}
@@ -124674,14 +128613,15 @@ static int codeTriggerProgram(
targetSrcList(pParse, pStep),
sqlite3SelectDup(db, pStep->pSelect, 0),
sqlite3IdListDup(db, pStep->pIdList),
- pParse->eOrconf
+ pParse->eOrconf,
+ sqlite3UpsertDup(db, pStep->pUpsert)
);
break;
}
case TK_DELETE: {
sqlite3DeleteFrom(pParse,
targetSrcList(pParse, pStep),
- sqlite3ExprDup(db, pStep->pWhere, 0)
+ sqlite3ExprDup(db, pStep->pWhere, 0), 0, 0
);
break;
}
@@ -124799,9 +128739,11 @@ static TriggerPrg *codeRowTrigger(
pTab->zName
));
#ifndef SQLITE_OMIT_TRACE
- sqlite3VdbeChangeP4(v, -1,
- sqlite3MPrintf(db, "-- TRIGGER %s", pTrigger->zName), P4_DYNAMIC
- );
+ if( pTrigger->zName ){
+ sqlite3VdbeChangeP4(v, -1,
+ sqlite3MPrintf(db, "-- TRIGGER %s", pTrigger->zName), P4_DYNAMIC
+ );
+ }
#endif
/* If one was specified, code the WHEN clause. If it evaluates to false
@@ -124829,7 +128771,7 @@ static TriggerPrg *codeRowTrigger(
VdbeComment((v, "End: %s.%s", pTrigger->zName, onErrorText(orconf)));
transferParseError(pParse, pSubParse);
- if( db->mallocFailed==0 ){
+ if( db->mallocFailed==0 && pParse->nErr==0 ){
pProgram->aOp = sqlite3VdbeTakeOpArray(v, &pProgram->nOp, &pTop->nMaxArg);
}
pProgram->nMem = pSubParse->nMem;
@@ -125148,7 +129090,10 @@ SQLITE_PRIVATE void sqlite3Update(
SrcList *pTabList, /* The table in which we should change things */
ExprList *pChanges, /* Things to be changed */
Expr *pWhere, /* The WHERE clause. May be null */
- int onError /* How to handle constraint errors */
+ int onError, /* How to handle constraint errors */
+ ExprList *pOrderBy, /* ORDER BY clause. May be null */
+ Expr *pLimit, /* LIMIT clause. May be null */
+ Upsert *pUpsert /* ON CONFLICT clause, or null */
){
int i, j; /* Loop counters */
Table *pTab; /* The table to be updated */
@@ -125233,6 +129178,16 @@ SQLITE_PRIVATE void sqlite3Update(
# define isView 0
#endif
+#ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
+ if( !isView ){
+ pWhere = sqlite3LimitWhere(
+ pParse, pTabList, pWhere, pOrderBy, pLimit, "UPDATE"
+ );
+ pOrderBy = 0;
+ pLimit = 0;
+ }
+#endif
+
if( sqlite3ViewGetColumnNames(pParse, pTab) ){
goto update_cleanup;
}
@@ -125245,16 +129200,23 @@ SQLITE_PRIVATE void sqlite3Update(
** need to occur right after the database cursor. So go ahead and
** allocate enough space, just in case.
*/
- pTabList->a[0].iCursor = iBaseCur = iDataCur = pParse->nTab++;
+ iBaseCur = iDataCur = pParse->nTab++;
iIdxCur = iDataCur+1;
pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab);
+ testcase( pPk!=0 && pPk!=pTab->pIndex );
for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){
- if( IsPrimaryKeyIndex(pIdx) && pPk!=0 ){
+ if( pPk==pIdx ){
iDataCur = pParse->nTab;
- pTabList->a[0].iCursor = iDataCur;
}
pParse->nTab++;
}
+ if( pUpsert ){
+ /* On an UPSERT, reuse the same cursors already opened by INSERT */
+ iDataCur = pUpsert->iDataCur;
+ iIdxCur = pUpsert->iIdxCur;
+ pParse->nTab = iBaseCur;
+ }
+ pTabList->a[0].iCursor = iDataCur;
/* Allocate space for aXRef[], aRegIdx[], and aToOpen[].
** Initialize aXRef[] and aToOpen[] to their default values.
@@ -125271,6 +129233,8 @@ SQLITE_PRIVATE void sqlite3Update(
memset(&sNC, 0, sizeof(sNC));
sNC.pParse = pParse;
sNC.pSrcList = pTabList;
+ sNC.uNC.pUpsert = pUpsert;
+ sNC.ncFlags = NC_UUpsert;
/* Resolve the column names in all the expressions of the
** of the UPDATE statement. Also find the column index
@@ -125374,7 +129338,7 @@ SQLITE_PRIVATE void sqlite3Update(
v = sqlite3GetVdbe(pParse);
if( v==0 ) goto update_cleanup;
if( pParse->nested==0 ) sqlite3VdbeCountChanges(v);
- sqlite3BeginWriteOperation(pParse, 1, iDb);
+ sqlite3BeginWriteOperation(pParse, pTrigger || hasFK, iDb);
/* Allocate required registers. */
if( !IsVirtual(pTab) ){
@@ -125401,7 +129365,11 @@ SQLITE_PRIVATE void sqlite3Update(
*/
#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER)
if( isView ){
- sqlite3MaterializeView(pParse, pTab, pWhere, iDataCur);
+ sqlite3MaterializeView(pParse, pTab,
+ pWhere, pOrderBy, pLimit, iDataCur
+ );
+ pOrderBy = 0;
+ pLimit = 0;
}
#endif
@@ -125421,8 +129389,16 @@ SQLITE_PRIVATE void sqlite3Update(
}
#endif
- /* Initialize the count of updated rows */
- if( (db->flags & SQLITE_CountRows) && !pParse->pTriggerTab ){
+ /* Jump to labelBreak to abandon further processing of this UPDATE */
+ labelContinue = labelBreak = sqlite3VdbeMakeLabel(v);
+
+ /* Not an UPSERT. Normal processing. Begin by
+ ** initialize the count of updated rows */
+ if( (db->flags&SQLITE_CountRows)!=0
+ && !pParse->pTriggerTab
+ && !pParse->nested
+ && pUpsert==0
+ ){
regRowCount = ++pParse->nMem;
sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount);
}
@@ -125435,46 +129411,61 @@ SQLITE_PRIVATE void sqlite3Update(
iPk = pParse->nMem+1;
pParse->nMem += nPk;
regKey = ++pParse->nMem;
- iEph = pParse->nTab++;
-
- sqlite3VdbeAddOp2(v, OP_Null, 0, iPk);
- addrOpen = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEph, nPk);
- sqlite3VdbeSetP4KeyInfo(pParse, pPk);
- }
-
- /* Begin the database scan.
- **
- ** Do not consider a single-pass strategy for a multi-row update if
- ** there are any triggers or foreign keys to process, or rows may
- ** be deleted as a result of REPLACE conflict handling. Any of these
- ** things might disturb a cursor being used to scan through the table
- ** or index, causing a single-pass approach to malfunction. */
- flags = WHERE_ONEPASS_DESIRED|WHERE_SEEK_UNIQ_TABLE;
- if( !pParse->nested && !pTrigger && !hasFK && !chngKey && !bReplace ){
- flags |= WHERE_ONEPASS_MULTIROW;
- }
- pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, flags, iIdxCur);
- if( pWInfo==0 ) goto update_cleanup;
-
- /* A one-pass strategy that might update more than one row may not
- ** be used if any column of the index used for the scan is being
- ** updated. Otherwise, if there is an index on "b", statements like
- ** the following could create an infinite loop:
- **
- ** UPDATE t1 SET b=b+1 WHERE b>?
- **
- ** Fall back to ONEPASS_OFF if where.c has selected a ONEPASS_MULTI
- ** strategy that uses an index for which one or more columns are being
- ** updated. */
- eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass);
- if( eOnePass==ONEPASS_MULTI ){
- int iCur = aiCurOnePass[1];
- if( iCur>=0 && iCur!=iDataCur && aToOpen[iCur-iBaseCur] ){
- eOnePass = ONEPASS_OFF;
+ if( pUpsert==0 ){
+ iEph = pParse->nTab++;
+ sqlite3VdbeAddOp3(v, OP_Null, 0, iPk, iPk+nPk-1);
+ addrOpen = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEph, nPk);
+ sqlite3VdbeSetP4KeyInfo(pParse, pPk);
}
- assert( iCur!=iDataCur || !HasRowid(pTab) );
}
+ if( pUpsert ){
+ /* If this is an UPSERT, then all cursors have already been opened by
+ ** the outer INSERT and the data cursor should be pointing at the row
+ ** that is to be updated. So bypass the code that searches for the
+ ** row(s) to be updated.
+ */
+ pWInfo = 0;
+ eOnePass = ONEPASS_SINGLE;
+ sqlite3ExprIfFalse(pParse, pWhere, labelBreak, SQLITE_JUMPIFNULL);
+ }else{
+ /* Begin the database scan.
+ **
+ ** Do not consider a single-pass strategy for a multi-row update if
+ ** there are any triggers or foreign keys to process, or rows may
+ ** be deleted as a result of REPLACE conflict handling. Any of these
+ ** things might disturb a cursor being used to scan through the table
+ ** or index, causing a single-pass approach to malfunction. */
+ flags = WHERE_ONEPASS_DESIRED|WHERE_SEEK_UNIQ_TABLE;
+ if( !pParse->nested && !pTrigger && !hasFK && !chngKey && !bReplace ){
+ flags |= WHERE_ONEPASS_MULTIROW;
+ }
+ pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, flags, iIdxCur);
+ if( pWInfo==0 ) goto update_cleanup;
+
+ /* A one-pass strategy that might update more than one row may not
+ ** be used if any column of the index used for the scan is being
+ ** updated. Otherwise, if there is an index on "b", statements like
+ ** the following could create an infinite loop:
+ **
+ ** UPDATE t1 SET b=b+1 WHERE b>?
+ **
+ ** Fall back to ONEPASS_OFF if where.c has selected a ONEPASS_MULTI
+ ** strategy that uses an index for which one or more columns are being
+ ** updated. */
+ eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass);
+ if( eOnePass!=ONEPASS_SINGLE ){
+ sqlite3MultiWrite(pParse);
+ if( eOnePass==ONEPASS_MULTI ){
+ int iCur = aiCurOnePass[1];
+ if( iCur>=0 && iCur!=iDataCur && aToOpen[iCur-iBaseCur] ){
+ eOnePass = ONEPASS_OFF;
+ }
+ assert( iCur!=iDataCur || !HasRowid(pTab) );
+ }
+ }
+ }
+
if( HasRowid(pTab) ){
/* Read the rowid of the current row of the WHERE scan. In ONEPASS_OFF
** mode, write the rowid into the FIFO. In either of the one-pass modes,
@@ -125494,7 +129485,7 @@ SQLITE_PRIVATE void sqlite3Update(
sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur,pPk->aiColumn[i],iPk+i);
}
if( eOnePass ){
- sqlite3VdbeChangeToNoop(v, addrOpen);
+ if( addrOpen ) sqlite3VdbeChangeToNoop(v, addrOpen);
nKey = nPk;
regKey = iPk;
}else{
@@ -125504,59 +129495,58 @@ SQLITE_PRIVATE void sqlite3Update(
}
}
- if( eOnePass!=ONEPASS_MULTI ){
- sqlite3WhereEnd(pWInfo);
- }
-
- labelBreak = sqlite3VdbeMakeLabel(v);
- if( !isView ){
- int addrOnce = 0;
-
- /* Open every index that needs updating. */
- if( eOnePass!=ONEPASS_OFF ){
- if( aiCurOnePass[0]>=0 ) aToOpen[aiCurOnePass[0]-iBaseCur] = 0;
- if( aiCurOnePass[1]>=0 ) aToOpen[aiCurOnePass[1]-iBaseCur] = 0;
- }
-
- if( eOnePass==ONEPASS_MULTI && (nIdx-(aiCurOnePass[1]>=0))>0 ){
- addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v);
+ if( pUpsert==0 ){
+ if( eOnePass!=ONEPASS_MULTI ){
+ sqlite3WhereEnd(pWInfo);
}
- sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, 0, iBaseCur, aToOpen,
- 0, 0);
- if( addrOnce ) sqlite3VdbeJumpHere(v, addrOnce);
- }
-
- /* Top of the update loop */
- if( eOnePass!=ONEPASS_OFF ){
- if( !isView && aiCurOnePass[0]!=iDataCur && aiCurOnePass[1]!=iDataCur ){
- assert( pPk );
- sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelBreak, regKey, nKey);
- VdbeCoverageNeverTaken(v);
+
+ if( !isView ){
+ int addrOnce = 0;
+
+ /* Open every index that needs updating. */
+ if( eOnePass!=ONEPASS_OFF ){
+ if( aiCurOnePass[0]>=0 ) aToOpen[aiCurOnePass[0]-iBaseCur] = 0;
+ if( aiCurOnePass[1]>=0 ) aToOpen[aiCurOnePass[1]-iBaseCur] = 0;
+ }
+
+ if( eOnePass==ONEPASS_MULTI && (nIdx-(aiCurOnePass[1]>=0))>0 ){
+ addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v);
+ }
+ sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, 0, iBaseCur,
+ aToOpen, 0, 0);
+ if( addrOnce ) sqlite3VdbeJumpHere(v, addrOnce);
}
- if( eOnePass==ONEPASS_SINGLE ){
- labelContinue = labelBreak;
- }else{
+
+ /* Top of the update loop */
+ if( eOnePass!=ONEPASS_OFF ){
+ if( !isView && aiCurOnePass[0]!=iDataCur && aiCurOnePass[1]!=iDataCur ){
+ assert( pPk );
+ sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelBreak, regKey,nKey);
+ VdbeCoverageNeverTaken(v);
+ }
+ if( eOnePass!=ONEPASS_SINGLE ){
+ labelContinue = sqlite3VdbeMakeLabel(v);
+ }
+ sqlite3VdbeAddOp2(v, OP_IsNull, pPk ? regKey : regOldRowid, labelBreak);
+ VdbeCoverageIf(v, pPk==0);
+ VdbeCoverageIf(v, pPk!=0);
+ }else if( pPk ){
labelContinue = sqlite3VdbeMakeLabel(v);
+ sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v);
+ addrTop = sqlite3VdbeAddOp2(v, OP_RowData, iEph, regKey);
+ sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, regKey, 0);
+ VdbeCoverage(v);
+ }else{
+ labelContinue = sqlite3VdbeAddOp3(v, OP_RowSetRead, regRowSet,labelBreak,
+ regOldRowid);
+ VdbeCoverage(v);
+ sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue, regOldRowid);
+ VdbeCoverage(v);
}
- sqlite3VdbeAddOp2(v, OP_IsNull, pPk ? regKey : regOldRowid, labelBreak);
- VdbeCoverageIf(v, pPk==0);
- VdbeCoverageIf(v, pPk!=0);
- }else if( pPk ){
- labelContinue = sqlite3VdbeMakeLabel(v);
- sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v);
- addrTop = sqlite3VdbeAddOp2(v, OP_RowData, iEph, regKey);
- sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, regKey, 0);
- VdbeCoverage(v);
- }else{
- labelContinue = sqlite3VdbeAddOp3(v, OP_RowSetRead, regRowSet, labelBreak,
- regOldRowid);
- VdbeCoverage(v);
- sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue, regOldRowid);
- VdbeCoverage(v);
}
- /* If the record number will change, set register regNewRowid to
- ** contain the new value. If the record number is not being modified,
+ /* If the rowid value will change, set register regNewRowid to
+ ** contain the new value. If the rowid is not being modified,
** then regNewRowid is the same register as regOldRowid, which is
** already populated. */
assert( chngKey || pTrigger || hasFK || regOldRowid==regNewRowid );
@@ -125620,6 +129610,12 @@ SQLITE_PRIVATE void sqlite3Update(
testcase( i==31 );
testcase( i==32 );
sqlite3ExprCodeGetColumnToReg(pParse, pTab, i, iDataCur, regNew+i);
+ if( tmask & TRIGGER_BEFORE ){
+ /* This value will be recomputed in After-BEFORE-trigger-reload-loop
+ ** below, so make sure that it is not cached and reused.
+ ** Ticket d85fffd6ffe856092ed8daefa811b1e399706b28. */
+ sqlite3ExprCacheRemove(pParse, regNew+i, 1);
+ }
}else{
sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i);
}
@@ -125648,10 +129644,14 @@ SQLITE_PRIVATE void sqlite3Update(
VdbeCoverage(v);
}
- /* If it did not delete it, the row-trigger may still have modified
+ /* After-BEFORE-trigger-reload-loop:
+ ** If it did not delete it, the BEFORE trigger may still have modified
** some of the columns of the row being updated. Load the values for
- ** all columns not modified by the update statement into their
- ** registers in case this has happened.
+ ** all columns not modified by the update statement into their registers
+ ** in case this has happened. Only unmodified columns are reloaded.
+ ** The values computed for modified columns use the values before the
+ ** BEFORE trigger runs. See test case trigger1-18.0 (added 2018-04-26)
+ ** for an example.
*/
for(i=0; i<pTab->nCol; i++){
if( aXRef[i]<0 && i!=pTab->iPKey ){
@@ -125667,7 +129667,7 @@ SQLITE_PRIVATE void sqlite3Update(
assert( regOldRowid>0 );
sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur,
regNewRowid, regOldRowid, chngKey, onError, labelContinue, &bReplace,
- aXRef);
+ aXRef, 0);
/* Do FK constraint checks. */
if( hasFK ){
@@ -125737,7 +129737,7 @@ SQLITE_PRIVATE void sqlite3Update(
/* Increment the row counter
*/
- if( (db->flags & SQLITE_CountRows) && !pParse->pTriggerTab){
+ if( regRowCount ){
sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1);
}
@@ -125764,16 +129764,15 @@ SQLITE_PRIVATE void sqlite3Update(
** maximum rowid counter values recorded while inserting into
** autoincrement tables.
*/
- if( pParse->nested==0 && pParse->pTriggerTab==0 ){
+ if( pParse->nested==0 && pParse->pTriggerTab==0 && pUpsert==0 ){
sqlite3AutoincrementEnd(pParse);
}
/*
- ** Return the number of rows that were changed. If this routine is
- ** generating code because of a call to sqlite3NestedParse(), do not
- ** invoke the callback function.
+ ** Return the number of rows that were changed, if we are tracking
+ ** that information.
*/
- if( (db->flags&SQLITE_CountRows) && !pParse->pTriggerTab && !pParse->nested ){
+ if( regRowCount ){
sqlite3VdbeAddOp2(v, OP_ResultRow, regRowCount, 1);
sqlite3VdbeSetNumCols(v, 1);
sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows updated", SQLITE_STATIC);
@@ -125785,6 +129784,10 @@ update_cleanup:
sqlite3SrcListDelete(db, pTabList);
sqlite3ExprListDelete(db, pChanges);
sqlite3ExprDelete(db, pWhere);
+#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT)
+ sqlite3ExprListDelete(db, pOrderBy);
+ sqlite3ExprDelete(db, pLimit);
+#endif
return;
}
/* Make sure "isView" and other macros defined above are undefined. Otherwise
@@ -125841,10 +129844,10 @@ static void updateVirtualTable(
int regRowid; /* Register for ephem table rowid */
int iCsr = pSrc->a[0].iCursor; /* Cursor used for virtual table scan */
int aDummy[2]; /* Unused arg for sqlite3WhereOkOnePass() */
- int bOnePass; /* True to use onepass strategy */
+ int eOnePass; /* True to use onepass strategy */
int addr; /* Address of OP_OpenEphemeral */
- /* Allocate nArg registers to martial the arguments to VUpdate. Then
+ /* Allocate nArg registers in which to gather the arguments for VUpdate. Then
** create and open the ephemeral table in which the records created from
** these arguments will be temporarily stored. */
assert( v );
@@ -125865,6 +129868,7 @@ static void updateVirtualTable(
sqlite3ExprCode(pParse, pChanges->a[aXRef[i]].pExpr, regArg+2+i);
}else{
sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, i, regArg+2+i);
+ sqlite3VdbeChangeP5(v, 1); /* Enable sqlite3_vtab_nochange() */
}
}
if( HasRowid(pTab) ){
@@ -125885,26 +129889,32 @@ static void updateVirtualTable(
sqlite3VdbeAddOp2(v, OP_SCopy, regArg+2+iPk, regArg+1);
}
- bOnePass = sqlite3WhereOkOnePass(pWInfo, aDummy);
+ eOnePass = sqlite3WhereOkOnePass(pWInfo, aDummy);
+
+ /* There is no ONEPASS_MULTI on virtual tables */
+ assert( eOnePass==ONEPASS_OFF || eOnePass==ONEPASS_SINGLE );
- if( bOnePass ){
+ if( eOnePass ){
/* If using the onepass strategy, no-op out the OP_OpenEphemeral coded
- ** above. Also, if this is a top-level parse (not a trigger), clear the
- ** multi-write flag so that the VM does not open a statement journal */
+ ** above. */
sqlite3VdbeChangeToNoop(v, addr);
- if( sqlite3IsToplevel(pParse) ){
- pParse->isMultiWrite = 0;
- }
+ sqlite3VdbeAddOp1(v, OP_Close, iCsr);
}else{
/* Create a record from the argument register contents and insert it into
** the ephemeral table. */
+ sqlite3MultiWrite(pParse);
sqlite3VdbeAddOp3(v, OP_MakeRecord, regArg, nArg, regRec);
+#ifdef SQLITE_DEBUG
+ /* Signal an assert() within OP_MakeRecord that it is allowed to
+ ** accept no-change records with serial_type 10 */
+ sqlite3VdbeChangeP5(v, OPFLAG_NOCHNG_MAGIC);
+#endif
sqlite3VdbeAddOp2(v, OP_NewRowid, ephemTab, regRowid);
sqlite3VdbeAddOp3(v, OP_Insert, ephemTab, regRec, regRowid);
}
- if( bOnePass==0 ){
+ if( eOnePass==ONEPASS_OFF ){
/* End the virtual table scan */
sqlite3WhereEnd(pWInfo);
@@ -125924,7 +129934,7 @@ static void updateVirtualTable(
/* End of the ephemeral table scan. Or, if using the onepass strategy,
** jump to here if the scan visited zero rows. */
- if( bOnePass==0 ){
+ if( eOnePass==ONEPASS_OFF ){
sqlite3VdbeAddOp2(v, OP_Next, ephemTab, addr+1); VdbeCoverage(v);
sqlite3VdbeJumpHere(v, addr);
sqlite3VdbeAddOp2(v, OP_Close, ephemTab, 0);
@@ -125935,6 +129945,259 @@ static void updateVirtualTable(
#endif /* SQLITE_OMIT_VIRTUALTABLE */
/************** End of update.c **********************************************/
+/************** Begin file upsert.c ******************************************/
+/*
+** 2018-04-12
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This file contains code to implement various aspects of UPSERT
+** processing and handling of the Upsert object.
+*/
+/* #include "sqliteInt.h" */
+
+#ifndef SQLITE_OMIT_UPSERT
+/*
+** Free a list of Upsert objects
+*/
+SQLITE_PRIVATE void sqlite3UpsertDelete(sqlite3 *db, Upsert *p){
+ if( p ){
+ sqlite3ExprListDelete(db, p->pUpsertTarget);
+ sqlite3ExprDelete(db, p->pUpsertTargetWhere);
+ sqlite3ExprListDelete(db, p->pUpsertSet);
+ sqlite3ExprDelete(db, p->pUpsertWhere);
+ sqlite3DbFree(db, p);
+ }
+}
+
+/*
+** Duplicate an Upsert object.
+*/
+SQLITE_PRIVATE Upsert *sqlite3UpsertDup(sqlite3 *db, Upsert *p){
+ if( p==0 ) return 0;
+ return sqlite3UpsertNew(db,
+ sqlite3ExprListDup(db, p->pUpsertTarget, 0),
+ sqlite3ExprDup(db, p->pUpsertTargetWhere, 0),
+ sqlite3ExprListDup(db, p->pUpsertSet, 0),
+ sqlite3ExprDup(db, p->pUpsertWhere, 0)
+ );
+}
+
+/*
+** Create a new Upsert object.
+*/
+SQLITE_PRIVATE Upsert *sqlite3UpsertNew(
+ sqlite3 *db, /* Determines which memory allocator to use */
+ ExprList *pTarget, /* Target argument to ON CONFLICT, or NULL */
+ Expr *pTargetWhere, /* Optional WHERE clause on the target */
+ ExprList *pSet, /* UPDATE columns, or NULL for a DO NOTHING */
+ Expr *pWhere /* WHERE clause for the ON CONFLICT UPDATE */
+){
+ Upsert *pNew;
+ pNew = sqlite3DbMallocRaw(db, sizeof(Upsert));
+ if( pNew==0 ){
+ sqlite3ExprListDelete(db, pTarget);
+ sqlite3ExprDelete(db, pTargetWhere);
+ sqlite3ExprListDelete(db, pSet);
+ sqlite3ExprDelete(db, pWhere);
+ return 0;
+ }else{
+ pNew->pUpsertTarget = pTarget;
+ pNew->pUpsertTargetWhere = pTargetWhere;
+ pNew->pUpsertSet = pSet;
+ pNew->pUpsertWhere = pWhere;
+ pNew->pUpsertIdx = 0;
+ }
+ return pNew;
+}
+
+/*
+** Analyze the ON CONFLICT clause described by pUpsert. Resolve all
+** symbols in the conflict-target.
+**
+** Return SQLITE_OK if everything works, or an error code is something
+** is wrong.
+*/
+SQLITE_PRIVATE int sqlite3UpsertAnalyzeTarget(
+ Parse *pParse, /* The parsing context */
+ SrcList *pTabList, /* Table into which we are inserting */
+ Upsert *pUpsert /* The ON CONFLICT clauses */
+){
+ Table *pTab; /* That table into which we are inserting */
+ int rc; /* Result code */
+ int iCursor; /* Cursor used by pTab */
+ Index *pIdx; /* One of the indexes of pTab */
+ ExprList *pTarget; /* The conflict-target clause */
+ Expr *pTerm; /* One term of the conflict-target clause */
+ NameContext sNC; /* Context for resolving symbolic names */
+ Expr sCol[2]; /* Index column converted into an Expr */
+
+ assert( pTabList->nSrc==1 );
+ assert( pTabList->a[0].pTab!=0 );
+ assert( pUpsert!=0 );
+ assert( pUpsert->pUpsertTarget!=0 );
+
+ /* Resolve all symbolic names in the conflict-target clause, which
+ ** includes both the list of columns and the optional partial-index
+ ** WHERE clause.
+ */
+ memset(&sNC, 0, sizeof(sNC));
+ sNC.pParse = pParse;
+ sNC.pSrcList = pTabList;
+ rc = sqlite3ResolveExprListNames(&sNC, pUpsert->pUpsertTarget);
+ if( rc ) return rc;
+ rc = sqlite3ResolveExprNames(&sNC, pUpsert->pUpsertTargetWhere);
+ if( rc ) return rc;
+
+ /* Check to see if the conflict target matches the rowid. */
+ pTab = pTabList->a[0].pTab;
+ pTarget = pUpsert->pUpsertTarget;
+ iCursor = pTabList->a[0].iCursor;
+ if( HasRowid(pTab)
+ && pTarget->nExpr==1
+ && (pTerm = pTarget->a[0].pExpr)->op==TK_COLUMN
+ && pTerm->iColumn==XN_ROWID
+ ){
+ /* The conflict-target is the rowid of the primary table */
+ assert( pUpsert->pUpsertIdx==0 );
+ return SQLITE_OK;
+ }
+
+ /* Initialize sCol[0..1] to be an expression parse tree for a
+ ** single column of an index. The sCol[0] node will be the TK_COLLATE
+ ** operator and sCol[1] will be the TK_COLUMN operator. Code below
+ ** will populate the specific collation and column number values
+ ** prior to comparing against the conflict-target expression.
+ */
+ memset(sCol, 0, sizeof(sCol));
+ sCol[0].op = TK_COLLATE;
+ sCol[0].pLeft = &sCol[1];
+ sCol[1].op = TK_COLUMN;
+ sCol[1].iTable = pTabList->a[0].iCursor;
+
+ /* Check for matches against other indexes */
+ for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
+ int ii, jj, nn;
+ if( !IsUniqueIndex(pIdx) ) continue;
+ if( pTarget->nExpr!=pIdx->nKeyCol ) continue;
+ if( pIdx->pPartIdxWhere ){
+ if( pUpsert->pUpsertTargetWhere==0 ) continue;
+ if( sqlite3ExprCompare(pParse, pUpsert->pUpsertTargetWhere,
+ pIdx->pPartIdxWhere, iCursor)!=0 ){
+ continue;
+ }
+ }
+ nn = pIdx->nKeyCol;
+ for(ii=0; ii<nn; ii++){
+ Expr *pExpr;
+ sCol[0].u.zToken = (char*)pIdx->azColl[ii];
+ if( pIdx->aiColumn[ii]==XN_EXPR ){
+ assert( pIdx->aColExpr!=0 );
+ assert( pIdx->aColExpr->nExpr>ii );
+ pExpr = pIdx->aColExpr->a[ii].pExpr;
+ if( pExpr->op!=TK_COLLATE ){
+ sCol[0].pLeft = pExpr;
+ pExpr = &sCol[0];
+ }
+ }else{
+ sCol[0].pLeft = &sCol[1];
+ sCol[1].iColumn = pIdx->aiColumn[ii];
+ pExpr = &sCol[0];
+ }
+ for(jj=0; jj<nn; jj++){
+ if( sqlite3ExprCompare(pParse, pTarget->a[jj].pExpr, pExpr,iCursor)<2 ){
+ break; /* Column ii of the index matches column jj of target */
+ }
+ }
+ if( jj>=nn ){
+ /* The target contains no match for column jj of the index */
+ break;
+ }
+ }
+ if( ii<nn ){
+ /* Column ii of the index did not match any term of the conflict target.
+ ** Continue the search with the next index. */
+ continue;
+ }
+ pUpsert->pUpsertIdx = pIdx;
+ return SQLITE_OK;
+ }
+ sqlite3ErrorMsg(pParse, "ON CONFLICT clause does not match any "
+ "PRIMARY KEY or UNIQUE constraint");
+ return SQLITE_ERROR;
+}
+
+/*
+** Generate bytecode that does an UPDATE as part of an upsert.
+**
+** If pIdx is NULL, then the UNIQUE constraint that failed was the IPK.
+** In this case parameter iCur is a cursor open on the table b-tree that
+** currently points to the conflicting table row. Otherwise, if pIdx
+** is not NULL, then pIdx is the constraint that failed and iCur is a
+** cursor points to the conflicting row.
+*/
+SQLITE_PRIVATE void sqlite3UpsertDoUpdate(
+ Parse *pParse, /* The parsing and code-generating context */
+ Upsert *pUpsert, /* The ON CONFLICT clause for the upsert */
+ Table *pTab, /* The table being updated */
+ Index *pIdx, /* The UNIQUE constraint that failed */
+ int iCur /* Cursor for pIdx (or pTab if pIdx==NULL) */
+){
+ Vdbe *v = pParse->pVdbe;
+ sqlite3 *db = pParse->db;
+ SrcList *pSrc; /* FROM clause for the UPDATE */
+ int iDataCur = pUpsert->iDataCur;
+
+ assert( v!=0 );
+ VdbeNoopComment((v, "Begin DO UPDATE of UPSERT"));
+ if( pIdx && iCur!=iDataCur ){
+ if( HasRowid(pTab) ){
+ int regRowid = sqlite3GetTempReg(pParse);
+ sqlite3VdbeAddOp2(v, OP_IdxRowid, iCur, regRowid);
+ sqlite3VdbeAddOp3(v, OP_SeekRowid, iDataCur, 0, regRowid);
+ VdbeCoverage(v);
+ sqlite3ReleaseTempReg(pParse, regRowid);
+ }else{
+ Index *pPk = sqlite3PrimaryKeyIndex(pTab);
+ int nPk = pPk->nKeyCol;
+ int iPk = pParse->nMem+1;
+ int i;
+ pParse->nMem += nPk;
+ for(i=0; i<nPk; i++){
+ int k;
+ assert( pPk->aiColumn[i]>=0 );
+ k = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[i]);
+ sqlite3VdbeAddOp3(v, OP_Column, iCur, k, iPk+i);
+ VdbeComment((v, "%s.%s", pIdx->zName,
+ pTab->aCol[pPk->aiColumn[i]].zName));
+ }
+ sqlite3VdbeVerifyAbortable(v, OE_Abort);
+ i = sqlite3VdbeAddOp4Int(v, OP_Found, iDataCur, 0, iPk, nPk);
+ VdbeCoverage(v);
+ sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_CORRUPT, OE_Abort, 0,
+ "corrupt database", P4_STATIC);
+ sqlite3VdbeJumpHere(v, i);
+ }
+ }
+ /* pUpsert does not own pUpsertSrc - the outer INSERT statement does. So
+ ** we have to make a copy before passing it down into sqlite3Update() */
+ pSrc = sqlite3SrcListDup(db, pUpsert->pUpsertSrc, 0);
+ sqlite3Update(pParse, pSrc, pUpsert->pUpsertSet,
+ pUpsert->pUpsertWhere, OE_Abort, 0, 0, pUpsert);
+ pUpsert->pUpsertSet = 0; /* Will have been deleted by sqlite3Update() */
+ pUpsert->pUpsertWhere = 0; /* Will have been deleted by sqlite3Update() */
+ VdbeNoopComment((v, "End DO UPDATE of UPSERT"));
+}
+
+#endif /* SQLITE_OMIT_UPSERT */
+
+/************** End of upsert.c **********************************************/
/************** Begin file vacuum.c ******************************************/
/*
** 2003 April 6
@@ -125977,8 +130240,14 @@ static int execSql(sqlite3 *db, char **pzErrMsg, const char *zSql){
while( SQLITE_ROW==(rc = sqlite3_step(pStmt)) ){
const char *zSubSql = (const char*)sqlite3_column_text(pStmt,0);
assert( sqlite3_strnicmp(zSql,"SELECT",6)==0 );
- if( zSubSql ){
- assert( zSubSql[0]!='S' );
+ /* The secondary SQL must be one of CREATE TABLE, CREATE INDEX,
+ ** or INSERT. Historically there have been attacks that first
+ ** corrupt the sqlite_master.sql field with other kinds of statements
+ ** then run VACUUM to get those statements to execute at inappropriate
+ ** times. */
+ if( zSubSql
+ && (strncmp(zSubSql,"CRE",3)==0 || strncmp(zSubSql,"INS",3)==0)
+ ){
rc = execSql(db, pzErrMsg, zSubSql);
if( rc!=SQLITE_OK ) break;
}
@@ -126191,7 +130460,7 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){
if( rc!=SQLITE_OK ) goto end_of_vacuum;
rc = execSqlF(db, pzErrMsg,
"SELECT sql FROM \"%w\".sqlite_master"
- " WHERE type='index' AND length(sql)>10",
+ " WHERE type='index'",
zDbMain
);
if( rc!=SQLITE_OK ) goto end_of_vacuum;
@@ -127361,9 +131630,6 @@ SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(
void *pArg = 0;
FuncDef *pNew;
int rc = 0;
- char *zLowerName;
- unsigned char *z;
-
/* Check to see the left operand is a column in a virtual table */
if( NEVER(pExpr==0) ) return pDef;
@@ -127378,16 +131644,22 @@ SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(
if( pMod->xFindFunction==0 ) return pDef;
/* Call the xFindFunction method on the virtual table implementation
- ** to see if the implementation wants to overload this function
+ ** to see if the implementation wants to overload this function.
+ **
+ ** Though undocumented, we have historically always invoked xFindFunction
+ ** with an all lower-case function name. Continue in this tradition to
+ ** avoid any chance of an incompatibility.
*/
- zLowerName = sqlite3DbStrDup(db, pDef->zName);
- if( zLowerName ){
- for(z=(unsigned char*)zLowerName; *z; z++){
- *z = sqlite3UpperToLower[*z];
+#ifdef SQLITE_DEBUG
+ {
+ int i;
+ for(i=0; pDef->zName[i]; i++){
+ unsigned char x = (unsigned char)pDef->zName[i];
+ assert( x==sqlite3UpperToLower[x] );
}
- rc = pMod->xFindFunction(pVtab, nArg, zLowerName, &xSFunc, &pArg);
- sqlite3DbFree(db, zLowerName);
}
+#endif
+ rc = pMod->xFindFunction(pVtab, nArg, pDef->zName, &xSFunc, &pArg);
if( rc==0 ){
return pDef;
}
@@ -127599,7 +131871,7 @@ SQLITE_API int sqlite3_vtab_config(sqlite3 *db, int op, ...){
** Trace output macros
*/
#if defined(SQLITE_TEST) || defined(SQLITE_DEBUG)
-/***/ int sqlite3WhereTrace;
+/***/ extern int sqlite3WhereTrace;
#endif
#if defined(SQLITE_DEBUG) \
&& (defined(SQLITE_TEST) || defined(SQLITE_ENABLE_WHERETRACE))
@@ -128047,12 +132319,10 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan(
Parse *pParse, /* Parse context */
SrcList *pTabList, /* Table list this loop refers to */
WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */
- int iLevel, /* Value for "level" column of output */
- int iFrom, /* Value for "from" column of output */
u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */
);
#else
-# define sqlite3WhereExplainOneScan(u,v,w,x,y,z) 0
+# define sqlite3WhereExplainOneScan(u,v,w,x) 0
#endif /* SQLITE_OMIT_EXPLAIN */
#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
SQLITE_PRIVATE void sqlite3WhereAddScanStatus(
@@ -128172,23 +132442,23 @@ static void explainAppendTerm(
int i;
assert( nTerm>=1 );
- if( bAnd ) sqlite3StrAccumAppend(pStr, " AND ", 5);
+ if( bAnd ) sqlite3_str_append(pStr, " AND ", 5);
- if( nTerm>1 ) sqlite3StrAccumAppend(pStr, "(", 1);
+ if( nTerm>1 ) sqlite3_str_append(pStr, "(", 1);
for(i=0; i<nTerm; i++){
- if( i ) sqlite3StrAccumAppend(pStr, ",", 1);
- sqlite3StrAccumAppendAll(pStr, explainIndexColumnName(pIdx, iTerm+i));
+ if( i ) sqlite3_str_append(pStr, ",", 1);
+ sqlite3_str_appendall(pStr, explainIndexColumnName(pIdx, iTerm+i));
}
- if( nTerm>1 ) sqlite3StrAccumAppend(pStr, ")", 1);
+ if( nTerm>1 ) sqlite3_str_append(pStr, ")", 1);
- sqlite3StrAccumAppend(pStr, zOp, 1);
+ sqlite3_str_append(pStr, zOp, 1);
- if( nTerm>1 ) sqlite3StrAccumAppend(pStr, "(", 1);
+ if( nTerm>1 ) sqlite3_str_append(pStr, "(", 1);
for(i=0; i<nTerm; i++){
- if( i ) sqlite3StrAccumAppend(pStr, ",", 1);
- sqlite3StrAccumAppend(pStr, "?", 1);
+ if( i ) sqlite3_str_append(pStr, ",", 1);
+ sqlite3_str_append(pStr, "?", 1);
}
- if( nTerm>1 ) sqlite3StrAccumAppend(pStr, ")", 1);
+ if( nTerm>1 ) sqlite3_str_append(pStr, ")", 1);
}
/*
@@ -128212,11 +132482,11 @@ static void explainIndexRange(StrAccum *pStr, WhereLoop *pLoop){
int i, j;
if( nEq==0 && (pLoop->wsFlags&(WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))==0 ) return;
- sqlite3StrAccumAppend(pStr, " (", 2);
+ sqlite3_str_append(pStr, " (", 2);
for(i=0; i<nEq; i++){
const char *z = explainIndexColumnName(pIndex, i);
- if( i ) sqlite3StrAccumAppend(pStr, " AND ", 5);
- sqlite3XPrintf(pStr, i>=nSkip ? "%s=?" : "ANY(%s)", z);
+ if( i ) sqlite3_str_append(pStr, " AND ", 5);
+ sqlite3_str_appendf(pStr, i>=nSkip ? "%s=?" : "ANY(%s)", z);
}
j = i;
@@ -128227,7 +132497,7 @@ static void explainIndexRange(StrAccum *pStr, WhereLoop *pLoop){
if( pLoop->wsFlags&WHERE_TOP_LIMIT ){
explainAppendTerm(pStr, pIndex, pLoop->u.btree.nTop, j, i, "<");
}
- sqlite3StrAccumAppend(pStr, ")", 1);
+ sqlite3_str_append(pStr, ")", 1);
}
/*
@@ -128243,19 +132513,16 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan(
Parse *pParse, /* Parse context */
SrcList *pTabList, /* Table list this loop refers to */
WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */
- int iLevel, /* Value for "level" column of output */
- int iFrom, /* Value for "from" column of output */
u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */
){
int ret = 0;
#if !defined(SQLITE_DEBUG) && !defined(SQLITE_ENABLE_STMT_SCANSTATUS)
- if( pParse->explain==2 )
+ if( sqlite3ParseToplevel(pParse)->explain==2 )
#endif
{
struct SrcList_item *pItem = &pTabList->a[pLevel->iFrom];
Vdbe *v = pParse->pVdbe; /* VM being constructed */
sqlite3 *db = pParse->db; /* Database handle */
- int iId = pParse->iSelectId; /* Select id (left-most output column) */
int isSearch; /* True for a SEARCH. False for SCAN. */
WhereLoop *pLoop; /* The controlling WhereLoop object */
u32 flags; /* Flags that describe this loop */
@@ -128272,15 +132539,15 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan(
|| (wctrlFlags&(WHERE_ORDERBY_MIN|WHERE_ORDERBY_MAX));
sqlite3StrAccumInit(&str, db, zBuf, sizeof(zBuf), SQLITE_MAX_LENGTH);
- sqlite3StrAccumAppendAll(&str, isSearch ? "SEARCH" : "SCAN");
+ sqlite3_str_appendall(&str, isSearch ? "SEARCH" : "SCAN");
if( pItem->pSelect ){
- sqlite3XPrintf(&str, " SUBQUERY %d", pItem->iSelectId);
+ sqlite3_str_appendf(&str, " SUBQUERY 0x%p", pItem->pSelect);
}else{
- sqlite3XPrintf(&str, " TABLE %s", pItem->zName);
+ sqlite3_str_appendf(&str, " TABLE %s", pItem->zName);
}
if( pItem->zAlias ){
- sqlite3XPrintf(&str, " AS %s", pItem->zAlias);
+ sqlite3_str_appendf(&str, " AS %s", pItem->zAlias);
}
if( (flags & (WHERE_IPK|WHERE_VIRTUALTABLE))==0 ){
const char *zFmt = 0;
@@ -128303,8 +132570,8 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan(
zFmt = "INDEX %s";
}
if( zFmt ){
- sqlite3StrAccumAppend(&str, " USING ", 7);
- sqlite3XPrintf(&str, zFmt, pIdx->zName);
+ sqlite3_str_append(&str, " USING ", 7);
+ sqlite3_str_appendf(&str, zFmt, pIdx->zName);
explainIndexRange(&str, pLoop);
}
}else if( (flags & WHERE_IPK)!=0 && (flags & WHERE_CONSTRAINT)!=0 ){
@@ -128319,23 +132586,26 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan(
assert( flags&WHERE_TOP_LIMIT);
zRangeOp = "<";
}
- sqlite3XPrintf(&str, " USING INTEGER PRIMARY KEY (rowid%s?)",zRangeOp);
+ sqlite3_str_appendf(&str,
+ " USING INTEGER PRIMARY KEY (rowid%s?)",zRangeOp);
}
#ifndef SQLITE_OMIT_VIRTUALTABLE
else if( (flags & WHERE_VIRTUALTABLE)!=0 ){
- sqlite3XPrintf(&str, " VIRTUAL TABLE INDEX %d:%s",
+ sqlite3_str_appendf(&str, " VIRTUAL TABLE INDEX %d:%s",
pLoop->u.vtab.idxNum, pLoop->u.vtab.idxStr);
}
#endif
#ifdef SQLITE_EXPLAIN_ESTIMATED_ROWS
if( pLoop->nOut>=10 ){
- sqlite3XPrintf(&str, " (~%llu rows)", sqlite3LogEstToInt(pLoop->nOut));
+ sqlite3_str_appendf(&str, " (~%llu rows)",
+ sqlite3LogEstToInt(pLoop->nOut));
}else{
- sqlite3StrAccumAppend(&str, " (~1 row)", 9);
+ sqlite3_str_append(&str, " (~1 row)", 9);
}
#endif
zMsg = sqlite3StrAccumFinish(&str);
- ret = sqlite3VdbeAddOp4(v, OP_Explain, iId, iLevel, iFrom, zMsg,P4_DYNAMIC);
+ ret = sqlite3VdbeAddOp4(v, OP_Explain, sqlite3VdbeCurrentAddr(v),
+ pParse->addrExplain, 0, zMsg,P4_DYNAMIC);
}
return ret;
}
@@ -128415,8 +132685,8 @@ SQLITE_PRIVATE void sqlite3WhereAddScanStatus(
*/
static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){
int nLoop = 0;
- while( ALWAYS(pTerm!=0)
- && (pTerm->wtFlags & TERM_CODED)==0
+ assert( pTerm!=0 );
+ while( (pTerm->wtFlags & TERM_CODED)==0
&& (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_FromJoin))
&& (pLevel->notReady & pTerm->prereqAll)==0
){
@@ -128427,6 +132697,7 @@ static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){
}
if( pTerm->iParent<0 ) break;
pTerm = &pTerm->pWC->a[pTerm->iParent];
+ assert( pTerm!=0 );
pTerm->nChild--;
if( pTerm->nChild!=0 ) break;
nLoop++;
@@ -128497,6 +132768,102 @@ static void updateRangeAffinityStr(
}
}
+
+/*
+** pX is an expression of the form: (vector) IN (SELECT ...)
+** In other words, it is a vector IN operator with a SELECT clause on the
+** LHS. But not all terms in the vector are indexable and the terms might
+** not be in the correct order for indexing.
+**
+** This routine makes a copy of the input pX expression and then adjusts
+** the vector on the LHS with corresponding changes to the SELECT so that
+** the vector contains only index terms and those terms are in the correct
+** order. The modified IN expression is returned. The caller is responsible
+** for deleting the returned expression.
+**
+** Example:
+**
+** CREATE TABLE t1(a,b,c,d,e,f);
+** CREATE INDEX t1x1 ON t1(e,c);
+** SELECT * FROM t1 WHERE (a,b,c,d,e) IN (SELECT v,w,x,y,z FROM t2)
+** \_______________________________________/
+** The pX expression
+**
+** Since only columns e and c can be used with the index, in that order,
+** the modified IN expression that is returned will be:
+**
+** (e,c) IN (SELECT z,x FROM t2)
+**
+** The reduced pX is different from the original (obviously) and thus is
+** only used for indexing, to improve performance. The original unaltered
+** IN expression must also be run on each output row for correctness.
+*/
+static Expr *removeUnindexableInClauseTerms(
+ Parse *pParse, /* The parsing context */
+ int iEq, /* Look at loop terms starting here */
+ WhereLoop *pLoop, /* The current loop */
+ Expr *pX /* The IN expression to be reduced */
+){
+ sqlite3 *db = pParse->db;
+ Expr *pNew = sqlite3ExprDup(db, pX, 0);
+ if( db->mallocFailed==0 ){
+ ExprList *pOrigRhs = pNew->x.pSelect->pEList; /* Original unmodified RHS */
+ ExprList *pOrigLhs = pNew->pLeft->x.pList; /* Original unmodified LHS */
+ ExprList *pRhs = 0; /* New RHS after modifications */
+ ExprList *pLhs = 0; /* New LHS after mods */
+ int i; /* Loop counter */
+ Select *pSelect; /* Pointer to the SELECT on the RHS */
+
+ for(i=iEq; i<pLoop->nLTerm; i++){
+ if( pLoop->aLTerm[i]->pExpr==pX ){
+ int iField = pLoop->aLTerm[i]->iField - 1;
+ assert( pOrigRhs->a[iField].pExpr!=0 );
+ pRhs = sqlite3ExprListAppend(pParse, pRhs, pOrigRhs->a[iField].pExpr);
+ pOrigRhs->a[iField].pExpr = 0;
+ assert( pOrigLhs->a[iField].pExpr!=0 );
+ pLhs = sqlite3ExprListAppend(pParse, pLhs, pOrigLhs->a[iField].pExpr);
+ pOrigLhs->a[iField].pExpr = 0;
+ }
+ }
+ sqlite3ExprListDelete(db, pOrigRhs);
+ sqlite3ExprListDelete(db, pOrigLhs);
+ pNew->pLeft->x.pList = pLhs;
+ pNew->x.pSelect->pEList = pRhs;
+ if( pLhs && pLhs->nExpr==1 ){
+ /* Take care here not to generate a TK_VECTOR containing only a
+ ** single value. Since the parser never creates such a vector, some
+ ** of the subroutines do not handle this case. */
+ Expr *p = pLhs->a[0].pExpr;
+ pLhs->a[0].pExpr = 0;
+ sqlite3ExprDelete(db, pNew->pLeft);
+ pNew->pLeft = p;
+ }
+ pSelect = pNew->x.pSelect;
+ if( pSelect->pOrderBy ){
+ /* If the SELECT statement has an ORDER BY clause, zero the
+ ** iOrderByCol variables. These are set to non-zero when an
+ ** ORDER BY term exactly matches one of the terms of the
+ ** result-set. Since the result-set of the SELECT statement may
+ ** have been modified or reordered, these variables are no longer
+ ** set correctly. Since setting them is just an optimization,
+ ** it's easiest just to zero them here. */
+ ExprList *pOrderBy = pSelect->pOrderBy;
+ for(i=0; i<pOrderBy->nExpr; i++){
+ pOrderBy->a[i].u.x.iOrderByCol = 0;
+ }
+ }
+
+#if 0
+ printf("For indexing, change the IN expr:\n");
+ sqlite3TreeViewExpr(0, pX, 0);
+ printf("Into:\n");
+ sqlite3TreeViewExpr(0, pNew, 0);
+#endif
+ }
+ return pNew;
+}
+
+
/*
** Generate code for a single equality term of the WHERE clause. An equality
** term can be either X=expr or X IN (...). pTerm is the term to be
@@ -128559,68 +132926,23 @@ static int codeEqualityTerm(
}
}
for(i=iEq;i<pLoop->nLTerm; i++){
- if( ALWAYS(pLoop->aLTerm[i]) && pLoop->aLTerm[i]->pExpr==pX ) nEq++;
+ assert( pLoop->aLTerm[i]!=0 );
+ if( pLoop->aLTerm[i]->pExpr==pX ) nEq++;
}
if( (pX->flags & EP_xIsSelect)==0 || pX->x.pSelect->pEList->nExpr==1 ){
eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0);
}else{
- Select *pSelect = pX->x.pSelect;
sqlite3 *db = pParse->db;
- u16 savedDbOptFlags = db->dbOptFlags;
- ExprList *pOrigRhs = pSelect->pEList;
- ExprList *pOrigLhs = pX->pLeft->x.pList;
- ExprList *pRhs = 0; /* New Select.pEList for RHS */
- ExprList *pLhs = 0; /* New pX->pLeft vector */
-
- for(i=iEq;i<pLoop->nLTerm; i++){
- if( pLoop->aLTerm[i]->pExpr==pX ){
- int iField = pLoop->aLTerm[i]->iField - 1;
- Expr *pNewRhs = sqlite3ExprDup(db, pOrigRhs->a[iField].pExpr, 0);
- Expr *pNewLhs = sqlite3ExprDup(db, pOrigLhs->a[iField].pExpr, 0);
+ pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX);
- pRhs = sqlite3ExprListAppend(pParse, pRhs, pNewRhs);
- pLhs = sqlite3ExprListAppend(pParse, pLhs, pNewLhs);
- }
- }
if( !db->mallocFailed ){
- Expr *pLeft = pX->pLeft;
-
- if( pSelect->pOrderBy ){
- /* If the SELECT statement has an ORDER BY clause, zero the
- ** iOrderByCol variables. These are set to non-zero when an
- ** ORDER BY term exactly matches one of the terms of the
- ** result-set. Since the result-set of the SELECT statement may
- ** have been modified or reordered, these variables are no longer
- ** set correctly. Since setting them is just an optimization,
- ** it's easiest just to zero them here. */
- ExprList *pOrderBy = pSelect->pOrderBy;
- for(i=0; i<pOrderBy->nExpr; i++){
- pOrderBy->a[i].u.x.iOrderByCol = 0;
- }
- }
-
- /* Take care here not to generate a TK_VECTOR containing only a
- ** single value. Since the parser never creates such a vector, some
- ** of the subroutines do not handle this case. */
- if( pLhs->nExpr==1 ){
- pX->pLeft = pLhs->a[0].pExpr;
- }else{
- pLeft->x.pList = pLhs;
- aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int) * nEq);
- testcase( aiMap==0 );
- }
- pSelect->pEList = pRhs;
- db->dbOptFlags |= SQLITE_QueryFlattener;
+ aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq);
eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap);
- db->dbOptFlags = savedDbOptFlags;
- testcase( aiMap!=0 && aiMap[0]!=0 );
- pSelect->pEList = pOrigRhs;
- pLeft->x.pList = pOrigLhs;
- pX->pLeft = pLeft;
+ pTerm->pExpr->iTable = pX->iTable;
}
- sqlite3ExprListDelete(pParse->db, pLhs);
- sqlite3ExprListDelete(pParse->db, pRhs);
+ sqlite3ExprDelete(db, pX);
+ pX = pTerm->pExpr;
}
if( eType==IN_INDEX_INDEX_DESC ){
@@ -129284,6 +133606,9 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
** initialize a memory cell that records if this table matches any
** row of the left table of the join.
*/
+ assert( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)
+ || pLevel->iFrom>0 || (pTabItem[0].fg.jointype & JT_LEFT)==0
+ );
if( pLevel->iFrom>0 && (pTabItem[0].fg.jointype & JT_LEFT)!=0 ){
pLevel->iLeftJoin = ++pParse->nMem;
sqlite3VdbeAddOp2(v, OP_Integer, 0, pLevel->iLeftJoin);
@@ -129464,7 +133789,15 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
if( sqlite3ExprIsVector(pX->pRight) ){
r1 = rTemp = sqlite3GetTempReg(pParse);
codeExprOrVector(pParse, pX->pRight, r1, 1);
- op = aMoveOp[(pX->op - TK_GT) | 0x0001];
+ testcase( pX->op==TK_GT );
+ testcase( pX->op==TK_GE );
+ testcase( pX->op==TK_LT );
+ testcase( pX->op==TK_LE );
+ op = aMoveOp[((pX->op - TK_GT - 1) & 0x3) | 0x1];
+ assert( pX->op!=TK_GT || op==OP_SeekGE );
+ assert( pX->op!=TK_GE || op==OP_SeekGE );
+ assert( pX->op!=TK_LT || op==OP_SeekLE );
+ assert( pX->op!=TK_LE || op==OP_SeekLE );
}else{
r1 = sqlite3ExprCodeTemp(pParse, pX->pRight, &rTemp);
disableTerm(pLevel, pStart);
@@ -129759,6 +134092,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
}
}else if( bStopAtNull ){
sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq);
+ sqlite3ExprCacheRemove(pParse, regBase+nEq, 1);
endEq = 0;
nConstraint++;
}
@@ -129808,9 +134142,16 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
/* If pIdx is an index on one or more expressions, then look through
** all the expressions in pWInfo and try to transform matching expressions
** into reference to index columns.
+ **
+ ** Do not do this for the RHS of a LEFT JOIN. This is because the
+ ** expression may be evaluated after OP_NullRow has been executed on
+ ** the cursor. In this case it is important to do the full evaluation,
+ ** as the result of the expression may not be NULL, even if all table
+ ** column values are. https://www.sqlite.org/src/info/7fa8049685b50b5a
*/
- whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo);
-
+ if( pLevel->iLeftJoin==0 ){
+ whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo);
+ }
/* Record the instruction used to terminate the loop. */
if( pLoop->wsFlags & WHERE_ONEROW ){
@@ -129966,7 +134307,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
for(iTerm=0; iTerm<pWC->nTerm; iTerm++){
Expr *pExpr = pWC->a[iTerm].pExpr;
if( &pWC->a[iTerm] == pTerm ) continue;
- if( ExprHasProperty(pExpr, EP_FromJoin) ) continue;
testcase( pWC->a[iTerm].wtFlags & TERM_VIRTUAL );
testcase( pWC->a[iTerm].wtFlags & TERM_CODED );
if( (pWC->a[iTerm].wtFlags & (TERM_VIRTUAL|TERM_CODED))!=0 ) continue;
@@ -129985,13 +134325,17 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
** sub-WHERE clause is to to invoke the main loop body as a subroutine.
*/
wctrlFlags = WHERE_OR_SUBCLAUSE | (pWInfo->wctrlFlags & WHERE_SEEK_TABLE);
+ ExplainQueryPlan((pParse, 1, "MULTI-INDEX OR"));
for(ii=0; ii<pOrWc->nTerm; ii++){
WhereTerm *pOrTerm = &pOrWc->a[ii];
if( pOrTerm->leftCursor==iCur || (pOrTerm->eOperator & WO_AND)!=0 ){
WhereInfo *pSubWInfo; /* Info for single OR-term scan */
Expr *pOrExpr = pOrTerm->pExpr; /* Current OR clause term */
int jmp1 = 0; /* Address of jump operation */
- if( pAndExpr && !ExprHasProperty(pOrExpr, EP_FromJoin) ){
+ assert( (pTabItem[0].fg.jointype & JT_LEFT)==0
+ || ExprHasProperty(pOrExpr, EP_FromJoin)
+ );
+ if( pAndExpr ){
pAndExpr->pLeft = pOrExpr;
pOrExpr = pAndExpr;
}
@@ -130003,7 +134347,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
if( pSubWInfo ){
WhereLoop *pSubLoop;
int addrExplain = sqlite3WhereExplainOneScan(
- pParse, pOrTab, &pSubWInfo->a[0], iLevel, pLevel->iFrom, 0
+ pParse, pOrTab, &pSubWInfo->a[0], 0
);
sqlite3WhereAddScanStatus(v, pOrTab, &pSubWInfo->a[0], addrExplain);
@@ -130102,6 +134446,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
}
}
}
+ ExplainQueryPlanPop(pParse);
pLevel->u.pCovidx = pCov;
if( pCov ) pLevel->iIdxCur = iCovCur;
if( pAndExpr ){
@@ -130174,7 +134519,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
}
pE = pTerm->pExpr;
assert( pE!=0 );
- if( pLevel->iLeftJoin && !ExprHasProperty(pE, EP_FromJoin) ){
+ if( (pTabItem->fg.jointype&JT_LEFT) && !ExprHasProperty(pE,EP_FromJoin) ){
continue;
}
@@ -130187,7 +134532,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
continue;
}
- if( pTerm->wtFlags & TERM_LIKECOND ){
+ if( (pTerm->wtFlags & TERM_LIKECOND)!=0 ){
/* If the TERM_LIKECOND flag is set, that means that the range search
** is sufficient to guarantee that the LIKE operator is true, so we
** can skip the call to the like(A,B) function. But this only works
@@ -130197,8 +134542,9 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
continue;
#else
u32 x = pLevel->iLikeRepCntr;
- assert( x>0 );
- skipLikeAddr = sqlite3VdbeAddOp1(v, (x&1)?OP_IfNot:OP_If, (int)(x>>1));
+ if( x>0 ){
+ skipLikeAddr = sqlite3VdbeAddOp1(v, (x&1)?OP_IfNot:OP_If,(int)(x>>1));
+ }
VdbeCoverage(v);
#endif
}
@@ -130238,6 +134584,12 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
WO_EQ|WO_IN|WO_IS, 0);
if( pAlt==0 ) continue;
if( pAlt->wtFlags & (TERM_CODED) ) continue;
+ if( (pAlt->eOperator & WO_IN)
+ && (pAlt->pExpr->flags & EP_xIsSelect)
+ && (pAlt->pExpr->x.pSelect->pEList->nExpr>1)
+ ){
+ continue;
+ }
testcase( pAlt->eOperator & WO_EQ );
testcase( pAlt->eOperator & WO_IS );
testcase( pAlt->eOperator & WO_IN );
@@ -131094,7 +135446,6 @@ static void exprAnalyzeOrTerm(
}else{
sqlite3ExprListDelete(db, pList);
}
- pTerm->eOperator = WO_NOOP; /* case 1 trumps case 3 */
}
}
}
@@ -131152,6 +135503,9 @@ static Bitmask exprSelectUsage(WhereMaskSet *pMaskSet, Select *pS){
for(i=0; i<pSrc->nSrc; i++){
mask |= exprSelectUsage(pMaskSet, pSrc->a[i].pSelect);
mask |= sqlite3WhereExprUsage(pMaskSet, pSrc->a[i].pOn);
+ if( pSrc->a[i].fg.isTabFunc ){
+ mask |= sqlite3WhereExprListUsage(pMaskSet, pSrc->a[i].u1.pFuncArg);
+ }
}
}
pS = pS->pPrior;
@@ -131259,7 +135613,7 @@ static void exprAnalyze(
int op; /* Top-level operator. pExpr->op */
Parse *pParse = pWInfo->pParse; /* Parsing context */
sqlite3 *db = pParse->db; /* Database connection */
- unsigned char eOp2; /* op2 value for LIKE/REGEXP/GLOB */
+ unsigned char eOp2 = 0; /* op2 value for LIKE/REGEXP/GLOB */
int nLeft; /* Number of elements on left side vector */
if( db->mallocFailed ){
@@ -131503,7 +135857,7 @@ static void exprAnalyze(
** to do anything with MATCH functions.
*/
if( pWC->op==TK_AND ){
- Expr *pRight, *pLeft;
+ Expr *pRight = 0, *pLeft = 0;
int res = isAuxiliaryVtabOperator(pExpr, &eOp2, &pLeft, &pRight);
while( res-- > 0 ){
int idxNew;
@@ -131564,7 +135918,7 @@ static void exprAnalyze(
exprAnalyze(pSrc, pWC, idxNew);
}
pTerm = &pWC->a[idxTerm];
- pTerm->wtFlags = TERM_CODED|TERM_VIRTUAL; /* Disable the original */
+ pTerm->wtFlags |= TERM_CODED|TERM_VIRTUAL; /* Disable the original */
pTerm->eOperator = 0;
}
@@ -131827,6 +136181,21 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs(
/* #include "sqliteInt.h" */
/* #include "whereInt.h" */
+/*
+** Extra information appended to the end of sqlite3_index_info but not
+** visible to the xBestIndex function, at least not directly. The
+** sqlite3_vtab_collation() interface knows how to reach it, however.
+**
+** This object is not an API and can be changed from one release to the
+** next. As long as allocateIndexInfo() and sqlite3_vtab_collation()
+** agree on the structure, all will be well.
+*/
+typedef struct HiddenIndexInfo HiddenIndexInfo;
+struct HiddenIndexInfo {
+ WhereClause *pWC; /* The Where clause being analyzed */
+ Parse *pParse; /* The parsing context */
+};
+
/* Forward declaration of methods */
static int whereLoopResize(sqlite3*, WhereLoop*, int);
@@ -132649,11 +137018,11 @@ end_auto_index_create:
** by passing the pointer returned by this function to sqlite3_free().
*/
static sqlite3_index_info *allocateIndexInfo(
- Parse *pParse,
- WhereClause *pWC,
+ Parse *pParse, /* The parsing context */
+ WhereClause *pWC, /* The WHERE clause being analyzed */
Bitmask mUnusable, /* Ignore terms with these prereqs */
- struct SrcList_item *pSrc,
- ExprList *pOrderBy,
+ struct SrcList_item *pSrc, /* The FROM clause term that is the vtab */
+ ExprList *pOrderBy, /* The ORDER BY clause */
u16 *pmNoOmit /* Mask of terms not to omit */
){
int i, j;
@@ -132661,6 +137030,7 @@ static sqlite3_index_info *allocateIndexInfo(
struct sqlite3_index_constraint *pIdxCons;
struct sqlite3_index_orderby *pIdxOrderBy;
struct sqlite3_index_constraint_usage *pUsage;
+ struct HiddenIndexInfo *pHidden;
WhereTerm *pTerm;
int nOrderBy;
sqlite3_index_info *pIdxInfo;
@@ -132702,7 +137072,7 @@ static sqlite3_index_info *allocateIndexInfo(
*/
pIdxInfo = sqlite3DbMallocZero(pParse->db, sizeof(*pIdxInfo)
+ (sizeof(*pIdxCons) + sizeof(*pUsage))*nTerm
- + sizeof(*pIdxOrderBy)*nOrderBy );
+ + sizeof(*pIdxOrderBy)*nOrderBy + sizeof(*pHidden) );
if( pIdxInfo==0 ){
sqlite3ErrorMsg(pParse, "out of memory");
return 0;
@@ -132713,7 +137083,8 @@ static sqlite3_index_info *allocateIndexInfo(
** changing them. We have to do some funky casting in order to
** initialize those fields.
*/
- pIdxCons = (struct sqlite3_index_constraint*)&pIdxInfo[1];
+ pHidden = (struct HiddenIndexInfo*)&pIdxInfo[1];
+ pIdxCons = (struct sqlite3_index_constraint*)&pHidden[1];
pIdxOrderBy = (struct sqlite3_index_orderby*)&pIdxCons[nTerm];
pUsage = (struct sqlite3_index_constraint_usage*)&pIdxOrderBy[nOrderBy];
*(int*)&pIdxInfo->nConstraint = nTerm;
@@ -132723,6 +137094,8 @@ static sqlite3_index_info *allocateIndexInfo(
*(struct sqlite3_index_constraint_usage**)&pIdxInfo->aConstraintUsage =
pUsage;
+ pHidden->pWC = pWC;
+ pHidden->pParse = pParse;
for(i=j=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){
u16 op;
if( pTerm->leftCursor != pSrc->iCursor ) continue;
@@ -133671,22 +138044,21 @@ static void whereLoopDelete(sqlite3 *db, WhereLoop *p){
** Free a WhereInfo structure
*/
static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){
- if( ALWAYS(pWInfo) ){
- int i;
- for(i=0; i<pWInfo->nLevel; i++){
- WhereLevel *pLevel = &pWInfo->a[i];
- if( pLevel->pWLoop && (pLevel->pWLoop->wsFlags & WHERE_IN_ABLE) ){
- sqlite3DbFree(db, pLevel->u.in.aInLoop);
- }
- }
- sqlite3WhereClauseClear(&pWInfo->sWC);
- while( pWInfo->pLoops ){
- WhereLoop *p = pWInfo->pLoops;
- pWInfo->pLoops = p->pNextLoop;
- whereLoopDelete(db, p);
+ int i;
+ assert( pWInfo!=0 );
+ for(i=0; i<pWInfo->nLevel; i++){
+ WhereLevel *pLevel = &pWInfo->a[i];
+ if( pLevel->pWLoop && (pLevel->pWLoop->wsFlags & WHERE_IN_ABLE) ){
+ sqlite3DbFree(db, pLevel->u.in.aInLoop);
}
- sqlite3DbFreeNN(db, pWInfo);
}
+ sqlite3WhereClauseClear(&pWInfo->sWC);
+ while( pWInfo->pLoops ){
+ WhereLoop *p = pWInfo->pLoops;
+ pWInfo->pLoops = p->pNextLoop;
+ whereLoopDelete(db, p);
+ }
+ sqlite3DbFreeNN(db, pWInfo);
}
/*
@@ -134163,8 +138535,8 @@ static int whereLoopAddBtreeIndex(
pNew = pBuilder->pNew;
if( db->mallocFailed ) return SQLITE_NOMEM_BKPT;
- WHERETRACE(0x800, ("BEGIN addBtreeIdx(%s), nEq=%d\n",
- pProbe->zName, pNew->u.btree.nEq));
+ WHERETRACE(0x800, ("BEGIN %s.addBtreeIdx(%s), nEq=%d\n",
+ pProbe->pTable->zName,pProbe->zName, pNew->u.btree.nEq));
assert( (pNew->wsFlags & WHERE_VIRTUALTABLE)==0 );
assert( (pNew->wsFlags & WHERE_TOP_LIMIT)==0 );
@@ -134210,15 +138582,12 @@ static int whereLoopAddBtreeIndex(
** to mix with a lower range bound from some other source */
if( pTerm->wtFlags & TERM_LIKEOPT && pTerm->eOperator==WO_LT ) continue;
- /* Do not allow IS constraints from the WHERE clause to be used by the
+ /* Do not allow constraints from the WHERE clause to be used by the
** right table of a LEFT JOIN. Only constraints in the ON clause are
** allowed */
if( (pSrc->fg.jointype & JT_LEFT)!=0
&& !ExprHasProperty(pTerm->pExpr, EP_FromJoin)
- && (eOp & (WO_IS|WO_ISNULL))!=0
){
- testcase( eOp & WO_IS );
- testcase( eOp & WO_ISNULL );
continue;
}
@@ -134269,12 +138638,14 @@ static int whereLoopAddBtreeIndex(
pNew->wsFlags |= WHERE_COLUMN_EQ;
assert( saved_nEq==pNew->u.btree.nEq );
if( iCol==XN_ROWID
- || (iCol>0 && nInMul==0 && saved_nEq==pProbe->nKeyCol-1)
+ || (iCol>=0 && nInMul==0 && saved_nEq==pProbe->nKeyCol-1)
){
- if( iCol>=0 && pProbe->uniqNotNull==0 ){
- pNew->wsFlags |= WHERE_UNQ_WANTED;
- }else{
+ if( iCol==XN_ROWID || pProbe->uniqNotNull
+ || (pProbe->nKeyCol==1 && pProbe->onError && eOp==WO_EQ)
+ ){
pNew->wsFlags |= WHERE_ONEROW;
+ }else{
+ pNew->wsFlags |= WHERE_UNQ_WANTED;
}
}
}else if( eOp & WO_ISNULL ){
@@ -134448,8 +138819,8 @@ static int whereLoopAddBtreeIndex(
pNew->wsFlags = saved_wsFlags;
}
- WHERETRACE(0x800, ("END addBtreeIdx(%s), nEq=%d, rc=%d\n",
- pProbe->zName, saved_nEq, rc));
+ WHERETRACE(0x800, ("END %s.addBtreeIdx(%s), nEq=%d, rc=%d\n",
+ pProbe->pTable->zName, pProbe->zName, saved_nEq, rc));
return rc;
}
@@ -134653,14 +139024,16 @@ static int whereLoopAddBtree(
/* TUNING: One-time cost for computing the automatic index is
** estimated to be X*N*log2(N) where N is the number of rows in
** the table being indexed and where X is 7 (LogEst=28) for normal
- ** tables or 1.375 (LogEst=4) for views and subqueries. The value
+ ** tables or 0.5 (LogEst=-10) for views and subqueries. The value
** of X is smaller for views and subqueries so that the query planner
** will be more aggressive about generating automatic indexes for
** those objects, since there is no opportunity to add schema
** indexes on subqueries and views. */
- pNew->rSetup = rLogSize + rSize + 4;
+ pNew->rSetup = rLogSize + rSize;
if( pTab->pSelect==0 && (pTab->tabFlags & TF_Ephemeral)==0 ){
- pNew->rSetup += 24;
+ pNew->rSetup += 28;
+ }else{
+ pNew->rSetup -= 10;
}
ApplyCostMultiplier(pNew->rSetup, pTab->costMult);
if( pNew->rSetup<0 ) pNew->rSetup = 0;
@@ -134678,14 +139051,17 @@ static int whereLoopAddBtree(
}
#endif /* SQLITE_OMIT_AUTOMATIC_INDEX */
- /* Loop over all indices
- */
- for(; rc==SQLITE_OK && pProbe; pProbe=pProbe->pNext, iSortIdx++){
+ /* Loop over all indices. If there was an INDEXED BY clause, then only
+ ** consider index pProbe. */
+ for(; rc==SQLITE_OK && pProbe;
+ pProbe=(pSrc->pIBIndex ? 0 : pProbe->pNext), iSortIdx++
+ ){
if( pProbe->pPartIdxWhere!=0
&& !whereUsablePartialIndex(pSrc->iCursor, pWC, pProbe->pPartIdxWhere) ){
testcase( pNew->iTab!=pSrc->iCursor ); /* See ticket [98d973b8f5] */
continue; /* Partial index inappropriate for this query */
}
+ if( pProbe->bNoQuery ) continue;
rSize = pProbe->aiRowLogEst[0];
pNew->u.btree.nEq = 0;
pNew->u.btree.nBtm = 0;
@@ -134790,10 +139166,6 @@ static int whereLoopAddBtree(
pBuilder->nRecValid = 0;
pBuilder->pRec = 0;
#endif
-
- /* If there was an INDEXED BY clause, then only that one index is
- ** considered. */
- if( pSrc->pIBIndex ) break;
}
return rc;
}
@@ -134888,9 +139260,9 @@ static int whereLoopAddVirtualOne(
|| pNew->aLTerm[iTerm]!=0
|| pIdxCons->usable==0
){
- rc = SQLITE_ERROR;
sqlite3ErrorMsg(pParse,"%s.xBestIndex malfunction",pSrc->pTab->zName);
- return rc;
+ testcase( pIdxInfo->needToFreeIdxStr );
+ return SQLITE_ERROR;
}
testcase( iTerm==nConstraint-1 );
testcase( j==0 );
@@ -134918,6 +139290,15 @@ static int whereLoopAddVirtualOne(
pNew->u.vtab.omitMask &= ~mNoOmit;
pNew->nLTerm = mxTerm+1;
+ for(i=0; i<=mxTerm; i++){
+ if( pNew->aLTerm[i]==0 ){
+ /* The non-zero argvIdx values must be contiguous. Raise an
+ ** error if they are not */
+ sqlite3ErrorMsg(pParse,"%s.xBestIndex malfunction",pSrc->pTab->zName);
+ testcase( pIdxInfo->needToFreeIdxStr );
+ return SQLITE_ERROR;
+ }
+ }
assert( pNew->nLTerm<=pNew->nLSlot );
pNew->u.vtab.idxNum = pIdxInfo->idxNum;
pNew->u.vtab.needFree = pIdxInfo->needToFreeIdxStr;
@@ -134948,6 +139329,27 @@ static int whereLoopAddVirtualOne(
return rc;
}
+/*
+** If this function is invoked from within an xBestIndex() callback, it
+** returns a pointer to a buffer containing the name of the collation
+** sequence associated with element iCons of the sqlite3_index_info.aConstraint
+** array. Or, if iCons is out of range or there is no active xBestIndex
+** call, return NULL.
+*/
+SQLITE_API const char *sqlite3_vtab_collation(sqlite3_index_info *pIdxInfo, int iCons){
+ HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1];
+ const char *zRet = 0;
+ if( iCons>=0 && iCons<pIdxInfo->nConstraint ){
+ CollSeq *pC = 0;
+ int iTerm = pIdxInfo->aConstraint[iCons].iTermOffset;
+ Expr *pX = pHidden->pWC->a[iTerm].pExpr;
+ if( pX->pLeft ){
+ pC = sqlite3BinaryCompareCollSeq(pHidden->pParse, pX->pLeft, pX->pRight);
+ }
+ zRet = (pC ? pC->zName : "BINARY");
+ }
+ return zRet;
+}
/*
** Add all WhereLoop objects for a table of the join identified by
@@ -135012,6 +139414,7 @@ static int whereLoopAddVirtual(
}
/* First call xBestIndex() with all constraints usable. */
+ WHERETRACE(0x800, ("BEGIN %s.addVirtual()\n", pSrc->pTab->zName));
WHERETRACE(0x40, (" VirtualOne: all usable\n"));
rc = whereLoopAddVirtualOne(pBuilder, mPrereq, ALLBITS, 0, p, mNoOmit, &bIn);
@@ -135087,6 +139490,7 @@ static int whereLoopAddVirtual(
if( p->needToFreeIdxStr ) sqlite3_free(p->idxStr);
sqlite3DbFreeNN(pParse->db, p);
+ WHERETRACE(0x800, ("END %s.addVirtual(), rc=%d\n", pSrc->pTab->zName, rc));
return rc;
}
#endif /* SQLITE_OMIT_VIRTUALTABLE */
@@ -135765,12 +140169,15 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
if( (pWLoop->prereq & ~pFrom->maskLoop)!=0 ) continue;
if( (pWLoop->maskSelf & pFrom->maskLoop)!=0 ) continue;
- if( (pWLoop->wsFlags & WHERE_AUTO_INDEX)!=0 && pFrom->nRow<10 ){
+ if( (pWLoop->wsFlags & WHERE_AUTO_INDEX)!=0 && pFrom->nRow<3 ){
/* Do not use an automatic index if the this loop is expected
- ** to run less than 2 times. */
+ ** to run less than 1.25 times. It is tempting to also exclude
+ ** automatic index usage on an outer loop, but sometimes an automatic
+ ** index is useful in the outer loop of a correlated subquery. */
assert( 10==sqlite3LogEst(2) );
continue;
}
+
/* At this point, pWLoop is a candidate to be the next loop.
** Compute its cost */
rUnsorted = sqlite3LogEstAdd(pWLoop->rSetup,pWLoop->rRun + pFrom->nRow);
@@ -136352,6 +140759,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
if( wctrlFlags & WHERE_WANT_DISTINCT ){
pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE;
}
+ ExplainQueryPlan((pParse, 0, "SCAN CONSTANT ROW"));
}else{
/* Assign a bit from the bitmask to every term in the FROM clause.
**
@@ -136401,6 +140809,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
*/
for(ii=0; ii<sWLB.pWC->nTerm; ii++){
WhereTerm *pT = &sWLB.pWC->a[ii];
+ if( pT->wtFlags & TERM_VIRTUAL ) continue;
if( pT->prereqAll==0 && (nTabList==0 || exprIsDeterministic(pT->pExpr)) ){
sqlite3ExprIfFalse(pParse, pT->pExpr, pWInfo->iBreak, SQLITE_JUMPIFNULL);
pT->wtFlags |= TERM_CODED;
@@ -136488,35 +140897,80 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
}
}
#endif
- /* Attempt to omit tables from the join that do not effect the result */
+
+ /* Attempt to omit tables from the join that do not affect the result.
+ ** For a table to not affect the result, the following must be true:
+ **
+ ** 1) The query must not be an aggregate.
+ ** 2) The table must be the RHS of a LEFT JOIN.
+ ** 3) Either the query must be DISTINCT, or else the ON or USING clause
+ ** must contain a constraint that limits the scan of the table to
+ ** at most a single row.
+ ** 4) The table must not be referenced by any part of the query apart
+ ** from its own USING or ON clause.
+ **
+ ** For example, given:
+ **
+ ** CREATE TABLE t1(ipk INTEGER PRIMARY KEY, v1);
+ ** CREATE TABLE t2(ipk INTEGER PRIMARY KEY, v2);
+ ** CREATE TABLE t3(ipk INTEGER PRIMARY KEY, v3);
+ **
+ ** then table t2 can be omitted from the following:
+ **
+ ** SELECT v1, v3 FROM t1
+ ** LEFT JOIN t2 USING (t1.ipk=t2.ipk)
+ ** LEFT JOIN t3 USING (t1.ipk=t3.ipk)
+ **
+ ** or from:
+ **
+ ** SELECT DISTINCT v1, v3 FROM t1
+ ** LEFT JOIN t2
+ ** LEFT JOIN t3 USING (t1.ipk=t3.ipk)
+ */
+ notReady = ~(Bitmask)0;
if( pWInfo->nLevel>=2
- && pResultSet!=0
+ && pResultSet!=0 /* guarantees condition (1) above */
&& OptimizationEnabled(db, SQLITE_OmitNoopJoin)
){
+ int i;
Bitmask tabUsed = sqlite3WhereExprListUsage(pMaskSet, pResultSet);
if( sWLB.pOrderBy ){
tabUsed |= sqlite3WhereExprListUsage(pMaskSet, sWLB.pOrderBy);
}
- while( pWInfo->nLevel>=2 ){
+ for(i=pWInfo->nLevel-1; i>=1; i--){
WhereTerm *pTerm, *pEnd;
- pLoop = pWInfo->a[pWInfo->nLevel-1].pWLoop;
- if( (pWInfo->pTabList->a[pLoop->iTab].fg.jointype & JT_LEFT)==0 ) break;
+ struct SrcList_item *pItem;
+ pLoop = pWInfo->a[i].pWLoop;
+ pItem = &pWInfo->pTabList->a[pLoop->iTab];
+ if( (pItem->fg.jointype & JT_LEFT)==0 ) continue;
if( (wctrlFlags & WHERE_WANT_DISTINCT)==0
&& (pLoop->wsFlags & WHERE_ONEROW)==0
){
- break;
+ continue;
}
- if( (tabUsed & pLoop->maskSelf)!=0 ) break;
+ if( (tabUsed & pLoop->maskSelf)!=0 ) continue;
pEnd = sWLB.pWC->a + sWLB.pWC->nTerm;
for(pTerm=sWLB.pWC->a; pTerm<pEnd; pTerm++){
- if( (pTerm->prereqAll & pLoop->maskSelf)!=0
- && !ExprHasProperty(pTerm->pExpr, EP_FromJoin)
- ){
- break;
+ if( (pTerm->prereqAll & pLoop->maskSelf)!=0 ){
+ if( !ExprHasProperty(pTerm->pExpr, EP_FromJoin)
+ || pTerm->pExpr->iRightJoinTable!=pItem->iCursor
+ ){
+ break;
+ }
}
}
- if( pTerm<pEnd ) break;
+ if( pTerm<pEnd ) continue;
WHERETRACE(0xffff, ("-> drop loop %c not used\n", pLoop->cId));
+ notReady &= ~pLoop->maskSelf;
+ for(pTerm=sWLB.pWC->a; pTerm<pEnd; pTerm++){
+ if( (pTerm->prereqAll & pLoop->maskSelf)!=0 ){
+ pTerm->wtFlags |= TERM_CODED;
+ }
+ }
+ if( i!=pWInfo->nLevel-1 ){
+ int nByte = (pWInfo->nLevel-1-i) * sizeof(WhereLevel);
+ memmove(&pWInfo->a[i], &pWInfo->a[i+1], nByte);
+ }
pWInfo->nLevel--;
nTabList--;
}
@@ -136526,15 +140980,32 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
/* If the caller is an UPDATE or DELETE statement that is requesting
** to use a one-pass algorithm, determine if this is appropriate.
+ **
+ ** A one-pass approach can be used if the caller has requested one
+ ** and either (a) the scan visits at most one row or (b) each
+ ** of the following are true:
+ **
+ ** * the caller has indicated that a one-pass approach can be used
+ ** with multiple rows (by setting WHERE_ONEPASS_MULTIROW), and
+ ** * the table is not a virtual table, and
+ ** * either the scan does not use the OR optimization or the caller
+ ** is a DELETE operation (WHERE_DUPLICATES_OK is only specified
+ ** for DELETE).
+ **
+ ** The last qualification is because an UPDATE statement uses
+ ** WhereInfo.aiCurOnePass[1] to determine whether or not it really can
+ ** use a one-pass approach, and this is not set accurately for scans
+ ** that use the OR optimization.
*/
assert( (wctrlFlags & WHERE_ONEPASS_DESIRED)==0 || pWInfo->nLevel==1 );
if( (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 ){
int wsFlags = pWInfo->a[0].pWLoop->wsFlags;
int bOnerow = (wsFlags & WHERE_ONEROW)!=0;
- if( bOnerow
- || ((wctrlFlags & WHERE_ONEPASS_MULTIROW)!=0
- && 0==(wsFlags & WHERE_VIRTUALTABLE))
- ){
+ if( bOnerow || (
+ 0!=(wctrlFlags & WHERE_ONEPASS_MULTIROW)
+ && 0==(wsFlags & WHERE_VIRTUALTABLE)
+ && (0==(wsFlags & WHERE_MULTI_OR) || (wctrlFlags & WHERE_DUPLICATES_OK))
+ )){
pWInfo->eOnePass = bOnerow ? ONEPASS_SINGLE : ONEPASS_MULTI;
if( HasRowid(pTabList->a[0].pTab) && (wsFlags & WHERE_IDX_ONLY) ){
if( wctrlFlags & WHERE_ONEPASS_MULTIROW ){
@@ -136671,7 +141142,6 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
** loop below generates code for a single nested loop of the VM
** program.
*/
- notReady = ~(Bitmask)0;
for(ii=0; ii<nTabList; ii++){
int addrExplain;
int wsFlags;
@@ -136685,7 +141155,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
}
#endif
addrExplain = sqlite3WhereExplainOneScan(
- pParse, pTabList, pLevel, ii, pLevel->iFrom, wctrlFlags
+ pParse, pTabList, pLevel, wctrlFlags
);
pLevel->addrBody = sqlite3VdbeCurrentAddr(v);
notReady = sqlite3WhereCodeOneLoopStart(pWInfo, ii, notReady);
@@ -136735,6 +141205,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
Index *pIdx;
int n;
if( pWInfo->eDistinct==WHERE_DISTINCT_ORDERED
+ && i==pWInfo->nLevel-1 /* Ticket [ef9318757b152e3] 2017-10-21 */
&& (pLoop->wsFlags & WHERE_INDEXED)!=0
&& (pIdx = pLoop->u.btree.pIndex)->hasStat1
&& (n = pLoop->u.btree.nIdxCol)>0
@@ -136801,7 +141272,8 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
addr = sqlite3VdbeAddOp1(v, OP_IfPos, pLevel->iLeftJoin); VdbeCoverage(v);
assert( (ws & WHERE_IDX_ONLY)==0 || (ws & WHERE_INDEXED)!=0 );
if( (ws & WHERE_IDX_ONLY)==0 ){
- sqlite3VdbeAddOp1(v, OP_NullRow, pTabList->a[i].iCursor);
+ assert( pLevel->iTabCur==pTabList->a[pLevel->iFrom].iCursor );
+ sqlite3VdbeAddOp1(v, OP_NullRow, pLevel->iTabCur);
}
if( (ws & WHERE_INDEXED)
|| ((ws & WHERE_MULTI_OR) && pLevel->u.pCovidx)
@@ -136870,7 +141342,11 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
pOp = sqlite3VdbeGetOp(v, k);
for(; k<last; k++, pOp++){
if( pOp->p1!=pLevel->iTabCur ) continue;
- if( pOp->opcode==OP_Column ){
+ if( pOp->opcode==OP_Column
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+ || pOp->opcode==OP_Offset
+#endif
+ ){
int x = pOp->p2;
assert( pIdx->pTable==pTab );
if( !HasRowid(pTab) ){
@@ -136970,15 +141446,6 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
#define YYMALLOCARGTYPE u64
/*
-** An instance of this structure holds information about the
-** LIMIT clause of a SELECT statement.
-*/
-struct LimitVal {
- Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */
- Expr *pOffset; /* The OFFSET expression. NULL if there is none */
-};
-
-/*
** An instance of the following structure describes the event of a
** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT,
** TK_DELETE, or TK_INSTEAD. If the event is of the form
@@ -137021,20 +141488,12 @@ static void disableLookaside(Parse *pParse){
}
}
- /* This is a utility routine used to set the ExprSpan.zStart and
- ** ExprSpan.zEnd values of pOut so that the span covers the complete
- ** range of text beginning with pStart and going to the end of pEnd.
- */
- static void spanSet(ExprSpan *pOut, Token *pStart, Token *pEnd){
- pOut->zStart = pStart->z;
- pOut->zEnd = &pEnd->z[pEnd->n];
- }
/* Construct a new Expr object from a single identifier. Use the
** new Expr to populate pOut. Set the span of pOut to be the identifier
** that created the expression.
*/
- static void spanExpr(ExprSpan *pOut, Parse *pParse, int op, Token t){
+ static Expr *tokenExpr(Parse *pParse, int op, Token t){
Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1);
if( p ){
memset(p, 0, sizeof(Expr));
@@ -137052,45 +141511,9 @@ static void disableLookaside(Parse *pParse){
p->nHeight = 1;
#endif
}
- pOut->pExpr = p;
- pOut->zStart = t.z;
- pOut->zEnd = &t.z[t.n];
- }
-
- /* This routine constructs a binary expression node out of two ExprSpan
- ** objects and uses the result to populate a new ExprSpan object.
- */
- static void spanBinaryExpr(
- Parse *pParse, /* The parsing context. Errors accumulate here */
- int op, /* The binary operation */
- ExprSpan *pLeft, /* The left operand, and output */
- ExprSpan *pRight /* The right operand */
- ){
- pLeft->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr);
- pLeft->zEnd = pRight->zEnd;
- }
-
- /* If doNot is true, then add a TK_NOT Expr-node wrapper around the
- ** outside of *ppExpr.
- */
- static void exprNot(Parse *pParse, int doNot, ExprSpan *pSpan){
- if( doNot ){
- pSpan->pExpr = sqlite3PExpr(pParse, TK_NOT, pSpan->pExpr, 0);
- }
+ return p;
}
- /* Construct an expression node for a unary postfix operator
- */
- static void spanUnaryPostfix(
- Parse *pParse, /* Parsing context to record errors */
- int op, /* The operator */
- ExprSpan *pOperand, /* The operand, and output */
- Token *pPostOp /* The operand token for setting the span */
- ){
- pOperand->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0);
- pOperand->zEnd = &pPostOp->z[pPostOp->n];
- }
-
/* A routine to convert a binary TK_IS or TK_ISNOT expression into a
** unary TK_ISNULL or TK_NOTNULL expression. */
static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){
@@ -137102,20 +141525,6 @@ static void disableLookaside(Parse *pParse){
}
}
- /* Construct an expression node for a unary prefix operator
- */
- static void spanUnaryPrefix(
- ExprSpan *pOut, /* Write the new expression node here */
- Parse *pParse, /* Parsing context to record errors */
- int op, /* The operator */
- ExprSpan *pOperand, /* The operand */
- Token *pPreOp /* The operand token for setting the span */
- ){
- pOut->zStart = pPreOp->z;
- pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0);
- pOut->zEnd = pOperand->zEnd;
- }
-
/* Add a single new term to an ExprList that is used to store a
** list of identifiers. Report an error if the ID list contains
** a COLLATE clause or an ASC or DESC keyword, except ignore the
@@ -137178,64 +141587,74 @@ static void disableLookaside(Parse *pParse){
** zero the stack is dynamically sized using realloc()
** sqlite3ParserARG_SDECL A static variable declaration for the %extra_argument
** sqlite3ParserARG_PDECL A parameter declaration for the %extra_argument
+** sqlite3ParserARG_PARAM Code to pass %extra_argument as a subroutine parameter
** sqlite3ParserARG_STORE Code to store %extra_argument into yypParser
** sqlite3ParserARG_FETCH Code to extract %extra_argument from yypParser
+** sqlite3ParserCTX_* As sqlite3ParserARG_ except for %extra_context
** YYERRORSYMBOL is the code number of the error symbol. If not
** defined, then do no error processing.
** YYNSTATE the combined number of states.
** YYNRULE the number of rules in the grammar
+** YYNTOKEN Number of terminal symbols
** YY_MAX_SHIFT Maximum value for shift actions
** YY_MIN_SHIFTREDUCE Minimum value for shift-reduce actions
** YY_MAX_SHIFTREDUCE Maximum value for shift-reduce actions
-** YY_MIN_REDUCE Minimum value for reduce actions
-** YY_MAX_REDUCE Maximum value for reduce actions
** YY_ERROR_ACTION The yy_action[] code for syntax error
** YY_ACCEPT_ACTION The yy_action[] code for accept
** YY_NO_ACTION The yy_action[] code for no-op
+** YY_MIN_REDUCE Minimum value for reduce actions
+** YY_MAX_REDUCE Maximum value for reduce actions
*/
#ifndef INTERFACE
# define INTERFACE 1
#endif
/************* Begin control #defines *****************************************/
#define YYCODETYPE unsigned char
-#define YYNOCODE 252
+#define YYNOCODE 255
#define YYACTIONTYPE unsigned short int
-#define YYWILDCARD 83
+#define YYWILDCARD 84
#define sqlite3ParserTOKENTYPE Token
typedef union {
int yyinit;
sqlite3ParserTOKENTYPE yy0;
- Expr* yy72;
- TriggerStep* yy145;
- ExprList* yy148;
- SrcList* yy185;
- ExprSpan yy190;
- int yy194;
- Select* yy243;
- IdList* yy254;
- With* yy285;
- struct TrigEvent yy332;
- struct LimitVal yy354;
- struct {int value; int mask;} yy497;
+ const char* yy36;
+ TriggerStep* yy47;
+ With* yy91;
+ struct {int value; int mask;} yy107;
+ Expr* yy182;
+ Upsert* yy198;
+ ExprList* yy232;
+ struct TrigEvent yy300;
+ Select* yy399;
+ SrcList* yy427;
+ int yy502;
+ IdList* yy510;
} YYMINORTYPE;
#ifndef YYSTACKDEPTH
#define YYSTACKDEPTH 100
#endif
-#define sqlite3ParserARG_SDECL Parse *pParse;
-#define sqlite3ParserARG_PDECL ,Parse *pParse
-#define sqlite3ParserARG_FETCH Parse *pParse = yypParser->pParse
-#define sqlite3ParserARG_STORE yypParser->pParse = pParse
+#define sqlite3ParserARG_SDECL
+#define sqlite3ParserARG_PDECL
+#define sqlite3ParserARG_PARAM
+#define sqlite3ParserARG_FETCH
+#define sqlite3ParserARG_STORE
+#define sqlite3ParserCTX_SDECL Parse *pParse;
+#define sqlite3ParserCTX_PDECL ,Parse *pParse
+#define sqlite3ParserCTX_PARAM ,pParse
+#define sqlite3ParserCTX_FETCH Parse *pParse=yypParser->pParse;
+#define sqlite3ParserCTX_STORE yypParser->pParse=pParse;
#define YYFALLBACK 1
-#define YYNSTATE 455
-#define YYNRULE 329
-#define YY_MAX_SHIFT 454
-#define YY_MIN_SHIFTREDUCE 664
-#define YY_MAX_SHIFTREDUCE 992
-#define YY_MIN_REDUCE 993
-#define YY_MAX_REDUCE 1321
-#define YY_ERROR_ACTION 1322
-#define YY_ACCEPT_ACTION 1323
-#define YY_NO_ACTION 1324
+#define YYNSTATE 490
+#define YYNRULE 341
+#define YYNTOKEN 145
+#define YY_MAX_SHIFT 489
+#define YY_MIN_SHIFTREDUCE 705
+#define YY_MAX_SHIFTREDUCE 1045
+#define YY_ERROR_ACTION 1046
+#define YY_ACCEPT_ACTION 1047
+#define YY_NO_ACTION 1048
+#define YY_MIN_REDUCE 1049
+#define YY_MAX_REDUCE 1389
/************* End control #defines *******************************************/
/* Define the yytestcase() macro to be a no-op if is not already defined
@@ -137265,9 +141684,6 @@ typedef union {
** N between YY_MIN_SHIFTREDUCE Shift to an arbitrary state then
** and YY_MAX_SHIFTREDUCE reduce by rule N-YY_MIN_SHIFTREDUCE.
**
-** N between YY_MIN_REDUCE Reduce by rule N-YY_MIN_REDUCE
-** and YY_MAX_REDUCE
-**
** N == YY_ERROR_ACTION A syntax error has occurred.
**
** N == YY_ACCEPT_ACTION The parser accepts its input.
@@ -137275,25 +141691,22 @@ typedef union {
** N == YY_NO_ACTION No such action. Denotes unused
** slots in the yy_action[] table.
**
+** N between YY_MIN_REDUCE Reduce by rule N-YY_MIN_REDUCE
+** and YY_MAX_REDUCE
+**
** The action table is constructed as a single large table named yy_action[].
** Given state S and lookahead X, the action is computed as either:
**
** (A) N = yy_action[ yy_shift_ofst[S] + X ]
** (B) N = yy_default[S]
**
-** The (A) formula is preferred. The B formula is used instead if:
-** (1) The yy_shift_ofst[S]+X value is out of range, or
-** (2) yy_lookahead[yy_shift_ofst[S]+X] is not equal to X, or
-** (3) yy_shift_ofst[S] equal YY_SHIFT_USE_DFLT.
-** (Implementation note: YY_SHIFT_USE_DFLT is chosen so that
-** YY_SHIFT_USE_DFLT+X will be out of range for all possible lookaheads X.
-** Hence only tests (1) and (2) need to be evaluated.)
+** The (A) formula is preferred. The B formula is used instead if
+** yy_lookahead[yy_shift_ofst[S]+X] is not equal to X.
**
** The formulas above are for computing the action when the lookahead is
** a terminal symbol. If the lookahead is a non-terminal (as occurs after
** a reduce action) then the yy_reduce_ofst[] array is used in place of
-** the yy_shift_ofst[] array and YY_REDUCE_USE_DFLT is used in place of
-** YY_SHIFT_USE_DFLT.
+** the yy_shift_ofst[] array.
**
** The following are the tables generated in this section:
**
@@ -137307,463 +141720,503 @@ typedef union {
** yy_default[] Default action for each state.
**
*********** Begin parsing tables **********************************************/
-#define YY_ACTTAB_COUNT (1566)
+#define YY_ACTTAB_COUNT (1657)
static const YYACTIONTYPE yy_action[] = {
- /* 0 */ 324, 1323, 155, 155, 2, 203, 94, 94, 94, 93,
- /* 10 */ 350, 98, 98, 98, 98, 91, 95, 95, 94, 94,
- /* 20 */ 94, 93, 350, 268, 99, 100, 90, 971, 971, 847,
- /* 30 */ 850, 839, 839, 97, 97, 98, 98, 98, 98, 350,
- /* 40 */ 969, 96, 96, 96, 96, 95, 95, 94, 94, 94,
- /* 50 */ 93, 350, 950, 96, 96, 96, 96, 95, 95, 94,
- /* 60 */ 94, 94, 93, 350, 250, 96, 96, 96, 96, 95,
- /* 70 */ 95, 94, 94, 94, 93, 350, 224, 224, 969, 132,
- /* 80 */ 888, 348, 347, 415, 172, 324, 1286, 449, 414, 950,
- /* 90 */ 951, 952, 808, 977, 1032, 950, 300, 786, 428, 132,
- /* 100 */ 975, 362, 976, 9, 9, 787, 132, 52, 52, 99,
- /* 110 */ 100, 90, 971, 971, 847, 850, 839, 839, 97, 97,
- /* 120 */ 98, 98, 98, 98, 372, 978, 241, 978, 262, 369,
- /* 130 */ 261, 120, 950, 951, 952, 194, 58, 324, 401, 398,
- /* 140 */ 397, 808, 427, 429, 75, 808, 1260, 1260, 132, 396,
- /* 150 */ 96, 96, 96, 96, 95, 95, 94, 94, 94, 93,
- /* 160 */ 350, 99, 100, 90, 971, 971, 847, 850, 839, 839,
- /* 170 */ 97, 97, 98, 98, 98, 98, 786, 262, 369, 261,
- /* 180 */ 826, 262, 364, 251, 787, 1084, 101, 1114, 72, 324,
- /* 190 */ 227, 1113, 242, 411, 442, 819, 92, 89, 178, 818,
- /* 200 */ 1022, 268, 96, 96, 96, 96, 95, 95, 94, 94,
- /* 210 */ 94, 93, 350, 99, 100, 90, 971, 971, 847, 850,
- /* 220 */ 839, 839, 97, 97, 98, 98, 98, 98, 449, 372,
- /* 230 */ 818, 818, 820, 92, 89, 178, 60, 92, 89, 178,
- /* 240 */ 1025, 324, 357, 930, 1316, 300, 61, 1316, 52, 52,
- /* 250 */ 836, 836, 848, 851, 96, 96, 96, 96, 95, 95,
- /* 260 */ 94, 94, 94, 93, 350, 99, 100, 90, 971, 971,
- /* 270 */ 847, 850, 839, 839, 97, 97, 98, 98, 98, 98,
- /* 280 */ 92, 89, 178, 427, 412, 198, 930, 1317, 454, 995,
- /* 290 */ 1317, 355, 1024, 324, 243, 231, 114, 277, 348, 347,
- /* 300 */ 1242, 950, 416, 1071, 928, 840, 96, 96, 96, 96,
- /* 310 */ 95, 95, 94, 94, 94, 93, 350, 99, 100, 90,
- /* 320 */ 971, 971, 847, 850, 839, 839, 97, 97, 98, 98,
- /* 330 */ 98, 98, 449, 328, 449, 120, 23, 256, 950, 951,
- /* 340 */ 952, 968, 978, 438, 978, 324, 329, 928, 954, 701,
- /* 350 */ 200, 175, 52, 52, 52, 52, 939, 353, 96, 96,
- /* 360 */ 96, 96, 95, 95, 94, 94, 94, 93, 350, 99,
- /* 370 */ 100, 90, 971, 971, 847, 850, 839, 839, 97, 97,
- /* 380 */ 98, 98, 98, 98, 354, 449, 954, 427, 417, 427,
- /* 390 */ 426, 1290, 92, 89, 178, 268, 253, 324, 255, 1058,
- /* 400 */ 1037, 694, 93, 350, 383, 52, 52, 380, 1058, 374,
- /* 410 */ 96, 96, 96, 96, 95, 95, 94, 94, 94, 93,
- /* 420 */ 350, 99, 100, 90, 971, 971, 847, 850, 839, 839,
- /* 430 */ 97, 97, 98, 98, 98, 98, 228, 449, 167, 449,
- /* 440 */ 427, 407, 157, 446, 446, 446, 349, 349, 349, 324,
- /* 450 */ 310, 316, 991, 827, 320, 242, 411, 51, 51, 36,
- /* 460 */ 36, 254, 96, 96, 96, 96, 95, 95, 94, 94,
- /* 470 */ 94, 93, 350, 99, 100, 90, 971, 971, 847, 850,
- /* 480 */ 839, 839, 97, 97, 98, 98, 98, 98, 194, 316,
- /* 490 */ 929, 401, 398, 397, 224, 224, 1265, 939, 353, 1318,
- /* 500 */ 317, 324, 396, 1063, 1063, 813, 414, 1061, 1061, 950,
- /* 510 */ 299, 448, 992, 268, 96, 96, 96, 96, 95, 95,
- /* 520 */ 94, 94, 94, 93, 350, 99, 100, 90, 971, 971,
- /* 530 */ 847, 850, 839, 839, 97, 97, 98, 98, 98, 98,
- /* 540 */ 757, 1041, 449, 893, 893, 386, 950, 951, 952, 410,
- /* 550 */ 992, 747, 747, 324, 229, 268, 221, 296, 268, 771,
- /* 560 */ 890, 378, 52, 52, 890, 421, 96, 96, 96, 96,
- /* 570 */ 95, 95, 94, 94, 94, 93, 350, 99, 100, 90,
- /* 580 */ 971, 971, 847, 850, 839, 839, 97, 97, 98, 98,
- /* 590 */ 98, 98, 103, 449, 275, 384, 1241, 343, 157, 1207,
- /* 600 */ 909, 669, 670, 671, 176, 197, 196, 195, 324, 298,
- /* 610 */ 319, 1266, 2, 37, 37, 910, 1134, 1040, 96, 96,
- /* 620 */ 96, 96, 95, 95, 94, 94, 94, 93, 350, 697,
- /* 630 */ 911, 177, 99, 100, 90, 971, 971, 847, 850, 839,
- /* 640 */ 839, 97, 97, 98, 98, 98, 98, 230, 146, 120,
- /* 650 */ 735, 1235, 826, 270, 1141, 273, 1141, 771, 171, 170,
- /* 660 */ 736, 1141, 82, 324, 80, 268, 697, 819, 158, 268,
- /* 670 */ 378, 818, 78, 96, 96, 96, 96, 95, 95, 94,
- /* 680 */ 94, 94, 93, 350, 120, 950, 393, 99, 100, 90,
- /* 690 */ 971, 971, 847, 850, 839, 839, 97, 97, 98, 98,
- /* 700 */ 98, 98, 818, 818, 820, 1141, 1070, 370, 331, 133,
- /* 710 */ 1066, 1141, 1250, 198, 268, 324, 1016, 330, 245, 333,
- /* 720 */ 24, 334, 950, 951, 952, 368, 335, 81, 96, 96,
- /* 730 */ 96, 96, 95, 95, 94, 94, 94, 93, 350, 99,
- /* 740 */ 100, 90, 971, 971, 847, 850, 839, 839, 97, 97,
- /* 750 */ 98, 98, 98, 98, 132, 267, 260, 445, 330, 223,
- /* 760 */ 175, 1289, 925, 752, 724, 318, 1073, 324, 751, 246,
- /* 770 */ 385, 301, 301, 378, 329, 361, 344, 414, 1233, 280,
- /* 780 */ 96, 96, 96, 96, 95, 95, 94, 94, 94, 93,
- /* 790 */ 350, 99, 88, 90, 971, 971, 847, 850, 839, 839,
- /* 800 */ 97, 97, 98, 98, 98, 98, 337, 346, 721, 722,
- /* 810 */ 449, 120, 118, 887, 162, 887, 810, 371, 324, 202,
- /* 820 */ 202, 373, 249, 263, 202, 394, 74, 704, 208, 1069,
- /* 830 */ 12, 12, 96, 96, 96, 96, 95, 95, 94, 94,
- /* 840 */ 94, 93, 350, 100, 90, 971, 971, 847, 850, 839,
- /* 850 */ 839, 97, 97, 98, 98, 98, 98, 449, 771, 232,
- /* 860 */ 449, 278, 120, 286, 74, 704, 714, 713, 324, 342,
- /* 870 */ 749, 877, 1209, 77, 285, 1255, 780, 52, 52, 202,
- /* 880 */ 27, 27, 418, 96, 96, 96, 96, 95, 95, 94,
- /* 890 */ 94, 94, 93, 350, 90, 971, 971, 847, 850, 839,
- /* 900 */ 839, 97, 97, 98, 98, 98, 98, 86, 444, 877,
- /* 910 */ 3, 1193, 422, 1013, 873, 435, 886, 208, 886, 689,
- /* 920 */ 1091, 257, 116, 822, 447, 1230, 117, 1229, 86, 444,
- /* 930 */ 177, 3, 381, 96, 96, 96, 96, 95, 95, 94,
- /* 940 */ 94, 94, 93, 350, 339, 447, 120, 351, 120, 212,
- /* 950 */ 169, 287, 404, 282, 403, 199, 771, 950, 433, 419,
- /* 960 */ 439, 822, 280, 691, 1039, 264, 269, 132, 351, 153,
- /* 970 */ 826, 376, 74, 272, 274, 276, 83, 84, 1054, 433,
- /* 980 */ 147, 1038, 443, 85, 351, 451, 450, 281, 132, 818,
- /* 990 */ 25, 826, 449, 120, 950, 951, 952, 83, 84, 86,
- /* 1000 */ 444, 691, 3, 408, 85, 351, 451, 450, 449, 5,
- /* 1010 */ 818, 203, 32, 32, 1107, 120, 447, 950, 225, 1140,
- /* 1020 */ 818, 818, 820, 821, 19, 203, 226, 950, 38, 38,
- /* 1030 */ 1087, 314, 314, 313, 215, 311, 120, 449, 678, 351,
- /* 1040 */ 237, 818, 818, 820, 821, 19, 969, 409, 377, 1,
- /* 1050 */ 433, 180, 706, 248, 950, 951, 952, 10, 10, 449,
- /* 1060 */ 969, 247, 826, 1098, 950, 951, 952, 430, 83, 84,
- /* 1070 */ 756, 336, 950, 20, 431, 85, 351, 451, 450, 10,
- /* 1080 */ 10, 818, 86, 444, 969, 3, 950, 449, 302, 303,
- /* 1090 */ 182, 950, 1146, 338, 1021, 1015, 1004, 183, 969, 447,
- /* 1100 */ 132, 181, 76, 444, 21, 3, 449, 10, 10, 950,
- /* 1110 */ 951, 952, 818, 818, 820, 821, 19, 715, 1279, 447,
- /* 1120 */ 389, 233, 351, 950, 951, 952, 10, 10, 950, 951,
- /* 1130 */ 952, 1003, 218, 433, 1005, 325, 1273, 773, 289, 291,
- /* 1140 */ 424, 293, 351, 7, 159, 826, 363, 402, 315, 360,
- /* 1150 */ 1129, 83, 84, 433, 1232, 716, 772, 259, 85, 351,
- /* 1160 */ 451, 450, 358, 375, 818, 826, 360, 359, 399, 1211,
- /* 1170 */ 157, 83, 84, 681, 98, 98, 98, 98, 85, 351,
- /* 1180 */ 451, 450, 323, 252, 818, 295, 1211, 1213, 1235, 173,
- /* 1190 */ 1037, 284, 434, 340, 1204, 818, 818, 820, 821, 19,
- /* 1200 */ 308, 234, 449, 234, 96, 96, 96, 96, 95, 95,
- /* 1210 */ 94, 94, 94, 93, 350, 818, 818, 820, 821, 19,
- /* 1220 */ 909, 120, 39, 39, 1203, 449, 168, 360, 449, 1276,
- /* 1230 */ 367, 449, 135, 449, 986, 910, 449, 1249, 449, 1247,
- /* 1240 */ 449, 205, 983, 449, 370, 40, 40, 1211, 41, 41,
- /* 1250 */ 911, 42, 42, 28, 28, 870, 29, 29, 31, 31,
- /* 1260 */ 43, 43, 379, 44, 44, 449, 59, 449, 332, 449,
- /* 1270 */ 432, 62, 144, 156, 449, 130, 449, 72, 449, 137,
- /* 1280 */ 449, 365, 449, 392, 139, 45, 45, 11, 11, 46,
- /* 1290 */ 46, 140, 1200, 449, 105, 105, 47, 47, 48, 48,
- /* 1300 */ 33, 33, 49, 49, 1126, 449, 141, 366, 449, 185,
- /* 1310 */ 142, 449, 1234, 50, 50, 449, 160, 449, 148, 449,
- /* 1320 */ 1136, 382, 449, 67, 449, 34, 34, 449, 122, 122,
- /* 1330 */ 449, 123, 123, 449, 1198, 124, 124, 56, 56, 35,
- /* 1340 */ 35, 449, 106, 106, 53, 53, 449, 107, 107, 449,
- /* 1350 */ 108, 108, 449, 104, 104, 449, 406, 449, 388, 449,
- /* 1360 */ 189, 121, 121, 449, 190, 449, 119, 119, 449, 112,
- /* 1370 */ 112, 449, 111, 111, 1218, 109, 109, 110, 110, 55,
- /* 1380 */ 55, 266, 752, 57, 57, 54, 54, 751, 26, 26,
- /* 1390 */ 1099, 30, 30, 219, 154, 390, 271, 191, 321, 1006,
- /* 1400 */ 192, 405, 1057, 1056, 1055, 341, 1048, 706, 1047, 1029,
- /* 1410 */ 322, 420, 1028, 71, 1095, 283, 288, 1027, 1288, 204,
- /* 1420 */ 6, 297, 79, 1184, 437, 1096, 1094, 290, 345, 292,
- /* 1430 */ 441, 1093, 294, 102, 425, 73, 423, 213, 1012, 22,
- /* 1440 */ 452, 945, 214, 1077, 216, 217, 238, 453, 306, 304,
- /* 1450 */ 307, 239, 240, 1001, 305, 125, 996, 126, 115, 235,
- /* 1460 */ 127, 665, 352, 166, 244, 179, 356, 113, 885, 883,
- /* 1470 */ 806, 136, 128, 738, 326, 138, 327, 258, 184, 899,
- /* 1480 */ 143, 129, 145, 63, 64, 65, 66, 902, 186, 187,
- /* 1490 */ 898, 8, 13, 188, 134, 265, 891, 202, 980, 387,
- /* 1500 */ 150, 149, 680, 161, 391, 193, 285, 279, 395, 151,
- /* 1510 */ 68, 717, 14, 15, 400, 69, 16, 131, 236, 825,
- /* 1520 */ 824, 853, 746, 750, 4, 70, 174, 413, 220, 222,
- /* 1530 */ 152, 779, 774, 77, 868, 74, 854, 201, 17, 852,
- /* 1540 */ 908, 206, 907, 207, 18, 857, 934, 163, 436, 210,
- /* 1550 */ 935, 164, 209, 165, 440, 856, 823, 312, 690, 87,
- /* 1560 */ 211, 309, 1281, 940, 995, 1280,
+ /* 0 */ 349, 99, 96, 185, 99, 96, 185, 233, 1047, 1,
+ /* 10 */ 1, 489, 2, 1051, 484, 477, 477, 477, 260, 351,
+ /* 20 */ 121, 1310, 1120, 1120, 1178, 1115, 1094, 1128, 380, 380,
+ /* 30 */ 380, 835, 454, 410, 1115, 59, 59, 1357, 425, 836,
+ /* 40 */ 710, 711, 712, 106, 107, 97, 1023, 1023, 900, 903,
+ /* 50 */ 892, 892, 104, 104, 105, 105, 105, 105, 346, 238,
+ /* 60 */ 238, 99, 96, 185, 238, 238, 889, 889, 901, 904,
+ /* 70 */ 460, 481, 351, 99, 96, 185, 481, 347, 1177, 82,
+ /* 80 */ 388, 214, 182, 23, 194, 103, 103, 103, 103, 102,
+ /* 90 */ 102, 101, 101, 101, 100, 381, 106, 107, 97, 1023,
+ /* 100 */ 1023, 900, 903, 892, 892, 104, 104, 105, 105, 105,
+ /* 110 */ 105, 10, 385, 484, 24, 484, 1333, 489, 2, 1051,
+ /* 120 */ 335, 1043, 108, 893, 260, 351, 121, 99, 96, 185,
+ /* 130 */ 100, 381, 386, 1128, 59, 59, 59, 59, 103, 103,
+ /* 140 */ 103, 103, 102, 102, 101, 101, 101, 100, 381, 106,
+ /* 150 */ 107, 97, 1023, 1023, 900, 903, 892, 892, 104, 104,
+ /* 160 */ 105, 105, 105, 105, 360, 238, 238, 170, 170, 467,
+ /* 170 */ 455, 467, 464, 67, 381, 329, 169, 481, 351, 343,
+ /* 180 */ 338, 400, 1044, 68, 101, 101, 101, 100, 381, 393,
+ /* 190 */ 194, 103, 103, 103, 103, 102, 102, 101, 101, 101,
+ /* 200 */ 100, 381, 106, 107, 97, 1023, 1023, 900, 903, 892,
+ /* 210 */ 892, 104, 104, 105, 105, 105, 105, 483, 385, 103,
+ /* 220 */ 103, 103, 103, 102, 102, 101, 101, 101, 100, 381,
+ /* 230 */ 268, 351, 946, 946, 422, 296, 102, 102, 101, 101,
+ /* 240 */ 101, 100, 381, 861, 103, 103, 103, 103, 102, 102,
+ /* 250 */ 101, 101, 101, 100, 381, 106, 107, 97, 1023, 1023,
+ /* 260 */ 900, 903, 892, 892, 104, 104, 105, 105, 105, 105,
+ /* 270 */ 484, 983, 1383, 206, 1353, 1383, 438, 435, 434, 281,
+ /* 280 */ 396, 269, 1089, 941, 351, 1002, 433, 861, 743, 401,
+ /* 290 */ 282, 57, 57, 482, 145, 791, 791, 103, 103, 103,
+ /* 300 */ 103, 102, 102, 101, 101, 101, 100, 381, 106, 107,
+ /* 310 */ 97, 1023, 1023, 900, 903, 892, 892, 104, 104, 105,
+ /* 320 */ 105, 105, 105, 281, 1002, 1003, 1004, 206, 879, 319,
+ /* 330 */ 438, 435, 434, 981, 259, 474, 360, 351, 1118, 1118,
+ /* 340 */ 433, 736, 379, 378, 872, 1002, 1356, 322, 871, 766,
+ /* 350 */ 103, 103, 103, 103, 102, 102, 101, 101, 101, 100,
+ /* 360 */ 381, 106, 107, 97, 1023, 1023, 900, 903, 892, 892,
+ /* 370 */ 104, 104, 105, 105, 105, 105, 484, 801, 484, 871,
+ /* 380 */ 871, 873, 401, 282, 1002, 1003, 1004, 1030, 360, 1030,
+ /* 390 */ 351, 983, 1384, 213, 880, 1384, 145, 59, 59, 59,
+ /* 400 */ 59, 1002, 244, 103, 103, 103, 103, 102, 102, 101,
+ /* 410 */ 101, 101, 100, 381, 106, 107, 97, 1023, 1023, 900,
+ /* 420 */ 903, 892, 892, 104, 104, 105, 105, 105, 105, 274,
+ /* 430 */ 484, 110, 467, 479, 467, 444, 259, 474, 232, 232,
+ /* 440 */ 1002, 1003, 1004, 351, 210, 335, 982, 866, 1385, 336,
+ /* 450 */ 481, 59, 59, 981, 245, 307, 103, 103, 103, 103,
+ /* 460 */ 102, 102, 101, 101, 101, 100, 381, 106, 107, 97,
+ /* 470 */ 1023, 1023, 900, 903, 892, 892, 104, 104, 105, 105,
+ /* 480 */ 105, 105, 453, 459, 484, 408, 377, 259, 474, 271,
+ /* 490 */ 183, 273, 209, 208, 207, 356, 351, 307, 178, 177,
+ /* 500 */ 127, 1006, 1098, 14, 14, 43, 43, 1044, 425, 103,
+ /* 510 */ 103, 103, 103, 102, 102, 101, 101, 101, 100, 381,
+ /* 520 */ 106, 107, 97, 1023, 1023, 900, 903, 892, 892, 104,
+ /* 530 */ 104, 105, 105, 105, 105, 294, 1132, 408, 160, 484,
+ /* 540 */ 408, 1006, 129, 962, 1209, 239, 239, 481, 307, 425,
+ /* 550 */ 1309, 1097, 351, 235, 243, 272, 820, 481, 963, 425,
+ /* 560 */ 11, 11, 103, 103, 103, 103, 102, 102, 101, 101,
+ /* 570 */ 101, 100, 381, 964, 362, 1002, 106, 107, 97, 1023,
+ /* 580 */ 1023, 900, 903, 892, 892, 104, 104, 105, 105, 105,
+ /* 590 */ 105, 1275, 161, 126, 777, 289, 1209, 292, 1072, 357,
+ /* 600 */ 1209, 1127, 476, 357, 778, 425, 247, 425, 351, 248,
+ /* 610 */ 414, 364, 414, 171, 1002, 1003, 1004, 84, 103, 103,
+ /* 620 */ 103, 103, 102, 102, 101, 101, 101, 100, 381, 1002,
+ /* 630 */ 184, 484, 106, 107, 97, 1023, 1023, 900, 903, 892,
+ /* 640 */ 892, 104, 104, 105, 105, 105, 105, 1123, 1209, 287,
+ /* 650 */ 484, 1209, 11, 11, 179, 820, 259, 474, 307, 237,
+ /* 660 */ 182, 351, 321, 365, 414, 308, 367, 366, 1002, 1003,
+ /* 670 */ 1004, 44, 44, 87, 103, 103, 103, 103, 102, 102,
+ /* 680 */ 101, 101, 101, 100, 381, 106, 107, 97, 1023, 1023,
+ /* 690 */ 900, 903, 892, 892, 104, 104, 105, 105, 105, 105,
+ /* 700 */ 246, 368, 280, 128, 10, 358, 146, 796, 835, 258,
+ /* 710 */ 1020, 88, 795, 86, 351, 421, 836, 943, 376, 348,
+ /* 720 */ 191, 943, 1318, 267, 308, 279, 456, 103, 103, 103,
+ /* 730 */ 103, 102, 102, 101, 101, 101, 100, 381, 106, 95,
+ /* 740 */ 97, 1023, 1023, 900, 903, 892, 892, 104, 104, 105,
+ /* 750 */ 105, 105, 105, 420, 249, 238, 238, 238, 238, 79,
+ /* 760 */ 375, 125, 305, 29, 262, 978, 351, 481, 337, 481,
+ /* 770 */ 756, 755, 304, 278, 415, 15, 81, 940, 1126, 940,
+ /* 780 */ 103, 103, 103, 103, 102, 102, 101, 101, 101, 100,
+ /* 790 */ 381, 107, 97, 1023, 1023, 900, 903, 892, 892, 104,
+ /* 800 */ 104, 105, 105, 105, 105, 457, 263, 484, 174, 484,
+ /* 810 */ 238, 238, 863, 407, 402, 216, 216, 351, 409, 193,
+ /* 820 */ 283, 216, 481, 81, 763, 764, 266, 5, 13, 13,
+ /* 830 */ 34, 34, 103, 103, 103, 103, 102, 102, 101, 101,
+ /* 840 */ 101, 100, 381, 97, 1023, 1023, 900, 903, 892, 892,
+ /* 850 */ 104, 104, 105, 105, 105, 105, 93, 475, 1002, 4,
+ /* 860 */ 403, 1002, 340, 431, 1002, 297, 212, 1277, 81, 746,
+ /* 870 */ 1163, 152, 926, 478, 166, 212, 757, 829, 930, 939,
+ /* 880 */ 216, 939, 858, 103, 103, 103, 103, 102, 102, 101,
+ /* 890 */ 101, 101, 100, 381, 238, 238, 382, 1002, 1003, 1004,
+ /* 900 */ 1002, 1003, 1004, 1002, 1003, 1004, 481, 439, 472, 746,
+ /* 910 */ 105, 105, 105, 105, 98, 758, 1162, 145, 930, 412,
+ /* 920 */ 879, 406, 793, 81, 395, 89, 90, 91, 105, 105,
+ /* 930 */ 105, 105, 1323, 92, 484, 382, 486, 485, 240, 275,
+ /* 940 */ 871, 103, 103, 103, 103, 102, 102, 101, 101, 101,
+ /* 950 */ 100, 381, 1096, 371, 355, 45, 45, 259, 474, 103,
+ /* 960 */ 103, 103, 103, 102, 102, 101, 101, 101, 100, 381,
+ /* 970 */ 1150, 871, 871, 873, 874, 21, 1332, 991, 384, 730,
+ /* 980 */ 722, 242, 123, 1298, 124, 875, 333, 333, 332, 227,
+ /* 990 */ 330, 991, 384, 719, 256, 242, 484, 391, 413, 1297,
+ /* 1000 */ 333, 333, 332, 227, 330, 748, 187, 719, 265, 470,
+ /* 1010 */ 1279, 1002, 484, 417, 391, 390, 264, 11, 11, 284,
+ /* 1020 */ 187, 732, 265, 93, 475, 875, 4, 1279, 1281, 419,
+ /* 1030 */ 264, 369, 416, 11, 11, 1159, 288, 484, 399, 1346,
+ /* 1040 */ 478, 379, 378, 291, 484, 293, 189, 250, 295, 1027,
+ /* 1050 */ 1002, 1003, 1004, 190, 1029, 1111, 140, 188, 11, 11,
+ /* 1060 */ 189, 732, 1028, 382, 923, 46, 46, 190, 1095, 230,
+ /* 1070 */ 140, 188, 462, 93, 475, 472, 4, 300, 309, 391,
+ /* 1080 */ 373, 6, 1069, 217, 739, 310, 1030, 879, 1030, 1171,
+ /* 1090 */ 478, 352, 1279, 90, 91, 800, 259, 474, 1208, 484,
+ /* 1100 */ 92, 1268, 382, 486, 485, 352, 1002, 871, 879, 426,
+ /* 1110 */ 259, 474, 172, 382, 238, 238, 1146, 170, 1021, 389,
+ /* 1120 */ 47, 47, 1157, 739, 872, 472, 481, 469, 871, 350,
+ /* 1130 */ 1214, 83, 475, 389, 4, 1078, 1071, 879, 871, 871,
+ /* 1140 */ 873, 874, 21, 90, 91, 1002, 1003, 1004, 478, 251,
+ /* 1150 */ 92, 251, 382, 486, 485, 443, 370, 871, 1021, 871,
+ /* 1160 */ 871, 873, 224, 241, 306, 441, 301, 440, 211, 1060,
+ /* 1170 */ 820, 382, 822, 447, 299, 1059, 484, 1061, 1143, 962,
+ /* 1180 */ 430, 796, 484, 472, 1340, 312, 795, 465, 871, 871,
+ /* 1190 */ 873, 874, 21, 314, 963, 879, 316, 59, 59, 1002,
+ /* 1200 */ 9, 90, 91, 48, 48, 238, 238, 210, 92, 964,
+ /* 1210 */ 382, 486, 485, 176, 334, 871, 242, 481, 1193, 238,
+ /* 1220 */ 238, 333, 333, 332, 227, 330, 394, 270, 719, 277,
+ /* 1230 */ 471, 481, 467, 466, 484, 145, 217, 1201, 1002, 1003,
+ /* 1240 */ 1004, 187, 3, 265, 184, 445, 871, 871, 873, 874,
+ /* 1250 */ 21, 264, 1337, 450, 1051, 39, 39, 392, 356, 260,
+ /* 1260 */ 342, 121, 468, 411, 436, 821, 180, 1094, 1128, 820,
+ /* 1270 */ 303, 1021, 1272, 1271, 299, 259, 474, 238, 238, 1002,
+ /* 1280 */ 473, 189, 484, 318, 327, 238, 238, 484, 190, 481,
+ /* 1290 */ 446, 140, 188, 1343, 238, 238, 1038, 481, 148, 175,
+ /* 1300 */ 238, 238, 484, 49, 49, 219, 481, 484, 35, 35,
+ /* 1310 */ 1317, 1021, 481, 484, 1035, 484, 1315, 484, 1002, 1003,
+ /* 1320 */ 1004, 484, 66, 36, 36, 194, 352, 484, 38, 38,
+ /* 1330 */ 484, 259, 474, 69, 50, 50, 51, 51, 52, 52,
+ /* 1340 */ 359, 484, 12, 12, 484, 1198, 484, 158, 53, 53,
+ /* 1350 */ 405, 112, 112, 385, 389, 484, 26, 484, 143, 484,
+ /* 1360 */ 150, 484, 54, 54, 397, 40, 40, 55, 55, 484,
+ /* 1370 */ 79, 484, 153, 1190, 484, 154, 56, 56, 41, 41,
+ /* 1380 */ 58, 58, 133, 133, 484, 398, 484, 429, 484, 155,
+ /* 1390 */ 134, 134, 135, 135, 484, 63, 63, 484, 341, 484,
+ /* 1400 */ 339, 484, 196, 484, 156, 42, 42, 113, 113, 60,
+ /* 1410 */ 60, 484, 404, 484, 27, 114, 114, 1204, 115, 115,
+ /* 1420 */ 111, 111, 132, 132, 131, 131, 1266, 418, 484, 162,
+ /* 1430 */ 484, 200, 119, 119, 118, 118, 484, 74, 424, 484,
+ /* 1440 */ 1286, 484, 231, 484, 202, 484, 167, 286, 427, 116,
+ /* 1450 */ 116, 117, 117, 290, 203, 442, 1062, 62, 62, 204,
+ /* 1460 */ 64, 64, 61, 61, 33, 33, 37, 37, 344, 372,
+ /* 1470 */ 1114, 1105, 748, 1113, 374, 1112, 254, 458, 1086, 255,
+ /* 1480 */ 345, 1085, 302, 1084, 1355, 78, 1154, 311, 1104, 449,
+ /* 1490 */ 452, 1155, 1153, 218, 7, 313, 315, 320, 1152, 85,
+ /* 1500 */ 1252, 317, 109, 80, 463, 225, 461, 1068, 25, 487,
+ /* 1510 */ 997, 323, 257, 226, 229, 228, 1136, 324, 325, 326,
+ /* 1520 */ 488, 136, 1057, 1052, 1302, 1303, 1301, 706, 1300, 137,
+ /* 1530 */ 122, 138, 383, 173, 1082, 261, 186, 252, 1081, 65,
+ /* 1540 */ 387, 120, 938, 936, 855, 353, 149, 1079, 139, 151,
+ /* 1550 */ 192, 780, 195, 276, 952, 157, 141, 361, 70, 363,
+ /* 1560 */ 859, 159, 71, 72, 142, 73, 955, 354, 147, 197,
+ /* 1570 */ 198, 951, 130, 16, 199, 285, 216, 1032, 201, 423,
+ /* 1580 */ 164, 944, 163, 28, 721, 428, 304, 165, 205, 759,
+ /* 1590 */ 75, 432, 298, 17, 18, 437, 76, 253, 878, 144,
+ /* 1600 */ 877, 906, 77, 986, 30, 448, 987, 31, 451, 181,
+ /* 1610 */ 234, 236, 168, 828, 823, 89, 910, 921, 81, 907,
+ /* 1620 */ 215, 905, 909, 961, 960, 19, 221, 20, 220, 22,
+ /* 1630 */ 32, 331, 876, 731, 94, 790, 794, 8, 992, 222,
+ /* 1640 */ 480, 328, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048,
+ /* 1650 */ 223, 1048, 1048, 1048, 1048, 1348, 1347,
};
static const YYCODETYPE yy_lookahead[] = {
- /* 0 */ 19, 144, 145, 146, 147, 24, 90, 91, 92, 93,
- /* 10 */ 94, 54, 55, 56, 57, 58, 88, 89, 90, 91,
- /* 20 */ 92, 93, 94, 152, 43, 44, 45, 46, 47, 48,
- /* 30 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 94,
- /* 40 */ 59, 84, 85, 86, 87, 88, 89, 90, 91, 92,
- /* 50 */ 93, 94, 59, 84, 85, 86, 87, 88, 89, 90,
- /* 60 */ 91, 92, 93, 94, 193, 84, 85, 86, 87, 88,
- /* 70 */ 89, 90, 91, 92, 93, 94, 194, 195, 97, 79,
- /* 80 */ 11, 88, 89, 152, 26, 19, 171, 152, 206, 96,
- /* 90 */ 97, 98, 72, 100, 179, 59, 152, 31, 163, 79,
- /* 100 */ 107, 219, 109, 172, 173, 39, 79, 172, 173, 43,
- /* 110 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
- /* 120 */ 54, 55, 56, 57, 152, 132, 199, 134, 108, 109,
- /* 130 */ 110, 196, 96, 97, 98, 99, 209, 19, 102, 103,
- /* 140 */ 104, 72, 207, 208, 26, 72, 119, 120, 79, 113,
- /* 150 */ 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,
- /* 160 */ 94, 43, 44, 45, 46, 47, 48, 49, 50, 51,
- /* 170 */ 52, 53, 54, 55, 56, 57, 31, 108, 109, 110,
- /* 180 */ 82, 108, 109, 110, 39, 210, 68, 175, 130, 19,
- /* 190 */ 218, 175, 119, 120, 250, 97, 221, 222, 223, 101,
- /* 200 */ 172, 152, 84, 85, 86, 87, 88, 89, 90, 91,
- /* 210 */ 92, 93, 94, 43, 44, 45, 46, 47, 48, 49,
- /* 220 */ 50, 51, 52, 53, 54, 55, 56, 57, 152, 152,
- /* 230 */ 132, 133, 134, 221, 222, 223, 66, 221, 222, 223,
- /* 240 */ 172, 19, 193, 22, 23, 152, 24, 26, 172, 173,
- /* 250 */ 46, 47, 48, 49, 84, 85, 86, 87, 88, 89,
- /* 260 */ 90, 91, 92, 93, 94, 43, 44, 45, 46, 47,
- /* 270 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
- /* 280 */ 221, 222, 223, 207, 208, 46, 22, 23, 148, 149,
- /* 290 */ 26, 242, 172, 19, 154, 218, 156, 23, 88, 89,
- /* 300 */ 241, 59, 163, 163, 83, 101, 84, 85, 86, 87,
- /* 310 */ 88, 89, 90, 91, 92, 93, 94, 43, 44, 45,
- /* 320 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
- /* 330 */ 56, 57, 152, 157, 152, 196, 196, 16, 96, 97,
- /* 340 */ 98, 26, 132, 250, 134, 19, 107, 83, 59, 23,
- /* 350 */ 211, 212, 172, 173, 172, 173, 1, 2, 84, 85,
- /* 360 */ 86, 87, 88, 89, 90, 91, 92, 93, 94, 43,
- /* 370 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
- /* 380 */ 54, 55, 56, 57, 244, 152, 97, 207, 208, 207,
- /* 390 */ 208, 185, 221, 222, 223, 152, 75, 19, 77, 179,
- /* 400 */ 180, 23, 93, 94, 228, 172, 173, 231, 188, 152,
- /* 410 */ 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,
- /* 420 */ 94, 43, 44, 45, 46, 47, 48, 49, 50, 51,
- /* 430 */ 52, 53, 54, 55, 56, 57, 193, 152, 123, 152,
- /* 440 */ 207, 208, 152, 168, 169, 170, 168, 169, 170, 19,
- /* 450 */ 160, 22, 23, 23, 164, 119, 120, 172, 173, 172,
- /* 460 */ 173, 140, 84, 85, 86, 87, 88, 89, 90, 91,
- /* 470 */ 92, 93, 94, 43, 44, 45, 46, 47, 48, 49,
- /* 480 */ 50, 51, 52, 53, 54, 55, 56, 57, 99, 22,
- /* 490 */ 23, 102, 103, 104, 194, 195, 0, 1, 2, 247,
- /* 500 */ 248, 19, 113, 190, 191, 23, 206, 190, 191, 59,
- /* 510 */ 225, 152, 83, 152, 84, 85, 86, 87, 88, 89,
- /* 520 */ 90, 91, 92, 93, 94, 43, 44, 45, 46, 47,
- /* 530 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
- /* 540 */ 90, 181, 152, 108, 109, 110, 96, 97, 98, 115,
- /* 550 */ 83, 117, 118, 19, 193, 152, 23, 152, 152, 26,
- /* 560 */ 29, 152, 172, 173, 33, 152, 84, 85, 86, 87,
- /* 570 */ 88, 89, 90, 91, 92, 93, 94, 43, 44, 45,
- /* 580 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
- /* 590 */ 56, 57, 22, 152, 16, 64, 193, 207, 152, 193,
- /* 600 */ 12, 7, 8, 9, 152, 108, 109, 110, 19, 152,
- /* 610 */ 164, 146, 147, 172, 173, 27, 163, 181, 84, 85,
- /* 620 */ 86, 87, 88, 89, 90, 91, 92, 93, 94, 59,
- /* 630 */ 42, 98, 43, 44, 45, 46, 47, 48, 49, 50,
- /* 640 */ 51, 52, 53, 54, 55, 56, 57, 238, 22, 196,
- /* 650 */ 62, 163, 82, 75, 152, 77, 152, 124, 88, 89,
- /* 660 */ 72, 152, 137, 19, 139, 152, 96, 97, 24, 152,
- /* 670 */ 152, 101, 138, 84, 85, 86, 87, 88, 89, 90,
- /* 680 */ 91, 92, 93, 94, 196, 59, 19, 43, 44, 45,
- /* 690 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
- /* 700 */ 56, 57, 132, 133, 134, 152, 193, 219, 245, 246,
- /* 710 */ 193, 152, 152, 46, 152, 19, 166, 167, 152, 217,
- /* 720 */ 232, 217, 96, 97, 98, 237, 217, 138, 84, 85,
- /* 730 */ 86, 87, 88, 89, 90, 91, 92, 93, 94, 43,
- /* 740 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
- /* 750 */ 54, 55, 56, 57, 79, 193, 238, 166, 167, 211,
- /* 760 */ 212, 23, 23, 116, 26, 26, 195, 19, 121, 152,
- /* 770 */ 217, 152, 152, 152, 107, 100, 217, 206, 163, 112,
- /* 780 */ 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,
- /* 790 */ 94, 43, 44, 45, 46, 47, 48, 49, 50, 51,
- /* 800 */ 52, 53, 54, 55, 56, 57, 187, 187, 7, 8,
- /* 810 */ 152, 196, 22, 132, 24, 134, 23, 23, 19, 26,
- /* 820 */ 26, 23, 152, 23, 26, 23, 26, 59, 26, 163,
- /* 830 */ 172, 173, 84, 85, 86, 87, 88, 89, 90, 91,
- /* 840 */ 92, 93, 94, 44, 45, 46, 47, 48, 49, 50,
- /* 850 */ 51, 52, 53, 54, 55, 56, 57, 152, 26, 238,
- /* 860 */ 152, 23, 196, 101, 26, 97, 100, 101, 19, 19,
- /* 870 */ 23, 59, 152, 26, 112, 152, 23, 172, 173, 26,
- /* 880 */ 172, 173, 19, 84, 85, 86, 87, 88, 89, 90,
- /* 890 */ 91, 92, 93, 94, 45, 46, 47, 48, 49, 50,
- /* 900 */ 51, 52, 53, 54, 55, 56, 57, 19, 20, 97,
- /* 910 */ 22, 23, 207, 163, 23, 163, 132, 26, 134, 23,
- /* 920 */ 213, 152, 26, 59, 36, 152, 22, 152, 19, 20,
- /* 930 */ 98, 22, 152, 84, 85, 86, 87, 88, 89, 90,
- /* 940 */ 91, 92, 93, 94, 94, 36, 196, 59, 196, 99,
- /* 950 */ 100, 101, 102, 103, 104, 105, 124, 59, 70, 96,
- /* 960 */ 163, 97, 112, 59, 181, 152, 152, 79, 59, 71,
- /* 970 */ 82, 19, 26, 152, 152, 152, 88, 89, 152, 70,
- /* 980 */ 22, 152, 163, 95, 96, 97, 98, 152, 79, 101,
- /* 990 */ 22, 82, 152, 196, 96, 97, 98, 88, 89, 19,
- /* 1000 */ 20, 97, 22, 163, 95, 96, 97, 98, 152, 22,
- /* 1010 */ 101, 24, 172, 173, 152, 196, 36, 59, 22, 152,
- /* 1020 */ 132, 133, 134, 135, 136, 24, 5, 59, 172, 173,
- /* 1030 */ 152, 10, 11, 12, 13, 14, 196, 152, 17, 59,
- /* 1040 */ 210, 132, 133, 134, 135, 136, 59, 207, 96, 22,
- /* 1050 */ 70, 30, 106, 32, 96, 97, 98, 172, 173, 152,
- /* 1060 */ 59, 40, 82, 152, 96, 97, 98, 152, 88, 89,
- /* 1070 */ 90, 186, 59, 22, 191, 95, 96, 97, 98, 172,
- /* 1080 */ 173, 101, 19, 20, 97, 22, 59, 152, 152, 152,
- /* 1090 */ 69, 59, 152, 186, 152, 152, 152, 76, 97, 36,
- /* 1100 */ 79, 80, 19, 20, 53, 22, 152, 172, 173, 96,
- /* 1110 */ 97, 98, 132, 133, 134, 135, 136, 35, 122, 36,
- /* 1120 */ 234, 186, 59, 96, 97, 98, 172, 173, 96, 97,
- /* 1130 */ 98, 152, 233, 70, 152, 114, 152, 124, 210, 210,
- /* 1140 */ 186, 210, 59, 198, 197, 82, 214, 65, 150, 152,
- /* 1150 */ 201, 88, 89, 70, 201, 73, 124, 239, 95, 96,
- /* 1160 */ 97, 98, 141, 239, 101, 82, 169, 170, 176, 152,
- /* 1170 */ 152, 88, 89, 21, 54, 55, 56, 57, 95, 96,
- /* 1180 */ 97, 98, 164, 214, 101, 214, 169, 170, 163, 184,
- /* 1190 */ 180, 175, 227, 111, 175, 132, 133, 134, 135, 136,
- /* 1200 */ 200, 183, 152, 185, 84, 85, 86, 87, 88, 89,
- /* 1210 */ 90, 91, 92, 93, 94, 132, 133, 134, 135, 136,
- /* 1220 */ 12, 196, 172, 173, 175, 152, 198, 230, 152, 155,
- /* 1230 */ 78, 152, 243, 152, 60, 27, 152, 159, 152, 159,
- /* 1240 */ 152, 122, 38, 152, 219, 172, 173, 230, 172, 173,
- /* 1250 */ 42, 172, 173, 172, 173, 103, 172, 173, 172, 173,
- /* 1260 */ 172, 173, 237, 172, 173, 152, 240, 152, 159, 152,
- /* 1270 */ 62, 240, 22, 220, 152, 43, 152, 130, 152, 189,
- /* 1280 */ 152, 18, 152, 18, 192, 172, 173, 172, 173, 172,
- /* 1290 */ 173, 192, 140, 152, 172, 173, 172, 173, 172, 173,
- /* 1300 */ 172, 173, 172, 173, 201, 152, 192, 159, 152, 158,
- /* 1310 */ 192, 152, 201, 172, 173, 152, 220, 152, 189, 152,
- /* 1320 */ 189, 159, 152, 137, 152, 172, 173, 152, 172, 173,
- /* 1330 */ 152, 172, 173, 152, 201, 172, 173, 172, 173, 172,
- /* 1340 */ 173, 152, 172, 173, 172, 173, 152, 172, 173, 152,
- /* 1350 */ 172, 173, 152, 172, 173, 152, 90, 152, 61, 152,
- /* 1360 */ 158, 172, 173, 152, 158, 152, 172, 173, 152, 172,
- /* 1370 */ 173, 152, 172, 173, 236, 172, 173, 172, 173, 172,
- /* 1380 */ 173, 235, 116, 172, 173, 172, 173, 121, 172, 173,
- /* 1390 */ 159, 172, 173, 159, 22, 177, 159, 158, 177, 159,
- /* 1400 */ 158, 107, 174, 174, 174, 63, 182, 106, 182, 174,
- /* 1410 */ 177, 125, 176, 107, 216, 174, 215, 174, 174, 159,
- /* 1420 */ 22, 159, 137, 224, 177, 216, 216, 215, 94, 215,
- /* 1430 */ 177, 216, 215, 129, 126, 128, 127, 25, 162, 26,
- /* 1440 */ 161, 13, 153, 205, 153, 6, 226, 151, 202, 204,
- /* 1450 */ 201, 229, 229, 151, 203, 165, 151, 165, 178, 178,
- /* 1460 */ 165, 4, 3, 22, 142, 15, 81, 16, 23, 23,
- /* 1470 */ 120, 131, 111, 20, 249, 123, 249, 16, 125, 1,
- /* 1480 */ 123, 111, 131, 53, 53, 53, 53, 96, 34, 122,
- /* 1490 */ 1, 5, 22, 107, 246, 140, 67, 26, 74, 41,
- /* 1500 */ 107, 67, 20, 24, 19, 105, 112, 23, 66, 22,
- /* 1510 */ 22, 28, 22, 22, 66, 22, 22, 37, 66, 23,
- /* 1520 */ 23, 23, 116, 23, 22, 26, 122, 26, 23, 23,
- /* 1530 */ 22, 96, 124, 26, 23, 26, 23, 34, 34, 23,
- /* 1540 */ 23, 26, 23, 22, 34, 11, 23, 22, 24, 122,
- /* 1550 */ 23, 22, 26, 22, 24, 23, 23, 15, 23, 22,
- /* 1560 */ 122, 23, 122, 1, 251, 122,
+ /* 0 */ 174, 226, 227, 228, 226, 227, 228, 172, 145, 146,
+ /* 10 */ 147, 148, 149, 150, 153, 169, 170, 171, 155, 19,
+ /* 20 */ 157, 246, 192, 193, 177, 181, 182, 164, 169, 170,
+ /* 30 */ 171, 31, 164, 153, 190, 174, 175, 187, 153, 39,
+ /* 40 */ 7, 8, 9, 43, 44, 45, 46, 47, 48, 49,
+ /* 50 */ 50, 51, 52, 53, 54, 55, 56, 57, 174, 196,
+ /* 60 */ 197, 226, 227, 228, 196, 197, 46, 47, 48, 49,
+ /* 70 */ 209, 208, 19, 226, 227, 228, 208, 174, 177, 26,
+ /* 80 */ 195, 213, 214, 22, 221, 85, 86, 87, 88, 89,
+ /* 90 */ 90, 91, 92, 93, 94, 95, 43, 44, 45, 46,
+ /* 100 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+ /* 110 */ 57, 172, 249, 153, 53, 153, 147, 148, 149, 150,
+ /* 120 */ 22, 23, 69, 103, 155, 19, 157, 226, 227, 228,
+ /* 130 */ 94, 95, 247, 164, 174, 175, 174, 175, 85, 86,
+ /* 140 */ 87, 88, 89, 90, 91, 92, 93, 94, 95, 43,
+ /* 150 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
+ /* 160 */ 54, 55, 56, 57, 153, 196, 197, 153, 153, 209,
+ /* 170 */ 210, 209, 210, 67, 95, 161, 237, 208, 19, 165,
+ /* 180 */ 165, 242, 84, 24, 91, 92, 93, 94, 95, 223,
+ /* 190 */ 221, 85, 86, 87, 88, 89, 90, 91, 92, 93,
+ /* 200 */ 94, 95, 43, 44, 45, 46, 47, 48, 49, 50,
+ /* 210 */ 51, 52, 53, 54, 55, 56, 57, 153, 249, 85,
+ /* 220 */ 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
+ /* 230 */ 219, 19, 109, 110, 111, 23, 89, 90, 91, 92,
+ /* 240 */ 93, 94, 95, 73, 85, 86, 87, 88, 89, 90,
+ /* 250 */ 91, 92, 93, 94, 95, 43, 44, 45, 46, 47,
+ /* 260 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
+ /* 270 */ 153, 22, 23, 101, 173, 26, 104, 105, 106, 109,
+ /* 280 */ 110, 111, 181, 11, 19, 59, 114, 73, 23, 110,
+ /* 290 */ 111, 174, 175, 116, 80, 118, 119, 85, 86, 87,
+ /* 300 */ 88, 89, 90, 91, 92, 93, 94, 95, 43, 44,
+ /* 310 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
+ /* 320 */ 55, 56, 57, 109, 98, 99, 100, 101, 83, 153,
+ /* 330 */ 104, 105, 106, 84, 120, 121, 153, 19, 192, 193,
+ /* 340 */ 114, 23, 89, 90, 99, 59, 23, 230, 103, 26,
+ /* 350 */ 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,
+ /* 360 */ 95, 43, 44, 45, 46, 47, 48, 49, 50, 51,
+ /* 370 */ 52, 53, 54, 55, 56, 57, 153, 91, 153, 134,
+ /* 380 */ 135, 136, 110, 111, 98, 99, 100, 134, 153, 136,
+ /* 390 */ 19, 22, 23, 26, 23, 26, 80, 174, 175, 174,
+ /* 400 */ 175, 59, 219, 85, 86, 87, 88, 89, 90, 91,
+ /* 410 */ 92, 93, 94, 95, 43, 44, 45, 46, 47, 48,
+ /* 420 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 16,
+ /* 430 */ 153, 22, 209, 210, 209, 210, 120, 121, 196, 197,
+ /* 440 */ 98, 99, 100, 19, 46, 22, 23, 23, 252, 253,
+ /* 450 */ 208, 174, 175, 84, 219, 153, 85, 86, 87, 88,
+ /* 460 */ 89, 90, 91, 92, 93, 94, 95, 43, 44, 45,
+ /* 470 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
+ /* 480 */ 56, 57, 153, 153, 153, 153, 209, 120, 121, 76,
+ /* 490 */ 153, 78, 109, 110, 111, 97, 19, 153, 89, 90,
+ /* 500 */ 198, 59, 183, 174, 175, 174, 175, 84, 153, 85,
+ /* 510 */ 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
+ /* 520 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
+ /* 530 */ 53, 54, 55, 56, 57, 16, 197, 153, 22, 153,
+ /* 540 */ 153, 99, 198, 12, 153, 196, 197, 208, 153, 153,
+ /* 550 */ 195, 183, 19, 23, 222, 142, 26, 208, 27, 153,
+ /* 560 */ 174, 175, 85, 86, 87, 88, 89, 90, 91, 92,
+ /* 570 */ 93, 94, 95, 42, 188, 59, 43, 44, 45, 46,
+ /* 580 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+ /* 590 */ 57, 195, 22, 198, 63, 76, 153, 78, 167, 168,
+ /* 600 */ 153, 195, 167, 168, 73, 153, 222, 153, 19, 222,
+ /* 610 */ 153, 220, 153, 24, 98, 99, 100, 140, 85, 86,
+ /* 620 */ 87, 88, 89, 90, 91, 92, 93, 94, 95, 59,
+ /* 630 */ 100, 153, 43, 44, 45, 46, 47, 48, 49, 50,
+ /* 640 */ 51, 52, 53, 54, 55, 56, 57, 195, 153, 195,
+ /* 650 */ 153, 153, 174, 175, 26, 125, 120, 121, 153, 213,
+ /* 660 */ 214, 19, 153, 220, 153, 153, 188, 220, 98, 99,
+ /* 670 */ 100, 174, 175, 140, 85, 86, 87, 88, 89, 90,
+ /* 680 */ 91, 92, 93, 94, 95, 43, 44, 45, 46, 47,
+ /* 690 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
+ /* 700 */ 243, 189, 243, 198, 172, 250, 251, 117, 31, 201,
+ /* 710 */ 26, 139, 122, 141, 19, 220, 39, 29, 220, 211,
+ /* 720 */ 24, 33, 153, 164, 153, 164, 19, 85, 86, 87,
+ /* 730 */ 88, 89, 90, 91, 92, 93, 94, 95, 43, 44,
+ /* 740 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
+ /* 750 */ 55, 56, 57, 65, 243, 196, 197, 196, 197, 131,
+ /* 760 */ 189, 22, 103, 24, 153, 23, 19, 208, 26, 208,
+ /* 770 */ 102, 103, 113, 23, 242, 22, 26, 134, 164, 136,
+ /* 780 */ 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,
+ /* 790 */ 95, 44, 45, 46, 47, 48, 49, 50, 51, 52,
+ /* 800 */ 53, 54, 55, 56, 57, 98, 153, 153, 124, 153,
+ /* 810 */ 196, 197, 23, 23, 61, 26, 26, 19, 23, 123,
+ /* 820 */ 23, 26, 208, 26, 7, 8, 153, 22, 174, 175,
+ /* 830 */ 174, 175, 85, 86, 87, 88, 89, 90, 91, 92,
+ /* 840 */ 93, 94, 95, 45, 46, 47, 48, 49, 50, 51,
+ /* 850 */ 52, 53, 54, 55, 56, 57, 19, 20, 59, 22,
+ /* 860 */ 111, 59, 164, 23, 59, 23, 26, 153, 26, 59,
+ /* 870 */ 153, 72, 23, 36, 72, 26, 35, 23, 59, 134,
+ /* 880 */ 26, 136, 133, 85, 86, 87, 88, 89, 90, 91,
+ /* 890 */ 92, 93, 94, 95, 196, 197, 59, 98, 99, 100,
+ /* 900 */ 98, 99, 100, 98, 99, 100, 208, 66, 71, 99,
+ /* 910 */ 54, 55, 56, 57, 58, 74, 153, 80, 99, 19,
+ /* 920 */ 83, 223, 23, 26, 153, 26, 89, 90, 54, 55,
+ /* 930 */ 56, 57, 153, 96, 153, 98, 99, 100, 22, 153,
+ /* 940 */ 103, 85, 86, 87, 88, 89, 90, 91, 92, 93,
+ /* 950 */ 94, 95, 183, 112, 158, 174, 175, 120, 121, 85,
+ /* 960 */ 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
+ /* 970 */ 215, 134, 135, 136, 137, 138, 0, 1, 2, 23,
+ /* 980 */ 21, 5, 26, 153, 22, 59, 10, 11, 12, 13,
+ /* 990 */ 14, 1, 2, 17, 212, 5, 153, 153, 98, 153,
+ /* 1000 */ 10, 11, 12, 13, 14, 108, 30, 17, 32, 193,
+ /* 1010 */ 153, 59, 153, 153, 170, 171, 40, 174, 175, 153,
+ /* 1020 */ 30, 59, 32, 19, 20, 99, 22, 170, 171, 233,
+ /* 1030 */ 40, 188, 236, 174, 175, 153, 153, 153, 79, 123,
+ /* 1040 */ 36, 89, 90, 153, 153, 153, 70, 188, 153, 97,
+ /* 1050 */ 98, 99, 100, 77, 102, 153, 80, 81, 174, 175,
+ /* 1060 */ 70, 99, 110, 59, 105, 174, 175, 77, 153, 238,
+ /* 1070 */ 80, 81, 188, 19, 20, 71, 22, 153, 153, 235,
+ /* 1080 */ 19, 22, 164, 24, 59, 153, 134, 83, 136, 153,
+ /* 1090 */ 36, 115, 235, 89, 90, 91, 120, 121, 153, 153,
+ /* 1100 */ 96, 142, 98, 99, 100, 115, 59, 103, 83, 239,
+ /* 1110 */ 120, 121, 199, 59, 196, 197, 153, 153, 59, 143,
+ /* 1120 */ 174, 175, 153, 98, 99, 71, 208, 153, 103, 165,
+ /* 1130 */ 153, 19, 20, 143, 22, 153, 153, 83, 134, 135,
+ /* 1140 */ 136, 137, 138, 89, 90, 98, 99, 100, 36, 185,
+ /* 1150 */ 96, 187, 98, 99, 100, 91, 95, 103, 99, 134,
+ /* 1160 */ 135, 136, 101, 102, 103, 104, 105, 106, 107, 153,
+ /* 1170 */ 26, 59, 125, 164, 113, 153, 153, 153, 212, 12,
+ /* 1180 */ 19, 117, 153, 71, 153, 212, 122, 164, 134, 135,
+ /* 1190 */ 136, 137, 138, 212, 27, 83, 212, 174, 175, 59,
+ /* 1200 */ 200, 89, 90, 174, 175, 196, 197, 46, 96, 42,
+ /* 1210 */ 98, 99, 100, 172, 151, 103, 5, 208, 203, 196,
+ /* 1220 */ 197, 10, 11, 12, 13, 14, 216, 216, 17, 244,
+ /* 1230 */ 63, 208, 209, 210, 153, 80, 24, 203, 98, 99,
+ /* 1240 */ 100, 30, 22, 32, 100, 164, 134, 135, 136, 137,
+ /* 1250 */ 138, 40, 148, 164, 150, 174, 175, 102, 97, 155,
+ /* 1260 */ 203, 157, 164, 244, 178, 125, 186, 182, 164, 125,
+ /* 1270 */ 177, 59, 177, 177, 113, 120, 121, 196, 197, 59,
+ /* 1280 */ 232, 70, 153, 216, 202, 196, 197, 153, 77, 208,
+ /* 1290 */ 209, 80, 81, 156, 196, 197, 60, 208, 248, 200,
+ /* 1300 */ 196, 197, 153, 174, 175, 123, 208, 153, 174, 175,
+ /* 1310 */ 160, 99, 208, 153, 38, 153, 160, 153, 98, 99,
+ /* 1320 */ 100, 153, 245, 174, 175, 221, 115, 153, 174, 175,
+ /* 1330 */ 153, 120, 121, 245, 174, 175, 174, 175, 174, 175,
+ /* 1340 */ 160, 153, 174, 175, 153, 225, 153, 22, 174, 175,
+ /* 1350 */ 97, 174, 175, 249, 143, 153, 224, 153, 43, 153,
+ /* 1360 */ 191, 153, 174, 175, 18, 174, 175, 174, 175, 153,
+ /* 1370 */ 131, 153, 194, 203, 153, 194, 174, 175, 174, 175,
+ /* 1380 */ 174, 175, 174, 175, 153, 160, 153, 18, 153, 194,
+ /* 1390 */ 174, 175, 174, 175, 153, 174, 175, 153, 225, 153,
+ /* 1400 */ 203, 153, 159, 153, 194, 174, 175, 174, 175, 174,
+ /* 1410 */ 175, 153, 203, 153, 224, 174, 175, 191, 174, 175,
+ /* 1420 */ 174, 175, 174, 175, 174, 175, 203, 160, 153, 191,
+ /* 1430 */ 153, 159, 174, 175, 174, 175, 153, 139, 62, 153,
+ /* 1440 */ 241, 153, 160, 153, 159, 153, 22, 240, 179, 174,
+ /* 1450 */ 175, 174, 175, 160, 159, 97, 160, 174, 175, 159,
+ /* 1460 */ 174, 175, 174, 175, 174, 175, 174, 175, 179, 64,
+ /* 1470 */ 176, 184, 108, 176, 95, 176, 234, 126, 176, 234,
+ /* 1480 */ 179, 178, 176, 176, 176, 97, 218, 217, 184, 179,
+ /* 1490 */ 179, 218, 218, 160, 22, 217, 217, 160, 218, 139,
+ /* 1500 */ 229, 217, 130, 129, 127, 25, 128, 163, 26, 162,
+ /* 1510 */ 13, 206, 231, 154, 6, 154, 207, 205, 204, 203,
+ /* 1520 */ 152, 166, 152, 152, 172, 172, 172, 4, 172, 166,
+ /* 1530 */ 180, 166, 3, 22, 172, 144, 15, 180, 172, 172,
+ /* 1540 */ 82, 16, 23, 23, 121, 254, 132, 172, 112, 124,
+ /* 1550 */ 24, 20, 126, 16, 1, 124, 112, 61, 53, 37,
+ /* 1560 */ 133, 132, 53, 53, 112, 53, 98, 254, 251, 34,
+ /* 1570 */ 123, 1, 5, 22, 97, 142, 26, 75, 123, 41,
+ /* 1580 */ 97, 68, 68, 24, 20, 19, 113, 22, 107, 28,
+ /* 1590 */ 22, 67, 23, 22, 22, 67, 22, 67, 23, 37,
+ /* 1600 */ 23, 23, 26, 23, 22, 24, 23, 22, 24, 123,
+ /* 1610 */ 23, 23, 22, 98, 125, 26, 11, 23, 26, 23,
+ /* 1620 */ 34, 23, 23, 23, 23, 34, 22, 34, 26, 22,
+ /* 1630 */ 22, 15, 23, 23, 22, 117, 23, 22, 1, 123,
+ /* 1640 */ 26, 23, 255, 255, 255, 255, 255, 255, 255, 255,
+ /* 1650 */ 123, 255, 255, 255, 255, 123, 123, 255, 255, 255,
+ /* 1660 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+ /* 1670 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+ /* 1680 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+ /* 1690 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+ /* 1700 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+ /* 1710 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+ /* 1720 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+ /* 1730 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+ /* 1740 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+ /* 1750 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+ /* 1760 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+ /* 1770 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+ /* 1780 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+ /* 1790 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+ /* 1800 */ 255, 255,
};
-#define YY_SHIFT_USE_DFLT (1566)
-#define YY_SHIFT_COUNT (454)
-#define YY_SHIFT_MIN (-84)
-#define YY_SHIFT_MAX (1562)
-static const short yy_shift_ofst[] = {
- /* 0 */ 355, 888, 1021, 909, 1063, 1063, 1063, 1063, 20, -19,
- /* 10 */ 66, 66, 170, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
- /* 20 */ -7, -7, 36, 73, 69, 27, 118, 222, 274, 326,
- /* 30 */ 378, 430, 482, 534, 589, 644, 696, 696, 696, 696,
- /* 40 */ 696, 696, 696, 696, 696, 696, 696, 696, 696, 696,
- /* 50 */ 696, 696, 696, 748, 696, 799, 849, 849, 980, 1063,
- /* 60 */ 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
- /* 70 */ 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
- /* 80 */ 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
- /* 90 */ 1083, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
- /* 100 */ 1063, 1063, 1063, 1063, -43, 1120, 1120, 1120, 1120, 1120,
- /* 110 */ -31, -72, -84, 242, 1152, 667, 210, 210, 242, 309,
- /* 120 */ 336, -55, 1566, 1566, 1566, 850, 850, 850, 626, 626,
- /* 130 */ 588, 588, 898, 221, 264, 242, 242, 242, 242, 242,
- /* 140 */ 242, 242, 242, 242, 242, 242, 242, 242, 242, 242,
- /* 150 */ 242, 242, 242, 242, 242, 496, 675, 289, 289, 336,
- /* 160 */ 0, 0, 0, 0, 0, 0, 1566, 1566, 1566, 570,
- /* 170 */ 98, 98, 958, 389, 450, 968, 1013, 1032, 1027, 242,
- /* 180 */ 242, 242, 242, 242, 242, 242, 242, 242, 242, 242,
- /* 190 */ 242, 242, 242, 242, 242, 1082, 1082, 1082, 242, 242,
- /* 200 */ 533, 242, 242, 242, 987, 242, 242, 1208, 242, 242,
- /* 210 */ 242, 242, 242, 242, 242, 242, 242, 242, 435, 531,
- /* 220 */ 1001, 1001, 1001, 832, 434, 1266, 594, 58, 863, 863,
- /* 230 */ 952, 58, 952, 946, 738, 239, 145, 863, 525, 145,
- /* 240 */ 145, 315, 647, 790, 1174, 1119, 1119, 1204, 1204, 1119,
- /* 250 */ 1250, 1232, 1147, 1263, 1263, 1263, 1263, 1119, 1265, 1147,
- /* 260 */ 1250, 1232, 1232, 1147, 1119, 1265, 1186, 1297, 1119, 1119,
- /* 270 */ 1265, 1372, 1119, 1265, 1119, 1265, 1372, 1294, 1294, 1294,
- /* 280 */ 1342, 1372, 1294, 1301, 1294, 1342, 1294, 1294, 1286, 1306,
- /* 290 */ 1286, 1306, 1286, 1306, 1286, 1306, 1119, 1398, 1119, 1285,
- /* 300 */ 1372, 1334, 1334, 1372, 1304, 1308, 1307, 1309, 1147, 1412,
- /* 310 */ 1413, 1428, 1428, 1439, 1439, 1439, 1566, 1566, 1566, 1566,
- /* 320 */ 1566, 1566, 1566, 1566, 204, 321, 429, 467, 578, 497,
- /* 330 */ 904, 739, 1051, 793, 794, 798, 800, 802, 838, 768,
- /* 340 */ 766, 801, 762, 847, 853, 812, 891, 681, 784, 896,
- /* 350 */ 864, 996, 1457, 1459, 1441, 1322, 1450, 1385, 1451, 1445,
- /* 360 */ 1446, 1350, 1340, 1361, 1352, 1453, 1353, 1461, 1478, 1357,
- /* 370 */ 1351, 1430, 1431, 1432, 1433, 1370, 1391, 1454, 1367, 1489,
- /* 380 */ 1486, 1470, 1386, 1355, 1429, 1471, 1434, 1424, 1458, 1393,
- /* 390 */ 1479, 1482, 1485, 1394, 1400, 1487, 1442, 1488, 1490, 1484,
- /* 400 */ 1491, 1448, 1483, 1493, 1452, 1480, 1496, 1497, 1498, 1499,
- /* 410 */ 1406, 1494, 1500, 1502, 1501, 1404, 1505, 1506, 1435, 1503,
- /* 420 */ 1508, 1408, 1507, 1504, 1509, 1510, 1511, 1507, 1513, 1516,
- /* 430 */ 1517, 1515, 1519, 1521, 1534, 1523, 1525, 1524, 1526, 1527,
- /* 440 */ 1529, 1530, 1526, 1532, 1531, 1533, 1535, 1537, 1427, 1438,
- /* 450 */ 1440, 1443, 1538, 1542, 1562,
+#define YY_SHIFT_COUNT (489)
+#define YY_SHIFT_MIN (0)
+#define YY_SHIFT_MAX (1637)
+static const unsigned short int yy_shift_ofst[] = {
+ /* 0 */ 990, 976, 1211, 837, 837, 316, 1054, 1054, 1054, 1054,
+ /* 10 */ 214, 0, 0, 106, 642, 1054, 1054, 1054, 1054, 1054,
+ /* 20 */ 1054, 1054, 1054, 952, 952, 226, 1155, 316, 316, 316,
+ /* 30 */ 316, 316, 316, 53, 159, 212, 265, 318, 371, 424,
+ /* 40 */ 477, 533, 589, 642, 642, 642, 642, 642, 642, 642,
+ /* 50 */ 642, 642, 642, 642, 642, 642, 642, 642, 642, 642,
+ /* 60 */ 695, 642, 747, 798, 798, 1004, 1054, 1054, 1054, 1054,
+ /* 70 */ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ /* 80 */ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ /* 90 */ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1112, 1054, 1054,
+ /* 100 */ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ /* 110 */ 1054, 856, 874, 874, 874, 874, 874, 134, 147, 93,
+ /* 120 */ 342, 959, 1161, 253, 253, 342, 367, 367, 367, 367,
+ /* 130 */ 179, 36, 79, 1657, 1657, 1657, 1061, 1061, 1061, 516,
+ /* 140 */ 799, 516, 516, 531, 531, 802, 249, 369, 342, 342,
+ /* 150 */ 342, 342, 342, 342, 342, 342, 342, 342, 342, 342,
+ /* 160 */ 342, 342, 342, 342, 342, 342, 342, 342, 342, 272,
+ /* 170 */ 442, 442, 536, 1657, 1657, 1657, 1025, 245, 245, 570,
+ /* 180 */ 172, 286, 805, 1047, 1140, 1220, 342, 342, 342, 342,
+ /* 190 */ 342, 342, 342, 342, 170, 342, 342, 342, 342, 342,
+ /* 200 */ 342, 342, 342, 342, 342, 342, 342, 841, 841, 841,
+ /* 210 */ 342, 342, 342, 342, 530, 342, 342, 342, 1059, 342,
+ /* 220 */ 342, 1167, 342, 342, 342, 342, 342, 342, 342, 342,
+ /* 230 */ 123, 688, 177, 1212, 1212, 1212, 1212, 1144, 177, 177,
+ /* 240 */ 1064, 409, 33, 628, 707, 707, 900, 628, 628, 900,
+ /* 250 */ 897, 323, 398, 677, 677, 677, 707, 572, 684, 590,
+ /* 260 */ 739, 1236, 1182, 1182, 1276, 1276, 1182, 1253, 1325, 1315,
+ /* 270 */ 1239, 1346, 1346, 1346, 1346, 1182, 1369, 1239, 1239, 1253,
+ /* 280 */ 1325, 1315, 1315, 1239, 1182, 1369, 1298, 1376, 1182, 1369,
+ /* 290 */ 1424, 1182, 1369, 1182, 1369, 1424, 1358, 1358, 1358, 1405,
+ /* 300 */ 1424, 1358, 1364, 1358, 1405, 1358, 1358, 1424, 1379, 1379,
+ /* 310 */ 1424, 1351, 1388, 1351, 1388, 1351, 1388, 1351, 1388, 1182,
+ /* 320 */ 1472, 1182, 1360, 1372, 1377, 1374, 1378, 1239, 1480, 1482,
+ /* 330 */ 1497, 1497, 1508, 1508, 1508, 1657, 1657, 1657, 1657, 1657,
+ /* 340 */ 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657,
+ /* 350 */ 1657, 20, 413, 98, 423, 519, 383, 962, 742, 61,
+ /* 360 */ 696, 749, 750, 753, 789, 790, 795, 797, 840, 842,
+ /* 370 */ 810, 668, 817, 659, 819, 849, 854, 899, 643, 745,
+ /* 380 */ 956, 926, 916, 1523, 1529, 1511, 1391, 1521, 1458, 1525,
+ /* 390 */ 1519, 1520, 1423, 1414, 1436, 1526, 1425, 1531, 1426, 1537,
+ /* 400 */ 1553, 1431, 1427, 1444, 1496, 1522, 1429, 1505, 1509, 1510,
+ /* 410 */ 1512, 1452, 1468, 1535, 1447, 1570, 1567, 1551, 1477, 1433,
+ /* 420 */ 1513, 1550, 1514, 1502, 1538, 1455, 1483, 1559, 1564, 1566,
+ /* 430 */ 1473, 1481, 1565, 1524, 1568, 1571, 1569, 1572, 1528, 1561,
+ /* 440 */ 1574, 1530, 1562, 1575, 1577, 1578, 1576, 1580, 1582, 1581,
+ /* 450 */ 1583, 1585, 1584, 1486, 1587, 1588, 1515, 1586, 1590, 1489,
+ /* 460 */ 1589, 1591, 1592, 1593, 1594, 1596, 1598, 1589, 1599, 1600,
+ /* 470 */ 1602, 1601, 1604, 1605, 1607, 1608, 1609, 1610, 1612, 1613,
+ /* 480 */ 1615, 1614, 1518, 1516, 1527, 1532, 1533, 1618, 1616, 1637,
};
-#define YY_REDUCE_USE_DFLT (-144)
-#define YY_REDUCE_COUNT (323)
-#define YY_REDUCE_MIN (-143)
-#define YY_REDUCE_MAX (1305)
+#define YY_REDUCE_COUNT (350)
+#define YY_REDUCE_MIN (-225)
+#define YY_REDUCE_MAX (1375)
static const short yy_reduce_ofst[] = {
- /* 0 */ -143, -65, 140, 840, 76, 180, 182, 233, 488, -25,
- /* 10 */ 12, 16, 59, 885, 907, 935, 390, 705, 954, 285,
- /* 20 */ 997, 1017, 1018, -118, 1025, 139, 171, 171, 171, 171,
- /* 30 */ 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- /* 40 */ 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- /* 50 */ 171, 171, 171, 171, 171, 171, 171, 171, -69, 287,
- /* 60 */ 441, 658, 708, 856, 1050, 1073, 1076, 1079, 1081, 1084,
- /* 70 */ 1086, 1088, 1091, 1113, 1115, 1117, 1122, 1124, 1126, 1128,
- /* 80 */ 1130, 1141, 1153, 1156, 1159, 1163, 1165, 1167, 1170, 1172,
- /* 90 */ 1175, 1178, 1181, 1189, 1194, 1197, 1200, 1203, 1205, 1207,
- /* 100 */ 1211, 1213, 1216, 1219, 171, 171, 171, 171, 171, 171,
- /* 110 */ 171, 171, 171, 49, 176, 220, 275, 278, 290, 171,
- /* 120 */ 300, 171, 171, 171, 171, -85, -85, -85, -28, 77,
- /* 130 */ 313, 317, -56, 252, 252, 446, -129, 243, 361, 403,
- /* 140 */ 406, 513, 517, 409, 502, 518, 504, 509, 621, 553,
- /* 150 */ 562, 619, 559, 93, 620, 465, 453, 550, 591, 571,
- /* 160 */ 615, 666, 750, 752, 797, 819, 463, 548, -73, 28,
- /* 170 */ 68, 120, 257, 206, 359, 405, 413, 452, 457, 560,
- /* 180 */ 566, 617, 670, 720, 723, 769, 773, 775, 780, 813,
- /* 190 */ 814, 821, 822, 823, 826, 360, 436, 783, 829, 835,
- /* 200 */ 707, 862, 867, 878, 830, 911, 915, 883, 936, 937,
- /* 210 */ 940, 359, 942, 943, 944, 979, 982, 984, 886, 899,
- /* 220 */ 928, 929, 931, 707, 947, 945, 998, 949, 932, 969,
- /* 230 */ 918, 953, 924, 992, 1005, 1010, 1016, 971, 965, 1019,
- /* 240 */ 1049, 1000, 1028, 1074, 989, 1078, 1080, 1026, 1031, 1109,
- /* 250 */ 1053, 1090, 1103, 1092, 1099, 1114, 1118, 1148, 1151, 1111,
- /* 260 */ 1096, 1129, 1131, 1133, 1162, 1202, 1138, 1146, 1231, 1234,
- /* 270 */ 1206, 1218, 1237, 1239, 1240, 1242, 1221, 1228, 1229, 1230,
- /* 280 */ 1224, 1233, 1235, 1236, 1241, 1226, 1243, 1244, 1198, 1201,
- /* 290 */ 1209, 1212, 1210, 1214, 1215, 1217, 1260, 1199, 1262, 1220,
- /* 300 */ 1247, 1222, 1223, 1253, 1238, 1245, 1251, 1246, 1249, 1276,
- /* 310 */ 1279, 1289, 1291, 1296, 1302, 1305, 1225, 1227, 1248, 1290,
- /* 320 */ 1292, 1280, 1281, 1295,
+ /* 0 */ -137, -31, 1104, 1023, 1081, -132, -40, -38, 223, 225,
+ /* 10 */ 698, -153, -99, -225, -165, 386, 478, 843, 859, -139,
+ /* 20 */ 884, 117, 277, 844, 857, 964, 559, 561, 614, 918,
+ /* 30 */ 1009, 1089, 1098, -222, -222, -222, -222, -222, -222, -222,
+ /* 40 */ -222, -222, -222, -222, -222, -222, -222, -222, -222, -222,
+ /* 50 */ -222, -222, -222, -222, -222, -222, -222, -222, -222, -222,
+ /* 60 */ -222, -222, -222, -222, -222, 329, 331, 497, 654, 656,
+ /* 70 */ 781, 891, 946, 1029, 1129, 1134, 1149, 1154, 1160, 1162,
+ /* 80 */ 1164, 1168, 1174, 1177, 1188, 1191, 1193, 1202, 1204, 1206,
+ /* 90 */ 1208, 1216, 1218, 1221, 1231, 1233, 1235, 1241, 1244, 1246,
+ /* 100 */ 1248, 1250, 1258, 1260, 1275, 1277, 1283, 1286, 1288, 1290,
+ /* 110 */ 1292, -222, -222, -222, -222, -222, -222, -222, -222, -222,
+ /* 120 */ -115, 796, -156, -154, -141, 14, 242, 349, 242, 349,
+ /* 130 */ -61, -222, -222, -222, -222, -222, 101, 101, 101, 332,
+ /* 140 */ 302, 384, 387, -170, 146, 344, 196, 196, 15, 11,
+ /* 150 */ 183, 235, 395, 355, 396, 406, 452, 457, 391, 459,
+ /* 160 */ 443, 447, 511, 495, 454, 512, 505, 571, 498, 532,
+ /* 170 */ 431, 435, 339, 455, 446, 508, -174, -116, -97, -120,
+ /* 180 */ -150, 64, 176, 330, 337, 509, 569, 611, 653, 673,
+ /* 190 */ 714, 717, 763, 771, -34, 779, 786, 830, 846, 860,
+ /* 200 */ 866, 882, 883, 890, 892, 895, 902, 319, 368, 769,
+ /* 210 */ 915, 924, 925, 932, 755, 936, 945, 963, 782, 969,
+ /* 220 */ 974, 816, 977, 64, 982, 983, 1016, 1022, 1024, 1031,
+ /* 230 */ 870, 831, 913, 966, 973, 981, 984, 755, 913, 913,
+ /* 240 */ 1000, 1041, 1063, 1015, 1010, 1011, 985, 1034, 1057, 1019,
+ /* 250 */ 1086, 1080, 1085, 1093, 1095, 1096, 1067, 1048, 1082, 1099,
+ /* 260 */ 1137, 1050, 1150, 1156, 1077, 1088, 1180, 1120, 1132, 1169,
+ /* 270 */ 1170, 1178, 1181, 1195, 1210, 1225, 1243, 1197, 1209, 1173,
+ /* 280 */ 1190, 1226, 1238, 1223, 1267, 1272, 1199, 1207, 1282, 1285,
+ /* 290 */ 1269, 1293, 1295, 1296, 1300, 1289, 1294, 1297, 1299, 1287,
+ /* 300 */ 1301, 1302, 1303, 1306, 1304, 1307, 1308, 1310, 1242, 1245,
+ /* 310 */ 1311, 1268, 1270, 1273, 1278, 1274, 1279, 1280, 1284, 1333,
+ /* 320 */ 1271, 1337, 1281, 1309, 1305, 1312, 1314, 1316, 1344, 1347,
+ /* 330 */ 1359, 1361, 1368, 1370, 1371, 1291, 1313, 1317, 1355, 1352,
+ /* 340 */ 1353, 1354, 1356, 1363, 1350, 1357, 1362, 1366, 1367, 1375,
+ /* 350 */ 1365,
};
static const YYACTIONTYPE yy_default[] = {
- /* 0 */ 1270, 1260, 1260, 1260, 1193, 1193, 1193, 1193, 1260, 1088,
- /* 10 */ 1117, 1117, 1244, 1322, 1322, 1322, 1322, 1322, 1322, 1192,
- /* 20 */ 1322, 1322, 1322, 1322, 1260, 1092, 1123, 1322, 1322, 1322,
- /* 30 */ 1322, 1194, 1195, 1322, 1322, 1322, 1243, 1245, 1133, 1132,
- /* 40 */ 1131, 1130, 1226, 1104, 1128, 1121, 1125, 1194, 1188, 1189,
- /* 50 */ 1187, 1191, 1195, 1322, 1124, 1158, 1172, 1157, 1322, 1322,
- /* 60 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 70 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 80 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 90 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 100 */ 1322, 1322, 1322, 1322, 1166, 1171, 1178, 1170, 1167, 1160,
- /* 110 */ 1159, 1161, 1162, 1322, 1011, 1059, 1322, 1322, 1322, 1163,
- /* 120 */ 1322, 1164, 1175, 1174, 1173, 1251, 1278, 1277, 1322, 1322,
- /* 130 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 140 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 150 */ 1322, 1322, 1322, 1322, 1322, 1270, 1260, 1017, 1017, 1322,
- /* 160 */ 1260, 1260, 1260, 1260, 1260, 1260, 1256, 1092, 1083, 1322,
- /* 170 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 180 */ 1248, 1246, 1322, 1208, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 190 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 200 */ 1322, 1322, 1322, 1322, 1088, 1322, 1322, 1322, 1322, 1322,
- /* 210 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1272, 1322, 1221,
- /* 220 */ 1088, 1088, 1088, 1090, 1072, 1082, 997, 1127, 1106, 1106,
- /* 230 */ 1311, 1127, 1311, 1034, 1292, 1031, 1117, 1106, 1190, 1117,
- /* 240 */ 1117, 1089, 1082, 1322, 1314, 1097, 1097, 1313, 1313, 1097,
- /* 250 */ 1138, 1062, 1127, 1068, 1068, 1068, 1068, 1097, 1008, 1127,
- /* 260 */ 1138, 1062, 1062, 1127, 1097, 1008, 1225, 1308, 1097, 1097,
- /* 270 */ 1008, 1201, 1097, 1008, 1097, 1008, 1201, 1060, 1060, 1060,
- /* 280 */ 1049, 1201, 1060, 1034, 1060, 1049, 1060, 1060, 1110, 1105,
- /* 290 */ 1110, 1105, 1110, 1105, 1110, 1105, 1097, 1196, 1097, 1322,
- /* 300 */ 1201, 1205, 1205, 1201, 1122, 1111, 1120, 1118, 1127, 1014,
- /* 310 */ 1052, 1275, 1275, 1271, 1271, 1271, 1319, 1319, 1256, 1287,
- /* 320 */ 1287, 1036, 1036, 1287, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 330 */ 1282, 1322, 1210, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 340 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 350 */ 1322, 1143, 1322, 993, 1253, 1322, 1322, 1252, 1322, 1322,
- /* 360 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 370 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1310, 1322,
- /* 380 */ 1322, 1322, 1322, 1322, 1322, 1224, 1223, 1322, 1322, 1322,
- /* 390 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 400 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 410 */ 1074, 1322, 1322, 1322, 1296, 1322, 1322, 1322, 1322, 1322,
- /* 420 */ 1322, 1322, 1119, 1322, 1112, 1322, 1322, 1301, 1322, 1322,
- /* 430 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1262, 1322,
- /* 440 */ 1322, 1322, 1261, 1322, 1322, 1322, 1322, 1322, 1145, 1322,
- /* 450 */ 1144, 1148, 1322, 1002, 1322,
+ /* 0 */ 1389, 1389, 1389, 1261, 1046, 1151, 1261, 1261, 1261, 1261,
+ /* 10 */ 1046, 1181, 1181, 1312, 1077, 1046, 1046, 1046, 1046, 1046,
+ /* 20 */ 1046, 1260, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
+ /* 30 */ 1046, 1046, 1046, 1187, 1046, 1046, 1046, 1046, 1262, 1263,
+ /* 40 */ 1046, 1046, 1046, 1311, 1313, 1197, 1196, 1195, 1194, 1294,
+ /* 50 */ 1168, 1192, 1185, 1189, 1256, 1257, 1255, 1259, 1262, 1263,
+ /* 60 */ 1046, 1188, 1226, 1240, 1225, 1046, 1046, 1046, 1046, 1046,
+ /* 70 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
+ /* 80 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
+ /* 90 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
+ /* 100 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
+ /* 110 */ 1046, 1234, 1239, 1246, 1238, 1235, 1228, 1227, 1229, 1230,
+ /* 120 */ 1046, 1067, 1116, 1046, 1046, 1046, 1329, 1328, 1046, 1046,
+ /* 130 */ 1077, 1231, 1232, 1243, 1242, 1241, 1319, 1345, 1344, 1046,
+ /* 140 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
+ /* 150 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
+ /* 160 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1077,
+ /* 170 */ 1073, 1073, 1046, 1324, 1151, 1142, 1046, 1046, 1046, 1046,
+ /* 180 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1316, 1314, 1046,
+ /* 190 */ 1276, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
+ /* 200 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
+ /* 210 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1147, 1046,
+ /* 220 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1339,
+ /* 230 */ 1046, 1289, 1130, 1147, 1147, 1147, 1147, 1149, 1131, 1129,
+ /* 240 */ 1141, 1077, 1053, 1191, 1170, 1170, 1378, 1191, 1191, 1378,
+ /* 250 */ 1091, 1359, 1088, 1181, 1181, 1181, 1170, 1258, 1148, 1141,
+ /* 260 */ 1046, 1381, 1156, 1156, 1380, 1380, 1156, 1200, 1206, 1119,
+ /* 270 */ 1191, 1125, 1125, 1125, 1125, 1156, 1064, 1191, 1191, 1200,
+ /* 280 */ 1206, 1119, 1119, 1191, 1156, 1064, 1293, 1375, 1156, 1064,
+ /* 290 */ 1269, 1156, 1064, 1156, 1064, 1269, 1117, 1117, 1117, 1106,
+ /* 300 */ 1269, 1117, 1091, 1117, 1106, 1117, 1117, 1269, 1273, 1273,
+ /* 310 */ 1269, 1174, 1169, 1174, 1169, 1174, 1169, 1174, 1169, 1156,
+ /* 320 */ 1264, 1156, 1046, 1186, 1175, 1184, 1182, 1191, 1070, 1109,
+ /* 330 */ 1342, 1342, 1338, 1338, 1338, 1386, 1386, 1324, 1354, 1077,
+ /* 340 */ 1077, 1077, 1077, 1354, 1093, 1093, 1077, 1077, 1077, 1077,
+ /* 350 */ 1354, 1046, 1046, 1046, 1046, 1046, 1046, 1349, 1046, 1278,
+ /* 360 */ 1160, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
+ /* 370 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
+ /* 380 */ 1046, 1046, 1211, 1046, 1049, 1321, 1046, 1046, 1320, 1046,
+ /* 390 */ 1046, 1046, 1046, 1046, 1046, 1161, 1046, 1046, 1046, 1046,
+ /* 400 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
+ /* 410 */ 1046, 1046, 1046, 1046, 1377, 1046, 1046, 1046, 1046, 1046,
+ /* 420 */ 1046, 1292, 1291, 1046, 1046, 1158, 1046, 1046, 1046, 1046,
+ /* 430 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
+ /* 440 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
+ /* 450 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
+ /* 460 */ 1183, 1046, 1176, 1046, 1046, 1046, 1046, 1368, 1046, 1046,
+ /* 470 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
+ /* 480 */ 1046, 1363, 1133, 1213, 1046, 1212, 1216, 1046, 1058, 1046,
};
/********** End of lemon-generated parsing tables *****************************/
@@ -137844,6 +142297,7 @@ static const YYCODETYPE yyFallback[] = {
0, /* ESCAPE => nothing */
0, /* ID => nothing */
59, /* COLUMNKW => ID */
+ 59, /* DO => ID */
59, /* FOR => ID */
59, /* IGNORE => ID */
59, /* INITIALLY => ID */
@@ -137905,6 +142359,7 @@ struct yyParser {
int yyerrcnt; /* Shifts left before out of the error */
#endif
sqlite3ParserARG_SDECL /* A place to hold %extra_argument */
+ sqlite3ParserCTX_SDECL /* A place to hold %extra_context */
#if YYSTACKDEPTH<=0
int yystksz; /* Current side of the stack */
yyStackEntry *yystack; /* The parser's stack */
@@ -137948,75 +142403,267 @@ SQLITE_PRIVATE void sqlite3ParserTrace(FILE *TraceFILE, char *zTracePrompt){
}
#endif /* NDEBUG */
-#ifndef NDEBUG
+#if defined(YYCOVERAGE) || !defined(NDEBUG)
/* For tracing shifts, the names of all terminals and nonterminals
** are required. The following table supplies these names */
static const char *const yyTokenName[] = {
- "$", "SEMI", "EXPLAIN", "QUERY",
- "PLAN", "BEGIN", "TRANSACTION", "DEFERRED",
- "IMMEDIATE", "EXCLUSIVE", "COMMIT", "END",
- "ROLLBACK", "SAVEPOINT", "RELEASE", "TO",
- "TABLE", "CREATE", "IF", "NOT",
- "EXISTS", "TEMP", "LP", "RP",
- "AS", "WITHOUT", "COMMA", "ABORT",
- "ACTION", "AFTER", "ANALYZE", "ASC",
- "ATTACH", "BEFORE", "BY", "CASCADE",
- "CAST", "CONFLICT", "DATABASE", "DESC",
- "DETACH", "EACH", "FAIL", "OR",
- "AND", "IS", "MATCH", "LIKE_KW",
- "BETWEEN", "IN", "ISNULL", "NOTNULL",
- "NE", "EQ", "GT", "LE",
- "LT", "GE", "ESCAPE", "ID",
- "COLUMNKW", "FOR", "IGNORE", "INITIALLY",
- "INSTEAD", "NO", "KEY", "OF",
- "OFFSET", "PRAGMA", "RAISE", "RECURSIVE",
- "REPLACE", "RESTRICT", "ROW", "TRIGGER",
- "VACUUM", "VIEW", "VIRTUAL", "WITH",
- "REINDEX", "RENAME", "CTIME_KW", "ANY",
- "BITAND", "BITOR", "LSHIFT", "RSHIFT",
- "PLUS", "MINUS", "STAR", "SLASH",
- "REM", "CONCAT", "COLLATE", "BITNOT",
- "INDEXED", "STRING", "JOIN_KW", "CONSTRAINT",
- "DEFAULT", "NULL", "PRIMARY", "UNIQUE",
- "CHECK", "REFERENCES", "AUTOINCR", "ON",
- "INSERT", "DELETE", "UPDATE", "SET",
- "DEFERRABLE", "FOREIGN", "DROP", "UNION",
- "ALL", "EXCEPT", "INTERSECT", "SELECT",
- "VALUES", "DISTINCT", "DOT", "FROM",
- "JOIN", "USING", "ORDER", "GROUP",
- "HAVING", "LIMIT", "WHERE", "INTO",
- "FLOAT", "BLOB", "INTEGER", "VARIABLE",
- "CASE", "WHEN", "THEN", "ELSE",
- "INDEX", "ALTER", "ADD", "error",
- "input", "cmdlist", "ecmd", "explain",
- "cmdx", "cmd", "transtype", "trans_opt",
- "nm", "savepoint_opt", "create_table", "create_table_args",
- "createkw", "temp", "ifnotexists", "dbnm",
- "columnlist", "conslist_opt", "table_options", "select",
- "columnname", "carglist", "typetoken", "typename",
- "signed", "plus_num", "minus_num", "ccons",
- "term", "expr", "onconf", "sortorder",
- "autoinc", "eidlist_opt", "refargs", "defer_subclause",
- "refarg", "refact", "init_deferred_pred_opt", "conslist",
- "tconscomma", "tcons", "sortlist", "eidlist",
- "defer_subclause_opt", "orconf", "resolvetype", "raisetype",
- "ifexists", "fullname", "selectnowith", "oneselect",
- "with", "multiselect_op", "distinct", "selcollist",
- "from", "where_opt", "groupby_opt", "having_opt",
- "orderby_opt", "limit_opt", "values", "nexprlist",
- "exprlist", "sclp", "as", "seltablist",
- "stl_prefix", "joinop", "indexed_opt", "on_opt",
- "using_opt", "idlist", "setlist", "insert_cmd",
- "idlist_opt", "likeop", "between_op", "in_op",
- "paren_exprlist", "case_operand", "case_exprlist", "case_else",
- "uniqueflag", "collate", "nmnum", "trigger_decl",
- "trigger_cmd_list", "trigger_time", "trigger_event", "foreach_clause",
- "when_clause", "trigger_cmd", "trnm", "tridxby",
- "database_kw_opt", "key_opt", "add_column_fullname", "kwcolumn_opt",
- "create_vtab", "vtabarglist", "vtabarg", "vtabargtoken",
- "lp", "anylist", "wqlist",
+ /* 0 */ "$",
+ /* 1 */ "SEMI",
+ /* 2 */ "EXPLAIN",
+ /* 3 */ "QUERY",
+ /* 4 */ "PLAN",
+ /* 5 */ "BEGIN",
+ /* 6 */ "TRANSACTION",
+ /* 7 */ "DEFERRED",
+ /* 8 */ "IMMEDIATE",
+ /* 9 */ "EXCLUSIVE",
+ /* 10 */ "COMMIT",
+ /* 11 */ "END",
+ /* 12 */ "ROLLBACK",
+ /* 13 */ "SAVEPOINT",
+ /* 14 */ "RELEASE",
+ /* 15 */ "TO",
+ /* 16 */ "TABLE",
+ /* 17 */ "CREATE",
+ /* 18 */ "IF",
+ /* 19 */ "NOT",
+ /* 20 */ "EXISTS",
+ /* 21 */ "TEMP",
+ /* 22 */ "LP",
+ /* 23 */ "RP",
+ /* 24 */ "AS",
+ /* 25 */ "WITHOUT",
+ /* 26 */ "COMMA",
+ /* 27 */ "ABORT",
+ /* 28 */ "ACTION",
+ /* 29 */ "AFTER",
+ /* 30 */ "ANALYZE",
+ /* 31 */ "ASC",
+ /* 32 */ "ATTACH",
+ /* 33 */ "BEFORE",
+ /* 34 */ "BY",
+ /* 35 */ "CASCADE",
+ /* 36 */ "CAST",
+ /* 37 */ "CONFLICT",
+ /* 38 */ "DATABASE",
+ /* 39 */ "DESC",
+ /* 40 */ "DETACH",
+ /* 41 */ "EACH",
+ /* 42 */ "FAIL",
+ /* 43 */ "OR",
+ /* 44 */ "AND",
+ /* 45 */ "IS",
+ /* 46 */ "MATCH",
+ /* 47 */ "LIKE_KW",
+ /* 48 */ "BETWEEN",
+ /* 49 */ "IN",
+ /* 50 */ "ISNULL",
+ /* 51 */ "NOTNULL",
+ /* 52 */ "NE",
+ /* 53 */ "EQ",
+ /* 54 */ "GT",
+ /* 55 */ "LE",
+ /* 56 */ "LT",
+ /* 57 */ "GE",
+ /* 58 */ "ESCAPE",
+ /* 59 */ "ID",
+ /* 60 */ "COLUMNKW",
+ /* 61 */ "DO",
+ /* 62 */ "FOR",
+ /* 63 */ "IGNORE",
+ /* 64 */ "INITIALLY",
+ /* 65 */ "INSTEAD",
+ /* 66 */ "NO",
+ /* 67 */ "KEY",
+ /* 68 */ "OF",
+ /* 69 */ "OFFSET",
+ /* 70 */ "PRAGMA",
+ /* 71 */ "RAISE",
+ /* 72 */ "RECURSIVE",
+ /* 73 */ "REPLACE",
+ /* 74 */ "RESTRICT",
+ /* 75 */ "ROW",
+ /* 76 */ "TRIGGER",
+ /* 77 */ "VACUUM",
+ /* 78 */ "VIEW",
+ /* 79 */ "VIRTUAL",
+ /* 80 */ "WITH",
+ /* 81 */ "REINDEX",
+ /* 82 */ "RENAME",
+ /* 83 */ "CTIME_KW",
+ /* 84 */ "ANY",
+ /* 85 */ "BITAND",
+ /* 86 */ "BITOR",
+ /* 87 */ "LSHIFT",
+ /* 88 */ "RSHIFT",
+ /* 89 */ "PLUS",
+ /* 90 */ "MINUS",
+ /* 91 */ "STAR",
+ /* 92 */ "SLASH",
+ /* 93 */ "REM",
+ /* 94 */ "CONCAT",
+ /* 95 */ "COLLATE",
+ /* 96 */ "BITNOT",
+ /* 97 */ "ON",
+ /* 98 */ "INDEXED",
+ /* 99 */ "STRING",
+ /* 100 */ "JOIN_KW",
+ /* 101 */ "CONSTRAINT",
+ /* 102 */ "DEFAULT",
+ /* 103 */ "NULL",
+ /* 104 */ "PRIMARY",
+ /* 105 */ "UNIQUE",
+ /* 106 */ "CHECK",
+ /* 107 */ "REFERENCES",
+ /* 108 */ "AUTOINCR",
+ /* 109 */ "INSERT",
+ /* 110 */ "DELETE",
+ /* 111 */ "UPDATE",
+ /* 112 */ "SET",
+ /* 113 */ "DEFERRABLE",
+ /* 114 */ "FOREIGN",
+ /* 115 */ "DROP",
+ /* 116 */ "UNION",
+ /* 117 */ "ALL",
+ /* 118 */ "EXCEPT",
+ /* 119 */ "INTERSECT",
+ /* 120 */ "SELECT",
+ /* 121 */ "VALUES",
+ /* 122 */ "DISTINCT",
+ /* 123 */ "DOT",
+ /* 124 */ "FROM",
+ /* 125 */ "JOIN",
+ /* 126 */ "USING",
+ /* 127 */ "ORDER",
+ /* 128 */ "GROUP",
+ /* 129 */ "HAVING",
+ /* 130 */ "LIMIT",
+ /* 131 */ "WHERE",
+ /* 132 */ "INTO",
+ /* 133 */ "NOTHING",
+ /* 134 */ "FLOAT",
+ /* 135 */ "BLOB",
+ /* 136 */ "INTEGER",
+ /* 137 */ "VARIABLE",
+ /* 138 */ "CASE",
+ /* 139 */ "WHEN",
+ /* 140 */ "THEN",
+ /* 141 */ "ELSE",
+ /* 142 */ "INDEX",
+ /* 143 */ "ALTER",
+ /* 144 */ "ADD",
+ /* 145 */ "input",
+ /* 146 */ "cmdlist",
+ /* 147 */ "ecmd",
+ /* 148 */ "cmdx",
+ /* 149 */ "explain",
+ /* 150 */ "cmd",
+ /* 151 */ "transtype",
+ /* 152 */ "trans_opt",
+ /* 153 */ "nm",
+ /* 154 */ "savepoint_opt",
+ /* 155 */ "create_table",
+ /* 156 */ "create_table_args",
+ /* 157 */ "createkw",
+ /* 158 */ "temp",
+ /* 159 */ "ifnotexists",
+ /* 160 */ "dbnm",
+ /* 161 */ "columnlist",
+ /* 162 */ "conslist_opt",
+ /* 163 */ "table_options",
+ /* 164 */ "select",
+ /* 165 */ "columnname",
+ /* 166 */ "carglist",
+ /* 167 */ "typetoken",
+ /* 168 */ "typename",
+ /* 169 */ "signed",
+ /* 170 */ "plus_num",
+ /* 171 */ "minus_num",
+ /* 172 */ "scanpt",
+ /* 173 */ "ccons",
+ /* 174 */ "term",
+ /* 175 */ "expr",
+ /* 176 */ "onconf",
+ /* 177 */ "sortorder",
+ /* 178 */ "autoinc",
+ /* 179 */ "eidlist_opt",
+ /* 180 */ "refargs",
+ /* 181 */ "defer_subclause",
+ /* 182 */ "refarg",
+ /* 183 */ "refact",
+ /* 184 */ "init_deferred_pred_opt",
+ /* 185 */ "conslist",
+ /* 186 */ "tconscomma",
+ /* 187 */ "tcons",
+ /* 188 */ "sortlist",
+ /* 189 */ "eidlist",
+ /* 190 */ "defer_subclause_opt",
+ /* 191 */ "orconf",
+ /* 192 */ "resolvetype",
+ /* 193 */ "raisetype",
+ /* 194 */ "ifexists",
+ /* 195 */ "fullname",
+ /* 196 */ "selectnowith",
+ /* 197 */ "oneselect",
+ /* 198 */ "wqlist",
+ /* 199 */ "multiselect_op",
+ /* 200 */ "distinct",
+ /* 201 */ "selcollist",
+ /* 202 */ "from",
+ /* 203 */ "where_opt",
+ /* 204 */ "groupby_opt",
+ /* 205 */ "having_opt",
+ /* 206 */ "orderby_opt",
+ /* 207 */ "limit_opt",
+ /* 208 */ "values",
+ /* 209 */ "nexprlist",
+ /* 210 */ "exprlist",
+ /* 211 */ "sclp",
+ /* 212 */ "as",
+ /* 213 */ "seltablist",
+ /* 214 */ "stl_prefix",
+ /* 215 */ "joinop",
+ /* 216 */ "indexed_opt",
+ /* 217 */ "on_opt",
+ /* 218 */ "using_opt",
+ /* 219 */ "xfullname",
+ /* 220 */ "idlist",
+ /* 221 */ "with",
+ /* 222 */ "setlist",
+ /* 223 */ "insert_cmd",
+ /* 224 */ "idlist_opt",
+ /* 225 */ "upsert",
+ /* 226 */ "likeop",
+ /* 227 */ "between_op",
+ /* 228 */ "in_op",
+ /* 229 */ "paren_exprlist",
+ /* 230 */ "case_operand",
+ /* 231 */ "case_exprlist",
+ /* 232 */ "case_else",
+ /* 233 */ "uniqueflag",
+ /* 234 */ "collate",
+ /* 235 */ "nmnum",
+ /* 236 */ "trigger_decl",
+ /* 237 */ "trigger_cmd_list",
+ /* 238 */ "trigger_time",
+ /* 239 */ "trigger_event",
+ /* 240 */ "foreach_clause",
+ /* 241 */ "when_clause",
+ /* 242 */ "trigger_cmd",
+ /* 243 */ "trnm",
+ /* 244 */ "tridxby",
+ /* 245 */ "database_kw_opt",
+ /* 246 */ "key_opt",
+ /* 247 */ "add_column_fullname",
+ /* 248 */ "kwcolumn_opt",
+ /* 249 */ "create_vtab",
+ /* 250 */ "vtabarglist",
+ /* 251 */ "vtabarg",
+ /* 252 */ "vtabargtoken",
+ /* 253 */ "lp",
+ /* 254 */ "anylist",
};
-#endif /* NDEBUG */
+#endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */
#ifndef NDEBUG
/* For tracing reduce actions, the names of all rules are required.
@@ -138050,307 +142697,319 @@ static const char *const yyRuleName[] = {
/* 25 */ "typetoken ::= typename LP signed RP",
/* 26 */ "typetoken ::= typename LP signed COMMA signed RP",
/* 27 */ "typename ::= typename ID|STRING",
- /* 28 */ "ccons ::= CONSTRAINT nm",
- /* 29 */ "ccons ::= DEFAULT term",
- /* 30 */ "ccons ::= DEFAULT LP expr RP",
- /* 31 */ "ccons ::= DEFAULT PLUS term",
- /* 32 */ "ccons ::= DEFAULT MINUS term",
- /* 33 */ "ccons ::= DEFAULT ID|INDEXED",
- /* 34 */ "ccons ::= NOT NULL onconf",
- /* 35 */ "ccons ::= PRIMARY KEY sortorder onconf autoinc",
- /* 36 */ "ccons ::= UNIQUE onconf",
- /* 37 */ "ccons ::= CHECK LP expr RP",
- /* 38 */ "ccons ::= REFERENCES nm eidlist_opt refargs",
- /* 39 */ "ccons ::= defer_subclause",
- /* 40 */ "ccons ::= COLLATE ID|STRING",
- /* 41 */ "autoinc ::=",
- /* 42 */ "autoinc ::= AUTOINCR",
- /* 43 */ "refargs ::=",
- /* 44 */ "refargs ::= refargs refarg",
- /* 45 */ "refarg ::= MATCH nm",
- /* 46 */ "refarg ::= ON INSERT refact",
- /* 47 */ "refarg ::= ON DELETE refact",
- /* 48 */ "refarg ::= ON UPDATE refact",
- /* 49 */ "refact ::= SET NULL",
- /* 50 */ "refact ::= SET DEFAULT",
- /* 51 */ "refact ::= CASCADE",
- /* 52 */ "refact ::= RESTRICT",
- /* 53 */ "refact ::= NO ACTION",
- /* 54 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt",
- /* 55 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt",
- /* 56 */ "init_deferred_pred_opt ::=",
- /* 57 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED",
- /* 58 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE",
- /* 59 */ "conslist_opt ::=",
- /* 60 */ "tconscomma ::= COMMA",
- /* 61 */ "tcons ::= CONSTRAINT nm",
- /* 62 */ "tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf",
- /* 63 */ "tcons ::= UNIQUE LP sortlist RP onconf",
- /* 64 */ "tcons ::= CHECK LP expr RP onconf",
- /* 65 */ "tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt",
- /* 66 */ "defer_subclause_opt ::=",
- /* 67 */ "onconf ::=",
- /* 68 */ "onconf ::= ON CONFLICT resolvetype",
- /* 69 */ "orconf ::=",
- /* 70 */ "orconf ::= OR resolvetype",
- /* 71 */ "resolvetype ::= IGNORE",
- /* 72 */ "resolvetype ::= REPLACE",
- /* 73 */ "cmd ::= DROP TABLE ifexists fullname",
- /* 74 */ "ifexists ::= IF EXISTS",
- /* 75 */ "ifexists ::=",
- /* 76 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select",
- /* 77 */ "cmd ::= DROP VIEW ifexists fullname",
- /* 78 */ "cmd ::= select",
- /* 79 */ "select ::= with selectnowith",
- /* 80 */ "selectnowith ::= selectnowith multiselect_op oneselect",
- /* 81 */ "multiselect_op ::= UNION",
- /* 82 */ "multiselect_op ::= UNION ALL",
- /* 83 */ "multiselect_op ::= EXCEPT|INTERSECT",
- /* 84 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt",
- /* 85 */ "values ::= VALUES LP nexprlist RP",
- /* 86 */ "values ::= values COMMA LP exprlist RP",
- /* 87 */ "distinct ::= DISTINCT",
- /* 88 */ "distinct ::= ALL",
- /* 89 */ "distinct ::=",
- /* 90 */ "sclp ::=",
- /* 91 */ "selcollist ::= sclp expr as",
- /* 92 */ "selcollist ::= sclp STAR",
- /* 93 */ "selcollist ::= sclp nm DOT STAR",
- /* 94 */ "as ::= AS nm",
- /* 95 */ "as ::=",
- /* 96 */ "from ::=",
- /* 97 */ "from ::= FROM seltablist",
- /* 98 */ "stl_prefix ::= seltablist joinop",
- /* 99 */ "stl_prefix ::=",
- /* 100 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt",
- /* 101 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt",
- /* 102 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt",
- /* 103 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt",
- /* 104 */ "dbnm ::=",
- /* 105 */ "dbnm ::= DOT nm",
- /* 106 */ "fullname ::= nm dbnm",
- /* 107 */ "joinop ::= COMMA|JOIN",
- /* 108 */ "joinop ::= JOIN_KW JOIN",
- /* 109 */ "joinop ::= JOIN_KW nm JOIN",
- /* 110 */ "joinop ::= JOIN_KW nm nm JOIN",
- /* 111 */ "on_opt ::= ON expr",
- /* 112 */ "on_opt ::=",
- /* 113 */ "indexed_opt ::=",
- /* 114 */ "indexed_opt ::= INDEXED BY nm",
- /* 115 */ "indexed_opt ::= NOT INDEXED",
- /* 116 */ "using_opt ::= USING LP idlist RP",
- /* 117 */ "using_opt ::=",
- /* 118 */ "orderby_opt ::=",
- /* 119 */ "orderby_opt ::= ORDER BY sortlist",
- /* 120 */ "sortlist ::= sortlist COMMA expr sortorder",
- /* 121 */ "sortlist ::= expr sortorder",
- /* 122 */ "sortorder ::= ASC",
- /* 123 */ "sortorder ::= DESC",
- /* 124 */ "sortorder ::=",
- /* 125 */ "groupby_opt ::=",
- /* 126 */ "groupby_opt ::= GROUP BY nexprlist",
- /* 127 */ "having_opt ::=",
- /* 128 */ "having_opt ::= HAVING expr",
- /* 129 */ "limit_opt ::=",
- /* 130 */ "limit_opt ::= LIMIT expr",
- /* 131 */ "limit_opt ::= LIMIT expr OFFSET expr",
- /* 132 */ "limit_opt ::= LIMIT expr COMMA expr",
- /* 133 */ "cmd ::= with DELETE FROM fullname indexed_opt where_opt",
- /* 134 */ "where_opt ::=",
- /* 135 */ "where_opt ::= WHERE expr",
- /* 136 */ "cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt",
- /* 137 */ "setlist ::= setlist COMMA nm EQ expr",
- /* 138 */ "setlist ::= setlist COMMA LP idlist RP EQ expr",
- /* 139 */ "setlist ::= nm EQ expr",
- /* 140 */ "setlist ::= LP idlist RP EQ expr",
- /* 141 */ "cmd ::= with insert_cmd INTO fullname idlist_opt select",
- /* 142 */ "cmd ::= with insert_cmd INTO fullname idlist_opt DEFAULT VALUES",
- /* 143 */ "insert_cmd ::= INSERT orconf",
- /* 144 */ "insert_cmd ::= REPLACE",
- /* 145 */ "idlist_opt ::=",
- /* 146 */ "idlist_opt ::= LP idlist RP",
- /* 147 */ "idlist ::= idlist COMMA nm",
- /* 148 */ "idlist ::= nm",
- /* 149 */ "expr ::= LP expr RP",
- /* 150 */ "expr ::= ID|INDEXED",
- /* 151 */ "expr ::= JOIN_KW",
- /* 152 */ "expr ::= nm DOT nm",
- /* 153 */ "expr ::= nm DOT nm DOT nm",
- /* 154 */ "term ::= NULL|FLOAT|BLOB",
- /* 155 */ "term ::= STRING",
- /* 156 */ "term ::= INTEGER",
- /* 157 */ "expr ::= VARIABLE",
- /* 158 */ "expr ::= expr COLLATE ID|STRING",
- /* 159 */ "expr ::= CAST LP expr AS typetoken RP",
- /* 160 */ "expr ::= ID|INDEXED LP distinct exprlist RP",
- /* 161 */ "expr ::= ID|INDEXED LP STAR RP",
- /* 162 */ "term ::= CTIME_KW",
- /* 163 */ "expr ::= LP nexprlist COMMA expr RP",
- /* 164 */ "expr ::= expr AND expr",
- /* 165 */ "expr ::= expr OR expr",
- /* 166 */ "expr ::= expr LT|GT|GE|LE expr",
- /* 167 */ "expr ::= expr EQ|NE expr",
- /* 168 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr",
- /* 169 */ "expr ::= expr PLUS|MINUS expr",
- /* 170 */ "expr ::= expr STAR|SLASH|REM expr",
- /* 171 */ "expr ::= expr CONCAT expr",
- /* 172 */ "likeop ::= NOT LIKE_KW|MATCH",
- /* 173 */ "expr ::= expr likeop expr",
- /* 174 */ "expr ::= expr likeop expr ESCAPE expr",
- /* 175 */ "expr ::= expr ISNULL|NOTNULL",
- /* 176 */ "expr ::= expr NOT NULL",
- /* 177 */ "expr ::= expr IS expr",
- /* 178 */ "expr ::= expr IS NOT expr",
- /* 179 */ "expr ::= NOT expr",
- /* 180 */ "expr ::= BITNOT expr",
- /* 181 */ "expr ::= MINUS expr",
- /* 182 */ "expr ::= PLUS expr",
- /* 183 */ "between_op ::= BETWEEN",
- /* 184 */ "between_op ::= NOT BETWEEN",
- /* 185 */ "expr ::= expr between_op expr AND expr",
- /* 186 */ "in_op ::= IN",
- /* 187 */ "in_op ::= NOT IN",
- /* 188 */ "expr ::= expr in_op LP exprlist RP",
- /* 189 */ "expr ::= LP select RP",
- /* 190 */ "expr ::= expr in_op LP select RP",
- /* 191 */ "expr ::= expr in_op nm dbnm paren_exprlist",
- /* 192 */ "expr ::= EXISTS LP select RP",
- /* 193 */ "expr ::= CASE case_operand case_exprlist case_else END",
- /* 194 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr",
- /* 195 */ "case_exprlist ::= WHEN expr THEN expr",
- /* 196 */ "case_else ::= ELSE expr",
- /* 197 */ "case_else ::=",
- /* 198 */ "case_operand ::= expr",
- /* 199 */ "case_operand ::=",
- /* 200 */ "exprlist ::=",
- /* 201 */ "nexprlist ::= nexprlist COMMA expr",
- /* 202 */ "nexprlist ::= expr",
- /* 203 */ "paren_exprlist ::=",
- /* 204 */ "paren_exprlist ::= LP exprlist RP",
- /* 205 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt",
- /* 206 */ "uniqueflag ::= UNIQUE",
- /* 207 */ "uniqueflag ::=",
- /* 208 */ "eidlist_opt ::=",
- /* 209 */ "eidlist_opt ::= LP eidlist RP",
- /* 210 */ "eidlist ::= eidlist COMMA nm collate sortorder",
- /* 211 */ "eidlist ::= nm collate sortorder",
- /* 212 */ "collate ::=",
- /* 213 */ "collate ::= COLLATE ID|STRING",
- /* 214 */ "cmd ::= DROP INDEX ifexists fullname",
- /* 215 */ "cmd ::= VACUUM",
- /* 216 */ "cmd ::= VACUUM nm",
- /* 217 */ "cmd ::= PRAGMA nm dbnm",
- /* 218 */ "cmd ::= PRAGMA nm dbnm EQ nmnum",
- /* 219 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP",
- /* 220 */ "cmd ::= PRAGMA nm dbnm EQ minus_num",
- /* 221 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP",
- /* 222 */ "plus_num ::= PLUS INTEGER|FLOAT",
- /* 223 */ "minus_num ::= MINUS INTEGER|FLOAT",
- /* 224 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END",
- /* 225 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause",
- /* 226 */ "trigger_time ::= BEFORE|AFTER",
- /* 227 */ "trigger_time ::= INSTEAD OF",
- /* 228 */ "trigger_time ::=",
- /* 229 */ "trigger_event ::= DELETE|INSERT",
- /* 230 */ "trigger_event ::= UPDATE",
- /* 231 */ "trigger_event ::= UPDATE OF idlist",
- /* 232 */ "when_clause ::=",
- /* 233 */ "when_clause ::= WHEN expr",
- /* 234 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI",
- /* 235 */ "trigger_cmd_list ::= trigger_cmd SEMI",
- /* 236 */ "trnm ::= nm DOT nm",
- /* 237 */ "tridxby ::= INDEXED BY nm",
- /* 238 */ "tridxby ::= NOT INDEXED",
- /* 239 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt",
- /* 240 */ "trigger_cmd ::= insert_cmd INTO trnm idlist_opt select",
- /* 241 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt",
- /* 242 */ "trigger_cmd ::= select",
- /* 243 */ "expr ::= RAISE LP IGNORE RP",
- /* 244 */ "expr ::= RAISE LP raisetype COMMA nm RP",
- /* 245 */ "raisetype ::= ROLLBACK",
- /* 246 */ "raisetype ::= ABORT",
- /* 247 */ "raisetype ::= FAIL",
- /* 248 */ "cmd ::= DROP TRIGGER ifexists fullname",
- /* 249 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt",
- /* 250 */ "cmd ::= DETACH database_kw_opt expr",
- /* 251 */ "key_opt ::=",
- /* 252 */ "key_opt ::= KEY expr",
- /* 253 */ "cmd ::= REINDEX",
- /* 254 */ "cmd ::= REINDEX nm dbnm",
- /* 255 */ "cmd ::= ANALYZE",
- /* 256 */ "cmd ::= ANALYZE nm dbnm",
- /* 257 */ "cmd ::= ALTER TABLE fullname RENAME TO nm",
- /* 258 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist",
- /* 259 */ "add_column_fullname ::= fullname",
- /* 260 */ "cmd ::= create_vtab",
- /* 261 */ "cmd ::= create_vtab LP vtabarglist RP",
- /* 262 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm",
- /* 263 */ "vtabarg ::=",
- /* 264 */ "vtabargtoken ::= ANY",
- /* 265 */ "vtabargtoken ::= lp anylist RP",
- /* 266 */ "lp ::= LP",
- /* 267 */ "with ::=",
- /* 268 */ "with ::= WITH wqlist",
- /* 269 */ "with ::= WITH RECURSIVE wqlist",
- /* 270 */ "wqlist ::= nm eidlist_opt AS LP select RP",
- /* 271 */ "wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP",
- /* 272 */ "input ::= cmdlist",
- /* 273 */ "cmdlist ::= cmdlist ecmd",
- /* 274 */ "cmdlist ::= ecmd",
- /* 275 */ "ecmd ::= SEMI",
- /* 276 */ "ecmd ::= explain cmdx SEMI",
- /* 277 */ "explain ::=",
- /* 278 */ "trans_opt ::=",
- /* 279 */ "trans_opt ::= TRANSACTION",
- /* 280 */ "trans_opt ::= TRANSACTION nm",
- /* 281 */ "savepoint_opt ::= SAVEPOINT",
- /* 282 */ "savepoint_opt ::=",
- /* 283 */ "cmd ::= create_table create_table_args",
- /* 284 */ "columnlist ::= columnlist COMMA columnname carglist",
- /* 285 */ "columnlist ::= columnname carglist",
- /* 286 */ "nm ::= ID|INDEXED",
- /* 287 */ "nm ::= STRING",
- /* 288 */ "nm ::= JOIN_KW",
- /* 289 */ "typetoken ::= typename",
- /* 290 */ "typename ::= ID|STRING",
- /* 291 */ "signed ::= plus_num",
- /* 292 */ "signed ::= minus_num",
- /* 293 */ "carglist ::= carglist ccons",
- /* 294 */ "carglist ::=",
- /* 295 */ "ccons ::= NULL onconf",
- /* 296 */ "conslist_opt ::= COMMA conslist",
- /* 297 */ "conslist ::= conslist tconscomma tcons",
- /* 298 */ "conslist ::= tcons",
- /* 299 */ "tconscomma ::=",
- /* 300 */ "defer_subclause_opt ::= defer_subclause",
- /* 301 */ "resolvetype ::= raisetype",
- /* 302 */ "selectnowith ::= oneselect",
- /* 303 */ "oneselect ::= values",
- /* 304 */ "sclp ::= selcollist COMMA",
- /* 305 */ "as ::= ID|STRING",
- /* 306 */ "expr ::= term",
- /* 307 */ "likeop ::= LIKE_KW|MATCH",
- /* 308 */ "exprlist ::= nexprlist",
- /* 309 */ "nmnum ::= plus_num",
- /* 310 */ "nmnum ::= nm",
- /* 311 */ "nmnum ::= ON",
- /* 312 */ "nmnum ::= DELETE",
- /* 313 */ "nmnum ::= DEFAULT",
- /* 314 */ "plus_num ::= INTEGER|FLOAT",
- /* 315 */ "foreach_clause ::=",
- /* 316 */ "foreach_clause ::= FOR EACH ROW",
- /* 317 */ "trnm ::= nm",
- /* 318 */ "tridxby ::=",
- /* 319 */ "database_kw_opt ::= DATABASE",
- /* 320 */ "database_kw_opt ::=",
- /* 321 */ "kwcolumn_opt ::=",
- /* 322 */ "kwcolumn_opt ::= COLUMNKW",
- /* 323 */ "vtabarglist ::= vtabarg",
- /* 324 */ "vtabarglist ::= vtabarglist COMMA vtabarg",
- /* 325 */ "vtabarg ::= vtabarg vtabargtoken",
- /* 326 */ "anylist ::=",
- /* 327 */ "anylist ::= anylist LP anylist RP",
- /* 328 */ "anylist ::= anylist ANY",
+ /* 28 */ "scanpt ::=",
+ /* 29 */ "ccons ::= CONSTRAINT nm",
+ /* 30 */ "ccons ::= DEFAULT scanpt term scanpt",
+ /* 31 */ "ccons ::= DEFAULT LP expr RP",
+ /* 32 */ "ccons ::= DEFAULT PLUS term scanpt",
+ /* 33 */ "ccons ::= DEFAULT MINUS term scanpt",
+ /* 34 */ "ccons ::= DEFAULT scanpt ID|INDEXED",
+ /* 35 */ "ccons ::= NOT NULL onconf",
+ /* 36 */ "ccons ::= PRIMARY KEY sortorder onconf autoinc",
+ /* 37 */ "ccons ::= UNIQUE onconf",
+ /* 38 */ "ccons ::= CHECK LP expr RP",
+ /* 39 */ "ccons ::= REFERENCES nm eidlist_opt refargs",
+ /* 40 */ "ccons ::= defer_subclause",
+ /* 41 */ "ccons ::= COLLATE ID|STRING",
+ /* 42 */ "autoinc ::=",
+ /* 43 */ "autoinc ::= AUTOINCR",
+ /* 44 */ "refargs ::=",
+ /* 45 */ "refargs ::= refargs refarg",
+ /* 46 */ "refarg ::= MATCH nm",
+ /* 47 */ "refarg ::= ON INSERT refact",
+ /* 48 */ "refarg ::= ON DELETE refact",
+ /* 49 */ "refarg ::= ON UPDATE refact",
+ /* 50 */ "refact ::= SET NULL",
+ /* 51 */ "refact ::= SET DEFAULT",
+ /* 52 */ "refact ::= CASCADE",
+ /* 53 */ "refact ::= RESTRICT",
+ /* 54 */ "refact ::= NO ACTION",
+ /* 55 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt",
+ /* 56 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt",
+ /* 57 */ "init_deferred_pred_opt ::=",
+ /* 58 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED",
+ /* 59 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE",
+ /* 60 */ "conslist_opt ::=",
+ /* 61 */ "tconscomma ::= COMMA",
+ /* 62 */ "tcons ::= CONSTRAINT nm",
+ /* 63 */ "tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf",
+ /* 64 */ "tcons ::= UNIQUE LP sortlist RP onconf",
+ /* 65 */ "tcons ::= CHECK LP expr RP onconf",
+ /* 66 */ "tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt",
+ /* 67 */ "defer_subclause_opt ::=",
+ /* 68 */ "onconf ::=",
+ /* 69 */ "onconf ::= ON CONFLICT resolvetype",
+ /* 70 */ "orconf ::=",
+ /* 71 */ "orconf ::= OR resolvetype",
+ /* 72 */ "resolvetype ::= IGNORE",
+ /* 73 */ "resolvetype ::= REPLACE",
+ /* 74 */ "cmd ::= DROP TABLE ifexists fullname",
+ /* 75 */ "ifexists ::= IF EXISTS",
+ /* 76 */ "ifexists ::=",
+ /* 77 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select",
+ /* 78 */ "cmd ::= DROP VIEW ifexists fullname",
+ /* 79 */ "cmd ::= select",
+ /* 80 */ "select ::= WITH wqlist selectnowith",
+ /* 81 */ "select ::= WITH RECURSIVE wqlist selectnowith",
+ /* 82 */ "select ::= selectnowith",
+ /* 83 */ "selectnowith ::= selectnowith multiselect_op oneselect",
+ /* 84 */ "multiselect_op ::= UNION",
+ /* 85 */ "multiselect_op ::= UNION ALL",
+ /* 86 */ "multiselect_op ::= EXCEPT|INTERSECT",
+ /* 87 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt",
+ /* 88 */ "values ::= VALUES LP nexprlist RP",
+ /* 89 */ "values ::= values COMMA LP exprlist RP",
+ /* 90 */ "distinct ::= DISTINCT",
+ /* 91 */ "distinct ::= ALL",
+ /* 92 */ "distinct ::=",
+ /* 93 */ "sclp ::=",
+ /* 94 */ "selcollist ::= sclp scanpt expr scanpt as",
+ /* 95 */ "selcollist ::= sclp scanpt STAR",
+ /* 96 */ "selcollist ::= sclp scanpt nm DOT STAR",
+ /* 97 */ "as ::= AS nm",
+ /* 98 */ "as ::=",
+ /* 99 */ "from ::=",
+ /* 100 */ "from ::= FROM seltablist",
+ /* 101 */ "stl_prefix ::= seltablist joinop",
+ /* 102 */ "stl_prefix ::=",
+ /* 103 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt",
+ /* 104 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt",
+ /* 105 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt",
+ /* 106 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt",
+ /* 107 */ "dbnm ::=",
+ /* 108 */ "dbnm ::= DOT nm",
+ /* 109 */ "fullname ::= nm",
+ /* 110 */ "fullname ::= nm DOT nm",
+ /* 111 */ "xfullname ::= nm",
+ /* 112 */ "xfullname ::= nm DOT nm",
+ /* 113 */ "xfullname ::= nm DOT nm AS nm",
+ /* 114 */ "xfullname ::= nm AS nm",
+ /* 115 */ "joinop ::= COMMA|JOIN",
+ /* 116 */ "joinop ::= JOIN_KW JOIN",
+ /* 117 */ "joinop ::= JOIN_KW nm JOIN",
+ /* 118 */ "joinop ::= JOIN_KW nm nm JOIN",
+ /* 119 */ "on_opt ::= ON expr",
+ /* 120 */ "on_opt ::=",
+ /* 121 */ "indexed_opt ::=",
+ /* 122 */ "indexed_opt ::= INDEXED BY nm",
+ /* 123 */ "indexed_opt ::= NOT INDEXED",
+ /* 124 */ "using_opt ::= USING LP idlist RP",
+ /* 125 */ "using_opt ::=",
+ /* 126 */ "orderby_opt ::=",
+ /* 127 */ "orderby_opt ::= ORDER BY sortlist",
+ /* 128 */ "sortlist ::= sortlist COMMA expr sortorder",
+ /* 129 */ "sortlist ::= expr sortorder",
+ /* 130 */ "sortorder ::= ASC",
+ /* 131 */ "sortorder ::= DESC",
+ /* 132 */ "sortorder ::=",
+ /* 133 */ "groupby_opt ::=",
+ /* 134 */ "groupby_opt ::= GROUP BY nexprlist",
+ /* 135 */ "having_opt ::=",
+ /* 136 */ "having_opt ::= HAVING expr",
+ /* 137 */ "limit_opt ::=",
+ /* 138 */ "limit_opt ::= LIMIT expr",
+ /* 139 */ "limit_opt ::= LIMIT expr OFFSET expr",
+ /* 140 */ "limit_opt ::= LIMIT expr COMMA expr",
+ /* 141 */ "cmd ::= with DELETE FROM xfullname indexed_opt where_opt",
+ /* 142 */ "where_opt ::=",
+ /* 143 */ "where_opt ::= WHERE expr",
+ /* 144 */ "cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt",
+ /* 145 */ "setlist ::= setlist COMMA nm EQ expr",
+ /* 146 */ "setlist ::= setlist COMMA LP idlist RP EQ expr",
+ /* 147 */ "setlist ::= nm EQ expr",
+ /* 148 */ "setlist ::= LP idlist RP EQ expr",
+ /* 149 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert",
+ /* 150 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES",
+ /* 151 */ "upsert ::=",
+ /* 152 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt",
+ /* 153 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING",
+ /* 154 */ "upsert ::= ON CONFLICT DO NOTHING",
+ /* 155 */ "insert_cmd ::= INSERT orconf",
+ /* 156 */ "insert_cmd ::= REPLACE",
+ /* 157 */ "idlist_opt ::=",
+ /* 158 */ "idlist_opt ::= LP idlist RP",
+ /* 159 */ "idlist ::= idlist COMMA nm",
+ /* 160 */ "idlist ::= nm",
+ /* 161 */ "expr ::= LP expr RP",
+ /* 162 */ "expr ::= ID|INDEXED",
+ /* 163 */ "expr ::= JOIN_KW",
+ /* 164 */ "expr ::= nm DOT nm",
+ /* 165 */ "expr ::= nm DOT nm DOT nm",
+ /* 166 */ "term ::= NULL|FLOAT|BLOB",
+ /* 167 */ "term ::= STRING",
+ /* 168 */ "term ::= INTEGER",
+ /* 169 */ "expr ::= VARIABLE",
+ /* 170 */ "expr ::= expr COLLATE ID|STRING",
+ /* 171 */ "expr ::= CAST LP expr AS typetoken RP",
+ /* 172 */ "expr ::= ID|INDEXED LP distinct exprlist RP",
+ /* 173 */ "expr ::= ID|INDEXED LP STAR RP",
+ /* 174 */ "term ::= CTIME_KW",
+ /* 175 */ "expr ::= LP nexprlist COMMA expr RP",
+ /* 176 */ "expr ::= expr AND expr",
+ /* 177 */ "expr ::= expr OR expr",
+ /* 178 */ "expr ::= expr LT|GT|GE|LE expr",
+ /* 179 */ "expr ::= expr EQ|NE expr",
+ /* 180 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr",
+ /* 181 */ "expr ::= expr PLUS|MINUS expr",
+ /* 182 */ "expr ::= expr STAR|SLASH|REM expr",
+ /* 183 */ "expr ::= expr CONCAT expr",
+ /* 184 */ "likeop ::= NOT LIKE_KW|MATCH",
+ /* 185 */ "expr ::= expr likeop expr",
+ /* 186 */ "expr ::= expr likeop expr ESCAPE expr",
+ /* 187 */ "expr ::= expr ISNULL|NOTNULL",
+ /* 188 */ "expr ::= expr NOT NULL",
+ /* 189 */ "expr ::= expr IS expr",
+ /* 190 */ "expr ::= expr IS NOT expr",
+ /* 191 */ "expr ::= NOT expr",
+ /* 192 */ "expr ::= BITNOT expr",
+ /* 193 */ "expr ::= MINUS expr",
+ /* 194 */ "expr ::= PLUS expr",
+ /* 195 */ "between_op ::= BETWEEN",
+ /* 196 */ "between_op ::= NOT BETWEEN",
+ /* 197 */ "expr ::= expr between_op expr AND expr",
+ /* 198 */ "in_op ::= IN",
+ /* 199 */ "in_op ::= NOT IN",
+ /* 200 */ "expr ::= expr in_op LP exprlist RP",
+ /* 201 */ "expr ::= LP select RP",
+ /* 202 */ "expr ::= expr in_op LP select RP",
+ /* 203 */ "expr ::= expr in_op nm dbnm paren_exprlist",
+ /* 204 */ "expr ::= EXISTS LP select RP",
+ /* 205 */ "expr ::= CASE case_operand case_exprlist case_else END",
+ /* 206 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr",
+ /* 207 */ "case_exprlist ::= WHEN expr THEN expr",
+ /* 208 */ "case_else ::= ELSE expr",
+ /* 209 */ "case_else ::=",
+ /* 210 */ "case_operand ::= expr",
+ /* 211 */ "case_operand ::=",
+ /* 212 */ "exprlist ::=",
+ /* 213 */ "nexprlist ::= nexprlist COMMA expr",
+ /* 214 */ "nexprlist ::= expr",
+ /* 215 */ "paren_exprlist ::=",
+ /* 216 */ "paren_exprlist ::= LP exprlist RP",
+ /* 217 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt",
+ /* 218 */ "uniqueflag ::= UNIQUE",
+ /* 219 */ "uniqueflag ::=",
+ /* 220 */ "eidlist_opt ::=",
+ /* 221 */ "eidlist_opt ::= LP eidlist RP",
+ /* 222 */ "eidlist ::= eidlist COMMA nm collate sortorder",
+ /* 223 */ "eidlist ::= nm collate sortorder",
+ /* 224 */ "collate ::=",
+ /* 225 */ "collate ::= COLLATE ID|STRING",
+ /* 226 */ "cmd ::= DROP INDEX ifexists fullname",
+ /* 227 */ "cmd ::= VACUUM",
+ /* 228 */ "cmd ::= VACUUM nm",
+ /* 229 */ "cmd ::= PRAGMA nm dbnm",
+ /* 230 */ "cmd ::= PRAGMA nm dbnm EQ nmnum",
+ /* 231 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP",
+ /* 232 */ "cmd ::= PRAGMA nm dbnm EQ minus_num",
+ /* 233 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP",
+ /* 234 */ "plus_num ::= PLUS INTEGER|FLOAT",
+ /* 235 */ "minus_num ::= MINUS INTEGER|FLOAT",
+ /* 236 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END",
+ /* 237 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause",
+ /* 238 */ "trigger_time ::= BEFORE|AFTER",
+ /* 239 */ "trigger_time ::= INSTEAD OF",
+ /* 240 */ "trigger_time ::=",
+ /* 241 */ "trigger_event ::= DELETE|INSERT",
+ /* 242 */ "trigger_event ::= UPDATE",
+ /* 243 */ "trigger_event ::= UPDATE OF idlist",
+ /* 244 */ "when_clause ::=",
+ /* 245 */ "when_clause ::= WHEN expr",
+ /* 246 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI",
+ /* 247 */ "trigger_cmd_list ::= trigger_cmd SEMI",
+ /* 248 */ "trnm ::= nm DOT nm",
+ /* 249 */ "tridxby ::= INDEXED BY nm",
+ /* 250 */ "tridxby ::= NOT INDEXED",
+ /* 251 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt",
+ /* 252 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt",
+ /* 253 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt",
+ /* 254 */ "trigger_cmd ::= scanpt select scanpt",
+ /* 255 */ "expr ::= RAISE LP IGNORE RP",
+ /* 256 */ "expr ::= RAISE LP raisetype COMMA nm RP",
+ /* 257 */ "raisetype ::= ROLLBACK",
+ /* 258 */ "raisetype ::= ABORT",
+ /* 259 */ "raisetype ::= FAIL",
+ /* 260 */ "cmd ::= DROP TRIGGER ifexists fullname",
+ /* 261 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt",
+ /* 262 */ "cmd ::= DETACH database_kw_opt expr",
+ /* 263 */ "key_opt ::=",
+ /* 264 */ "key_opt ::= KEY expr",
+ /* 265 */ "cmd ::= REINDEX",
+ /* 266 */ "cmd ::= REINDEX nm dbnm",
+ /* 267 */ "cmd ::= ANALYZE",
+ /* 268 */ "cmd ::= ANALYZE nm dbnm",
+ /* 269 */ "cmd ::= ALTER TABLE fullname RENAME TO nm",
+ /* 270 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist",
+ /* 271 */ "add_column_fullname ::= fullname",
+ /* 272 */ "cmd ::= create_vtab",
+ /* 273 */ "cmd ::= create_vtab LP vtabarglist RP",
+ /* 274 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm",
+ /* 275 */ "vtabarg ::=",
+ /* 276 */ "vtabargtoken ::= ANY",
+ /* 277 */ "vtabargtoken ::= lp anylist RP",
+ /* 278 */ "lp ::= LP",
+ /* 279 */ "with ::= WITH wqlist",
+ /* 280 */ "with ::= WITH RECURSIVE wqlist",
+ /* 281 */ "wqlist ::= nm eidlist_opt AS LP select RP",
+ /* 282 */ "wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP",
+ /* 283 */ "input ::= cmdlist",
+ /* 284 */ "cmdlist ::= cmdlist ecmd",
+ /* 285 */ "cmdlist ::= ecmd",
+ /* 286 */ "ecmd ::= SEMI",
+ /* 287 */ "ecmd ::= cmdx SEMI",
+ /* 288 */ "ecmd ::= explain cmdx",
+ /* 289 */ "trans_opt ::=",
+ /* 290 */ "trans_opt ::= TRANSACTION",
+ /* 291 */ "trans_opt ::= TRANSACTION nm",
+ /* 292 */ "savepoint_opt ::= SAVEPOINT",
+ /* 293 */ "savepoint_opt ::=",
+ /* 294 */ "cmd ::= create_table create_table_args",
+ /* 295 */ "columnlist ::= columnlist COMMA columnname carglist",
+ /* 296 */ "columnlist ::= columnname carglist",
+ /* 297 */ "nm ::= ID|INDEXED",
+ /* 298 */ "nm ::= STRING",
+ /* 299 */ "nm ::= JOIN_KW",
+ /* 300 */ "typetoken ::= typename",
+ /* 301 */ "typename ::= ID|STRING",
+ /* 302 */ "signed ::= plus_num",
+ /* 303 */ "signed ::= minus_num",
+ /* 304 */ "carglist ::= carglist ccons",
+ /* 305 */ "carglist ::=",
+ /* 306 */ "ccons ::= NULL onconf",
+ /* 307 */ "conslist_opt ::= COMMA conslist",
+ /* 308 */ "conslist ::= conslist tconscomma tcons",
+ /* 309 */ "conslist ::= tcons",
+ /* 310 */ "tconscomma ::=",
+ /* 311 */ "defer_subclause_opt ::= defer_subclause",
+ /* 312 */ "resolvetype ::= raisetype",
+ /* 313 */ "selectnowith ::= oneselect",
+ /* 314 */ "oneselect ::= values",
+ /* 315 */ "sclp ::= selcollist COMMA",
+ /* 316 */ "as ::= ID|STRING",
+ /* 317 */ "expr ::= term",
+ /* 318 */ "likeop ::= LIKE_KW|MATCH",
+ /* 319 */ "exprlist ::= nexprlist",
+ /* 320 */ "nmnum ::= plus_num",
+ /* 321 */ "nmnum ::= nm",
+ /* 322 */ "nmnum ::= ON",
+ /* 323 */ "nmnum ::= DELETE",
+ /* 324 */ "nmnum ::= DEFAULT",
+ /* 325 */ "plus_num ::= INTEGER|FLOAT",
+ /* 326 */ "foreach_clause ::=",
+ /* 327 */ "foreach_clause ::= FOR EACH ROW",
+ /* 328 */ "trnm ::= nm",
+ /* 329 */ "tridxby ::=",
+ /* 330 */ "database_kw_opt ::= DATABASE",
+ /* 331 */ "database_kw_opt ::=",
+ /* 332 */ "kwcolumn_opt ::=",
+ /* 333 */ "kwcolumn_opt ::= COLUMNKW",
+ /* 334 */ "vtabarglist ::= vtabarg",
+ /* 335 */ "vtabarglist ::= vtabarglist COMMA vtabarg",
+ /* 336 */ "vtabarg ::= vtabarg vtabargtoken",
+ /* 337 */ "anylist ::=",
+ /* 338 */ "anylist ::= anylist LP anylist RP",
+ /* 339 */ "anylist ::= anylist ANY",
+ /* 340 */ "with ::=",
};
#endif /* NDEBUG */
@@ -138399,28 +143058,29 @@ static int yyGrowStack(yyParser *p){
/* Initialize a new parser that has already been allocated.
*/
-SQLITE_PRIVATE void sqlite3ParserInit(void *yypParser){
- yyParser *pParser = (yyParser*)yypParser;
+SQLITE_PRIVATE void sqlite3ParserInit(void *yypRawParser sqlite3ParserCTX_PDECL){
+ yyParser *yypParser = (yyParser*)yypRawParser;
+ sqlite3ParserCTX_STORE
#ifdef YYTRACKMAXSTACKDEPTH
- pParser->yyhwm = 0;
+ yypParser->yyhwm = 0;
#endif
#if YYSTACKDEPTH<=0
- pParser->yytos = NULL;
- pParser->yystack = NULL;
- pParser->yystksz = 0;
- if( yyGrowStack(pParser) ){
- pParser->yystack = &pParser->yystk0;
- pParser->yystksz = 1;
+ yypParser->yytos = NULL;
+ yypParser->yystack = NULL;
+ yypParser->yystksz = 0;
+ if( yyGrowStack(yypParser) ){
+ yypParser->yystack = &yypParser->yystk0;
+ yypParser->yystksz = 1;
}
#endif
#ifndef YYNOERRORRECOVERY
- pParser->yyerrcnt = -1;
+ yypParser->yyerrcnt = -1;
#endif
- pParser->yytos = pParser->yystack;
- pParser->yystack[0].stateno = 0;
- pParser->yystack[0].major = 0;
+ yypParser->yytos = yypParser->yystack;
+ yypParser->yystack[0].stateno = 0;
+ yypParser->yystack[0].major = 0;
#if YYSTACKDEPTH>0
- pParser->yystackEnd = &pParser->yystack[YYSTACKDEPTH-1];
+ yypParser->yystackEnd = &yypParser->yystack[YYSTACKDEPTH-1];
#endif
}
@@ -138437,11 +143097,14 @@ SQLITE_PRIVATE void sqlite3ParserInit(void *yypParser){
** A pointer to a parser. This pointer is used in subsequent calls
** to sqlite3Parser and sqlite3ParserFree.
*/
-SQLITE_PRIVATE void *sqlite3ParserAlloc(void *(*mallocProc)(YYMALLOCARGTYPE)){
- yyParser *pParser;
- pParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) );
- if( pParser ) sqlite3ParserInit(pParser);
- return pParser;
+SQLITE_PRIVATE void *sqlite3ParserAlloc(void *(*mallocProc)(YYMALLOCARGTYPE) sqlite3ParserCTX_PDECL){
+ yyParser *yypParser;
+ yypParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) );
+ if( yypParser ){
+ sqlite3ParserCTX_STORE
+ sqlite3ParserInit(yypParser sqlite3ParserCTX_PARAM);
+ }
+ return (void*)yypParser;
}
#endif /* sqlite3Parser_ENGINEALWAYSONSTACK */
@@ -138458,7 +143121,8 @@ static void yy_destructor(
YYCODETYPE yymajor, /* Type code for object to destroy */
YYMINORTYPE *yypminor /* The object to be destroyed */
){
- sqlite3ParserARG_FETCH;
+ sqlite3ParserARG_FETCH
+ sqlite3ParserCTX_FETCH
switch( yymajor ){
/* Here is inserted the actions which take place when a
** terminal or non-terminal is destroyed. This can happen
@@ -138471,77 +143135,73 @@ static void yy_destructor(
** inside the C code.
*/
/********* Begin destructor definitions ***************************************/
- case 163: /* select */
- case 194: /* selectnowith */
- case 195: /* oneselect */
- case 206: /* values */
-{
-sqlite3SelectDelete(pParse->db, (yypminor->yy243));
-}
- break;
- case 172: /* term */
- case 173: /* expr */
+ case 164: /* select */
+ case 196: /* selectnowith */
+ case 197: /* oneselect */
+ case 208: /* values */
{
-sqlite3ExprDelete(pParse->db, (yypminor->yy190).pExpr);
+sqlite3SelectDelete(pParse->db, (yypminor->yy399));
}
break;
- case 177: /* eidlist_opt */
- case 186: /* sortlist */
- case 187: /* eidlist */
- case 199: /* selcollist */
- case 202: /* groupby_opt */
- case 204: /* orderby_opt */
- case 207: /* nexprlist */
- case 208: /* exprlist */
- case 209: /* sclp */
- case 218: /* setlist */
- case 224: /* paren_exprlist */
- case 226: /* case_exprlist */
+ case 174: /* term */
+ case 175: /* expr */
+ case 203: /* where_opt */
+ case 205: /* having_opt */
+ case 217: /* on_opt */
+ case 230: /* case_operand */
+ case 232: /* case_else */
+ case 241: /* when_clause */
+ case 246: /* key_opt */
{
-sqlite3ExprListDelete(pParse->db, (yypminor->yy148));
+sqlite3ExprDelete(pParse->db, (yypminor->yy182));
}
break;
- case 193: /* fullname */
- case 200: /* from */
- case 211: /* seltablist */
- case 212: /* stl_prefix */
+ case 179: /* eidlist_opt */
+ case 188: /* sortlist */
+ case 189: /* eidlist */
+ case 201: /* selcollist */
+ case 204: /* groupby_opt */
+ case 206: /* orderby_opt */
+ case 209: /* nexprlist */
+ case 210: /* exprlist */
+ case 211: /* sclp */
+ case 222: /* setlist */
+ case 229: /* paren_exprlist */
+ case 231: /* case_exprlist */
{
-sqlite3SrcListDelete(pParse->db, (yypminor->yy185));
+sqlite3ExprListDelete(pParse->db, (yypminor->yy232));
}
break;
- case 196: /* with */
- case 250: /* wqlist */
+ case 195: /* fullname */
+ case 202: /* from */
+ case 213: /* seltablist */
+ case 214: /* stl_prefix */
+ case 219: /* xfullname */
{
-sqlite3WithDelete(pParse->db, (yypminor->yy285));
+sqlite3SrcListDelete(pParse->db, (yypminor->yy427));
}
break;
- case 201: /* where_opt */
- case 203: /* having_opt */
- case 215: /* on_opt */
- case 225: /* case_operand */
- case 227: /* case_else */
- case 236: /* when_clause */
- case 241: /* key_opt */
+ case 198: /* wqlist */
{
-sqlite3ExprDelete(pParse->db, (yypminor->yy72));
+sqlite3WithDelete(pParse->db, (yypminor->yy91));
}
break;
- case 216: /* using_opt */
- case 217: /* idlist */
- case 220: /* idlist_opt */
+ case 218: /* using_opt */
+ case 220: /* idlist */
+ case 224: /* idlist_opt */
{
-sqlite3IdListDelete(pParse->db, (yypminor->yy254));
+sqlite3IdListDelete(pParse->db, (yypminor->yy510));
}
break;
- case 232: /* trigger_cmd_list */
- case 237: /* trigger_cmd */
+ case 237: /* trigger_cmd_list */
+ case 242: /* trigger_cmd */
{
-sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy145));
+sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy47));
}
break;
- case 234: /* trigger_event */
+ case 239: /* trigger_event */
{
-sqlite3IdListDelete(pParse->db, (yypminor->yy332).b);
+sqlite3IdListDelete(pParse->db, (yypminor->yy300).b);
}
break;
/********* End destructor definitions *****************************************/
@@ -138612,24 +143272,66 @@ SQLITE_PRIVATE int sqlite3ParserStackPeak(void *p){
}
#endif
+/* This array of booleans keeps track of the parser statement
+** coverage. The element yycoverage[X][Y] is set when the parser
+** is in state X and has a lookahead token Y. In a well-tested
+** systems, every element of this matrix should end up being set.
+*/
+#if defined(YYCOVERAGE)
+static unsigned char yycoverage[YYNSTATE][YYNTOKEN];
+#endif
+
+/*
+** Write into out a description of every state/lookahead combination that
+**
+** (1) has not been used by the parser, and
+** (2) is not a syntax error.
+**
+** Return the number of missed state/lookahead combinations.
+*/
+#if defined(YYCOVERAGE)
+SQLITE_PRIVATE int sqlite3ParserCoverage(FILE *out){
+ int stateno, iLookAhead, i;
+ int nMissed = 0;
+ for(stateno=0; stateno<YYNSTATE; stateno++){
+ i = yy_shift_ofst[stateno];
+ for(iLookAhead=0; iLookAhead<YYNTOKEN; iLookAhead++){
+ if( yy_lookahead[i+iLookAhead]!=iLookAhead ) continue;
+ if( yycoverage[stateno][iLookAhead]==0 ) nMissed++;
+ if( out ){
+ fprintf(out,"State %d lookahead %s %s\n", stateno,
+ yyTokenName[iLookAhead],
+ yycoverage[stateno][iLookAhead] ? "ok" : "missed");
+ }
+ }
+ }
+ return nMissed;
+}
+#endif
+
/*
** Find the appropriate action for a parser given the terminal
** look-ahead token iLookAhead.
*/
-static unsigned int yy_find_shift_action(
- yyParser *pParser, /* The parser */
- YYCODETYPE iLookAhead /* The look-ahead token */
+static YYACTIONTYPE yy_find_shift_action(
+ YYCODETYPE iLookAhead, /* The look-ahead token */
+ YYACTIONTYPE stateno /* Current state number */
){
int i;
- int stateno = pParser->yytos->stateno;
-
- if( stateno>=YY_MIN_REDUCE ) return stateno;
+
+ if( stateno>YY_MAX_SHIFT ) return stateno;
assert( stateno <= YY_SHIFT_COUNT );
+#if defined(YYCOVERAGE)
+ yycoverage[stateno][iLookAhead] = 1;
+#endif
do{
i = yy_shift_ofst[stateno];
+ assert( i>=0 );
+ assert( i+YYNTOKEN<=(int)sizeof(yy_lookahead)/sizeof(yy_lookahead[0]) );
assert( iLookAhead!=YYNOCODE );
+ assert( iLookAhead < YYNTOKEN );
i += iLookAhead;
- if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){
+ if( yy_lookahead[i]!=iLookAhead ){
#ifdef YYFALLBACK
YYCODETYPE iFallback; /* Fallback token */
if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0])
@@ -138680,7 +143382,7 @@ static unsigned int yy_find_shift_action(
** look-ahead token iLookAhead.
*/
static int yy_find_reduce_action(
- int stateno, /* Current state number */
+ YYACTIONTYPE stateno, /* Current state number */
YYCODETYPE iLookAhead /* The look-ahead token */
){
int i;
@@ -138692,7 +143394,6 @@ static int yy_find_reduce_action(
assert( stateno<=YY_REDUCE_COUNT );
#endif
i = yy_reduce_ofst[stateno];
- assert( i!=YY_REDUCE_USE_DFLT );
assert( iLookAhead!=YYNOCODE );
i += iLookAhead;
#ifdef YYERRORSYMBOL
@@ -138710,7 +143411,8 @@ static int yy_find_reduce_action(
** The following routine is called if the stack overflows.
*/
static void yyStackOverflow(yyParser *yypParser){
- sqlite3ParserARG_FETCH;
+ sqlite3ParserARG_FETCH
+ sqlite3ParserCTX_FETCH
#ifndef NDEBUG
if( yyTraceFILE ){
fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt);
@@ -138723,27 +143425,29 @@ static void yyStackOverflow(yyParser *yypParser){
sqlite3ErrorMsg(pParse, "parser stack overflow");
/******** End %stack_overflow code ********************************************/
- sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument var */
+ sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument var */
+ sqlite3ParserCTX_STORE
}
/*
** Print tracing information for a SHIFT action
*/
#ifndef NDEBUG
-static void yyTraceShift(yyParser *yypParser, int yyNewState){
+static void yyTraceShift(yyParser *yypParser, int yyNewState, const char *zTag){
if( yyTraceFILE ){
if( yyNewState<YYNSTATE ){
- fprintf(yyTraceFILE,"%sShift '%s', go to state %d\n",
- yyTracePrompt,yyTokenName[yypParser->yytos->major],
+ fprintf(yyTraceFILE,"%s%s '%s', go to state %d\n",
+ yyTracePrompt, zTag, yyTokenName[yypParser->yytos->major],
yyNewState);
}else{
- fprintf(yyTraceFILE,"%sShift '%s'\n",
- yyTracePrompt,yyTokenName[yypParser->yytos->major]);
+ fprintf(yyTraceFILE,"%s%s '%s', pending reduce %d\n",
+ yyTracePrompt, zTag, yyTokenName[yypParser->yytos->major],
+ yyNewState - YY_MIN_REDUCE);
}
}
}
#else
-# define yyTraceShift(X,Y)
+# define yyTraceShift(X,Y,Z)
#endif
/*
@@ -138751,8 +143455,8 @@ static void yyTraceShift(yyParser *yypParser, int yyNewState){
*/
static void yy_shift(
yyParser *yypParser, /* The parser to be shifted */
- int yyNewState, /* The new state to shift in */
- int yyMajor, /* The major token to shift in */
+ YYACTIONTYPE yyNewState, /* The new state to shift in */
+ YYCODETYPE yyMajor, /* The major token to shift in */
sqlite3ParserTOKENTYPE yyMinor /* The minor token to shift in */
){
yyStackEntry *yytos;
@@ -138782,10 +143486,10 @@ static void yy_shift(
yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE;
}
yytos = yypParser->yytos;
- yytos->stateno = (YYACTIONTYPE)yyNewState;
- yytos->major = (YYCODETYPE)yyMajor;
+ yytos->stateno = yyNewState;
+ yytos->major = yyMajor;
yytos->minor.yy0 = yyMinor;
- yyTraceShift(yypParser, yyNewState);
+ yyTraceShift(yypParser, yyNewState, "Shift");
}
/* The following table contains information about every rule that
@@ -138795,335 +143499,347 @@ static const struct {
YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */
signed char nrhs; /* Negative of the number of RHS symbols in the rule */
} yyRuleInfo[] = {
- { 147, -1 },
- { 147, -3 },
- { 148, -1 },
- { 149, -3 },
- { 150, 0 },
- { 150, -1 },
- { 150, -1 },
- { 150, -1 },
- { 149, -2 },
- { 149, -2 },
- { 149, -2 },
- { 149, -3 },
- { 149, -5 },
- { 154, -6 },
- { 156, -1 },
- { 158, 0 },
- { 158, -3 },
- { 157, -1 },
- { 157, 0 },
- { 155, -5 },
- { 155, -2 },
- { 162, 0 },
- { 162, -2 },
- { 164, -2 },
- { 166, 0 },
- { 166, -4 },
- { 166, -6 },
- { 167, -2 },
- { 171, -2 },
- { 171, -2 },
- { 171, -4 },
- { 171, -3 },
- { 171, -3 },
- { 171, -2 },
- { 171, -3 },
- { 171, -5 },
- { 171, -2 },
- { 171, -4 },
- { 171, -4 },
- { 171, -1 },
- { 171, -2 },
- { 176, 0 },
- { 176, -1 },
- { 178, 0 },
- { 178, -2 },
- { 180, -2 },
- { 180, -3 },
- { 180, -3 },
- { 180, -3 },
- { 181, -2 },
- { 181, -2 },
- { 181, -1 },
- { 181, -1 },
- { 181, -2 },
- { 179, -3 },
- { 179, -2 },
- { 182, 0 },
- { 182, -2 },
- { 182, -2 },
- { 161, 0 },
- { 184, -1 },
- { 185, -2 },
- { 185, -7 },
- { 185, -5 },
- { 185, -5 },
- { 185, -10 },
- { 188, 0 },
- { 174, 0 },
- { 174, -3 },
- { 189, 0 },
- { 189, -2 },
- { 190, -1 },
- { 190, -1 },
- { 149, -4 },
- { 192, -2 },
- { 192, 0 },
- { 149, -9 },
- { 149, -4 },
- { 149, -1 },
- { 163, -2 },
- { 194, -3 },
- { 197, -1 },
- { 197, -2 },
- { 197, -1 },
- { 195, -9 },
- { 206, -4 },
- { 206, -5 },
- { 198, -1 },
- { 198, -1 },
- { 198, 0 },
- { 209, 0 },
- { 199, -3 },
- { 199, -2 },
- { 199, -4 },
- { 210, -2 },
- { 210, 0 },
- { 200, 0 },
- { 200, -2 },
- { 212, -2 },
- { 212, 0 },
- { 211, -7 },
- { 211, -9 },
- { 211, -7 },
- { 211, -7 },
- { 159, 0 },
- { 159, -2 },
- { 193, -2 },
- { 213, -1 },
- { 213, -2 },
- { 213, -3 },
- { 213, -4 },
- { 215, -2 },
- { 215, 0 },
- { 214, 0 },
- { 214, -3 },
- { 214, -2 },
- { 216, -4 },
- { 216, 0 },
- { 204, 0 },
- { 204, -3 },
- { 186, -4 },
- { 186, -2 },
- { 175, -1 },
- { 175, -1 },
- { 175, 0 },
- { 202, 0 },
- { 202, -3 },
- { 203, 0 },
- { 203, -2 },
- { 205, 0 },
- { 205, -2 },
- { 205, -4 },
- { 205, -4 },
- { 149, -6 },
- { 201, 0 },
- { 201, -2 },
- { 149, -8 },
- { 218, -5 },
- { 218, -7 },
- { 218, -3 },
- { 218, -5 },
- { 149, -6 },
- { 149, -7 },
- { 219, -2 },
- { 219, -1 },
- { 220, 0 },
- { 220, -3 },
- { 217, -3 },
- { 217, -1 },
- { 173, -3 },
- { 173, -1 },
- { 173, -1 },
- { 173, -3 },
- { 173, -5 },
- { 172, -1 },
- { 172, -1 },
- { 172, -1 },
- { 173, -1 },
- { 173, -3 },
- { 173, -6 },
- { 173, -5 },
- { 173, -4 },
- { 172, -1 },
- { 173, -5 },
- { 173, -3 },
- { 173, -3 },
- { 173, -3 },
- { 173, -3 },
- { 173, -3 },
- { 173, -3 },
- { 173, -3 },
- { 173, -3 },
- { 221, -2 },
- { 173, -3 },
- { 173, -5 },
- { 173, -2 },
- { 173, -3 },
- { 173, -3 },
- { 173, -4 },
- { 173, -2 },
- { 173, -2 },
- { 173, -2 },
- { 173, -2 },
- { 222, -1 },
- { 222, -2 },
- { 173, -5 },
- { 223, -1 },
- { 223, -2 },
- { 173, -5 },
- { 173, -3 },
- { 173, -5 },
- { 173, -5 },
- { 173, -4 },
- { 173, -5 },
- { 226, -5 },
- { 226, -4 },
- { 227, -2 },
- { 227, 0 },
- { 225, -1 },
- { 225, 0 },
- { 208, 0 },
- { 207, -3 },
- { 207, -1 },
- { 224, 0 },
- { 224, -3 },
- { 149, -12 },
- { 228, -1 },
- { 228, 0 },
- { 177, 0 },
- { 177, -3 },
- { 187, -5 },
- { 187, -3 },
- { 229, 0 },
- { 229, -2 },
- { 149, -4 },
- { 149, -1 },
- { 149, -2 },
- { 149, -3 },
- { 149, -5 },
- { 149, -6 },
- { 149, -5 },
- { 149, -6 },
- { 169, -2 },
- { 170, -2 },
- { 149, -5 },
- { 231, -11 },
- { 233, -1 },
- { 233, -2 },
- { 233, 0 },
- { 234, -1 },
- { 234, -1 },
- { 234, -3 },
- { 236, 0 },
- { 236, -2 },
- { 232, -3 },
- { 232, -2 },
- { 238, -3 },
- { 239, -3 },
- { 239, -2 },
- { 237, -7 },
- { 237, -5 },
- { 237, -5 },
- { 237, -1 },
- { 173, -4 },
- { 173, -6 },
- { 191, -1 },
- { 191, -1 },
- { 191, -1 },
- { 149, -4 },
- { 149, -6 },
- { 149, -3 },
- { 241, 0 },
- { 241, -2 },
- { 149, -1 },
- { 149, -3 },
- { 149, -1 },
- { 149, -3 },
- { 149, -6 },
- { 149, -7 },
- { 242, -1 },
- { 149, -1 },
- { 149, -4 },
- { 244, -8 },
- { 246, 0 },
- { 247, -1 },
- { 247, -3 },
- { 248, -1 },
- { 196, 0 },
- { 196, -2 },
- { 196, -3 },
- { 250, -6 },
- { 250, -8 },
- { 144, -1 },
- { 145, -2 },
- { 145, -1 },
- { 146, -1 },
- { 146, -3 },
- { 147, 0 },
- { 151, 0 },
- { 151, -1 },
- { 151, -2 },
- { 153, -1 },
- { 153, 0 },
- { 149, -2 },
- { 160, -4 },
- { 160, -2 },
- { 152, -1 },
- { 152, -1 },
- { 152, -1 },
- { 166, -1 },
- { 167, -1 },
- { 168, -1 },
- { 168, -1 },
- { 165, -2 },
- { 165, 0 },
- { 171, -2 },
- { 161, -2 },
- { 183, -3 },
- { 183, -1 },
- { 184, 0 },
- { 188, -1 },
- { 190, -1 },
- { 194, -1 },
- { 195, -1 },
- { 209, -2 },
- { 210, -1 },
- { 173, -1 },
- { 221, -1 },
- { 208, -1 },
- { 230, -1 },
- { 230, -1 },
- { 230, -1 },
- { 230, -1 },
- { 230, -1 },
- { 169, -1 },
- { 235, 0 },
- { 235, -3 },
- { 238, -1 },
- { 239, 0 },
- { 240, -1 },
- { 240, 0 },
- { 243, 0 },
- { 243, -1 },
- { 245, -1 },
- { 245, -3 },
- { 246, -2 },
- { 249, 0 },
- { 249, -4 },
- { 249, -2 },
+ { 149, -1 }, /* (0) explain ::= EXPLAIN */
+ { 149, -3 }, /* (1) explain ::= EXPLAIN QUERY PLAN */
+ { 148, -1 }, /* (2) cmdx ::= cmd */
+ { 150, -3 }, /* (3) cmd ::= BEGIN transtype trans_opt */
+ { 151, 0 }, /* (4) transtype ::= */
+ { 151, -1 }, /* (5) transtype ::= DEFERRED */
+ { 151, -1 }, /* (6) transtype ::= IMMEDIATE */
+ { 151, -1 }, /* (7) transtype ::= EXCLUSIVE */
+ { 150, -2 }, /* (8) cmd ::= COMMIT|END trans_opt */
+ { 150, -2 }, /* (9) cmd ::= ROLLBACK trans_opt */
+ { 150, -2 }, /* (10) cmd ::= SAVEPOINT nm */
+ { 150, -3 }, /* (11) cmd ::= RELEASE savepoint_opt nm */
+ { 150, -5 }, /* (12) cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */
+ { 155, -6 }, /* (13) create_table ::= createkw temp TABLE ifnotexists nm dbnm */
+ { 157, -1 }, /* (14) createkw ::= CREATE */
+ { 159, 0 }, /* (15) ifnotexists ::= */
+ { 159, -3 }, /* (16) ifnotexists ::= IF NOT EXISTS */
+ { 158, -1 }, /* (17) temp ::= TEMP */
+ { 158, 0 }, /* (18) temp ::= */
+ { 156, -5 }, /* (19) create_table_args ::= LP columnlist conslist_opt RP table_options */
+ { 156, -2 }, /* (20) create_table_args ::= AS select */
+ { 163, 0 }, /* (21) table_options ::= */
+ { 163, -2 }, /* (22) table_options ::= WITHOUT nm */
+ { 165, -2 }, /* (23) columnname ::= nm typetoken */
+ { 167, 0 }, /* (24) typetoken ::= */
+ { 167, -4 }, /* (25) typetoken ::= typename LP signed RP */
+ { 167, -6 }, /* (26) typetoken ::= typename LP signed COMMA signed RP */
+ { 168, -2 }, /* (27) typename ::= typename ID|STRING */
+ { 172, 0 }, /* (28) scanpt ::= */
+ { 173, -2 }, /* (29) ccons ::= CONSTRAINT nm */
+ { 173, -4 }, /* (30) ccons ::= DEFAULT scanpt term scanpt */
+ { 173, -4 }, /* (31) ccons ::= DEFAULT LP expr RP */
+ { 173, -4 }, /* (32) ccons ::= DEFAULT PLUS term scanpt */
+ { 173, -4 }, /* (33) ccons ::= DEFAULT MINUS term scanpt */
+ { 173, -3 }, /* (34) ccons ::= DEFAULT scanpt ID|INDEXED */
+ { 173, -3 }, /* (35) ccons ::= NOT NULL onconf */
+ { 173, -5 }, /* (36) ccons ::= PRIMARY KEY sortorder onconf autoinc */
+ { 173, -2 }, /* (37) ccons ::= UNIQUE onconf */
+ { 173, -4 }, /* (38) ccons ::= CHECK LP expr RP */
+ { 173, -4 }, /* (39) ccons ::= REFERENCES nm eidlist_opt refargs */
+ { 173, -1 }, /* (40) ccons ::= defer_subclause */
+ { 173, -2 }, /* (41) ccons ::= COLLATE ID|STRING */
+ { 178, 0 }, /* (42) autoinc ::= */
+ { 178, -1 }, /* (43) autoinc ::= AUTOINCR */
+ { 180, 0 }, /* (44) refargs ::= */
+ { 180, -2 }, /* (45) refargs ::= refargs refarg */
+ { 182, -2 }, /* (46) refarg ::= MATCH nm */
+ { 182, -3 }, /* (47) refarg ::= ON INSERT refact */
+ { 182, -3 }, /* (48) refarg ::= ON DELETE refact */
+ { 182, -3 }, /* (49) refarg ::= ON UPDATE refact */
+ { 183, -2 }, /* (50) refact ::= SET NULL */
+ { 183, -2 }, /* (51) refact ::= SET DEFAULT */
+ { 183, -1 }, /* (52) refact ::= CASCADE */
+ { 183, -1 }, /* (53) refact ::= RESTRICT */
+ { 183, -2 }, /* (54) refact ::= NO ACTION */
+ { 181, -3 }, /* (55) defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */
+ { 181, -2 }, /* (56) defer_subclause ::= DEFERRABLE init_deferred_pred_opt */
+ { 184, 0 }, /* (57) init_deferred_pred_opt ::= */
+ { 184, -2 }, /* (58) init_deferred_pred_opt ::= INITIALLY DEFERRED */
+ { 184, -2 }, /* (59) init_deferred_pred_opt ::= INITIALLY IMMEDIATE */
+ { 162, 0 }, /* (60) conslist_opt ::= */
+ { 186, -1 }, /* (61) tconscomma ::= COMMA */
+ { 187, -2 }, /* (62) tcons ::= CONSTRAINT nm */
+ { 187, -7 }, /* (63) tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */
+ { 187, -5 }, /* (64) tcons ::= UNIQUE LP sortlist RP onconf */
+ { 187, -5 }, /* (65) tcons ::= CHECK LP expr RP onconf */
+ { 187, -10 }, /* (66) tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */
+ { 190, 0 }, /* (67) defer_subclause_opt ::= */
+ { 176, 0 }, /* (68) onconf ::= */
+ { 176, -3 }, /* (69) onconf ::= ON CONFLICT resolvetype */
+ { 191, 0 }, /* (70) orconf ::= */
+ { 191, -2 }, /* (71) orconf ::= OR resolvetype */
+ { 192, -1 }, /* (72) resolvetype ::= IGNORE */
+ { 192, -1 }, /* (73) resolvetype ::= REPLACE */
+ { 150, -4 }, /* (74) cmd ::= DROP TABLE ifexists fullname */
+ { 194, -2 }, /* (75) ifexists ::= IF EXISTS */
+ { 194, 0 }, /* (76) ifexists ::= */
+ { 150, -9 }, /* (77) cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */
+ { 150, -4 }, /* (78) cmd ::= DROP VIEW ifexists fullname */
+ { 150, -1 }, /* (79) cmd ::= select */
+ { 164, -3 }, /* (80) select ::= WITH wqlist selectnowith */
+ { 164, -4 }, /* (81) select ::= WITH RECURSIVE wqlist selectnowith */
+ { 164, -1 }, /* (82) select ::= selectnowith */
+ { 196, -3 }, /* (83) selectnowith ::= selectnowith multiselect_op oneselect */
+ { 199, -1 }, /* (84) multiselect_op ::= UNION */
+ { 199, -2 }, /* (85) multiselect_op ::= UNION ALL */
+ { 199, -1 }, /* (86) multiselect_op ::= EXCEPT|INTERSECT */
+ { 197, -9 }, /* (87) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
+ { 208, -4 }, /* (88) values ::= VALUES LP nexprlist RP */
+ { 208, -5 }, /* (89) values ::= values COMMA LP exprlist RP */
+ { 200, -1 }, /* (90) distinct ::= DISTINCT */
+ { 200, -1 }, /* (91) distinct ::= ALL */
+ { 200, 0 }, /* (92) distinct ::= */
+ { 211, 0 }, /* (93) sclp ::= */
+ { 201, -5 }, /* (94) selcollist ::= sclp scanpt expr scanpt as */
+ { 201, -3 }, /* (95) selcollist ::= sclp scanpt STAR */
+ { 201, -5 }, /* (96) selcollist ::= sclp scanpt nm DOT STAR */
+ { 212, -2 }, /* (97) as ::= AS nm */
+ { 212, 0 }, /* (98) as ::= */
+ { 202, 0 }, /* (99) from ::= */
+ { 202, -2 }, /* (100) from ::= FROM seltablist */
+ { 214, -2 }, /* (101) stl_prefix ::= seltablist joinop */
+ { 214, 0 }, /* (102) stl_prefix ::= */
+ { 213, -7 }, /* (103) seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */
+ { 213, -9 }, /* (104) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */
+ { 213, -7 }, /* (105) seltablist ::= stl_prefix LP select RP as on_opt using_opt */
+ { 213, -7 }, /* (106) seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */
+ { 160, 0 }, /* (107) dbnm ::= */
+ { 160, -2 }, /* (108) dbnm ::= DOT nm */
+ { 195, -1 }, /* (109) fullname ::= nm */
+ { 195, -3 }, /* (110) fullname ::= nm DOT nm */
+ { 219, -1 }, /* (111) xfullname ::= nm */
+ { 219, -3 }, /* (112) xfullname ::= nm DOT nm */
+ { 219, -5 }, /* (113) xfullname ::= nm DOT nm AS nm */
+ { 219, -3 }, /* (114) xfullname ::= nm AS nm */
+ { 215, -1 }, /* (115) joinop ::= COMMA|JOIN */
+ { 215, -2 }, /* (116) joinop ::= JOIN_KW JOIN */
+ { 215, -3 }, /* (117) joinop ::= JOIN_KW nm JOIN */
+ { 215, -4 }, /* (118) joinop ::= JOIN_KW nm nm JOIN */
+ { 217, -2 }, /* (119) on_opt ::= ON expr */
+ { 217, 0 }, /* (120) on_opt ::= */
+ { 216, 0 }, /* (121) indexed_opt ::= */
+ { 216, -3 }, /* (122) indexed_opt ::= INDEXED BY nm */
+ { 216, -2 }, /* (123) indexed_opt ::= NOT INDEXED */
+ { 218, -4 }, /* (124) using_opt ::= USING LP idlist RP */
+ { 218, 0 }, /* (125) using_opt ::= */
+ { 206, 0 }, /* (126) orderby_opt ::= */
+ { 206, -3 }, /* (127) orderby_opt ::= ORDER BY sortlist */
+ { 188, -4 }, /* (128) sortlist ::= sortlist COMMA expr sortorder */
+ { 188, -2 }, /* (129) sortlist ::= expr sortorder */
+ { 177, -1 }, /* (130) sortorder ::= ASC */
+ { 177, -1 }, /* (131) sortorder ::= DESC */
+ { 177, 0 }, /* (132) sortorder ::= */
+ { 204, 0 }, /* (133) groupby_opt ::= */
+ { 204, -3 }, /* (134) groupby_opt ::= GROUP BY nexprlist */
+ { 205, 0 }, /* (135) having_opt ::= */
+ { 205, -2 }, /* (136) having_opt ::= HAVING expr */
+ { 207, 0 }, /* (137) limit_opt ::= */
+ { 207, -2 }, /* (138) limit_opt ::= LIMIT expr */
+ { 207, -4 }, /* (139) limit_opt ::= LIMIT expr OFFSET expr */
+ { 207, -4 }, /* (140) limit_opt ::= LIMIT expr COMMA expr */
+ { 150, -6 }, /* (141) cmd ::= with DELETE FROM xfullname indexed_opt where_opt */
+ { 203, 0 }, /* (142) where_opt ::= */
+ { 203, -2 }, /* (143) where_opt ::= WHERE expr */
+ { 150, -8 }, /* (144) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt */
+ { 222, -5 }, /* (145) setlist ::= setlist COMMA nm EQ expr */
+ { 222, -7 }, /* (146) setlist ::= setlist COMMA LP idlist RP EQ expr */
+ { 222, -3 }, /* (147) setlist ::= nm EQ expr */
+ { 222, -5 }, /* (148) setlist ::= LP idlist RP EQ expr */
+ { 150, -7 }, /* (149) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */
+ { 150, -7 }, /* (150) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES */
+ { 225, 0 }, /* (151) upsert ::= */
+ { 225, -11 }, /* (152) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt */
+ { 225, -8 }, /* (153) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING */
+ { 225, -4 }, /* (154) upsert ::= ON CONFLICT DO NOTHING */
+ { 223, -2 }, /* (155) insert_cmd ::= INSERT orconf */
+ { 223, -1 }, /* (156) insert_cmd ::= REPLACE */
+ { 224, 0 }, /* (157) idlist_opt ::= */
+ { 224, -3 }, /* (158) idlist_opt ::= LP idlist RP */
+ { 220, -3 }, /* (159) idlist ::= idlist COMMA nm */
+ { 220, -1 }, /* (160) idlist ::= nm */
+ { 175, -3 }, /* (161) expr ::= LP expr RP */
+ { 175, -1 }, /* (162) expr ::= ID|INDEXED */
+ { 175, -1 }, /* (163) expr ::= JOIN_KW */
+ { 175, -3 }, /* (164) expr ::= nm DOT nm */
+ { 175, -5 }, /* (165) expr ::= nm DOT nm DOT nm */
+ { 174, -1 }, /* (166) term ::= NULL|FLOAT|BLOB */
+ { 174, -1 }, /* (167) term ::= STRING */
+ { 174, -1 }, /* (168) term ::= INTEGER */
+ { 175, -1 }, /* (169) expr ::= VARIABLE */
+ { 175, -3 }, /* (170) expr ::= expr COLLATE ID|STRING */
+ { 175, -6 }, /* (171) expr ::= CAST LP expr AS typetoken RP */
+ { 175, -5 }, /* (172) expr ::= ID|INDEXED LP distinct exprlist RP */
+ { 175, -4 }, /* (173) expr ::= ID|INDEXED LP STAR RP */
+ { 174, -1 }, /* (174) term ::= CTIME_KW */
+ { 175, -5 }, /* (175) expr ::= LP nexprlist COMMA expr RP */
+ { 175, -3 }, /* (176) expr ::= expr AND expr */
+ { 175, -3 }, /* (177) expr ::= expr OR expr */
+ { 175, -3 }, /* (178) expr ::= expr LT|GT|GE|LE expr */
+ { 175, -3 }, /* (179) expr ::= expr EQ|NE expr */
+ { 175, -3 }, /* (180) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */
+ { 175, -3 }, /* (181) expr ::= expr PLUS|MINUS expr */
+ { 175, -3 }, /* (182) expr ::= expr STAR|SLASH|REM expr */
+ { 175, -3 }, /* (183) expr ::= expr CONCAT expr */
+ { 226, -2 }, /* (184) likeop ::= NOT LIKE_KW|MATCH */
+ { 175, -3 }, /* (185) expr ::= expr likeop expr */
+ { 175, -5 }, /* (186) expr ::= expr likeop expr ESCAPE expr */
+ { 175, -2 }, /* (187) expr ::= expr ISNULL|NOTNULL */
+ { 175, -3 }, /* (188) expr ::= expr NOT NULL */
+ { 175, -3 }, /* (189) expr ::= expr IS expr */
+ { 175, -4 }, /* (190) expr ::= expr IS NOT expr */
+ { 175, -2 }, /* (191) expr ::= NOT expr */
+ { 175, -2 }, /* (192) expr ::= BITNOT expr */
+ { 175, -2 }, /* (193) expr ::= MINUS expr */
+ { 175, -2 }, /* (194) expr ::= PLUS expr */
+ { 227, -1 }, /* (195) between_op ::= BETWEEN */
+ { 227, -2 }, /* (196) between_op ::= NOT BETWEEN */
+ { 175, -5 }, /* (197) expr ::= expr between_op expr AND expr */
+ { 228, -1 }, /* (198) in_op ::= IN */
+ { 228, -2 }, /* (199) in_op ::= NOT IN */
+ { 175, -5 }, /* (200) expr ::= expr in_op LP exprlist RP */
+ { 175, -3 }, /* (201) expr ::= LP select RP */
+ { 175, -5 }, /* (202) expr ::= expr in_op LP select RP */
+ { 175, -5 }, /* (203) expr ::= expr in_op nm dbnm paren_exprlist */
+ { 175, -4 }, /* (204) expr ::= EXISTS LP select RP */
+ { 175, -5 }, /* (205) expr ::= CASE case_operand case_exprlist case_else END */
+ { 231, -5 }, /* (206) case_exprlist ::= case_exprlist WHEN expr THEN expr */
+ { 231, -4 }, /* (207) case_exprlist ::= WHEN expr THEN expr */
+ { 232, -2 }, /* (208) case_else ::= ELSE expr */
+ { 232, 0 }, /* (209) case_else ::= */
+ { 230, -1 }, /* (210) case_operand ::= expr */
+ { 230, 0 }, /* (211) case_operand ::= */
+ { 210, 0 }, /* (212) exprlist ::= */
+ { 209, -3 }, /* (213) nexprlist ::= nexprlist COMMA expr */
+ { 209, -1 }, /* (214) nexprlist ::= expr */
+ { 229, 0 }, /* (215) paren_exprlist ::= */
+ { 229, -3 }, /* (216) paren_exprlist ::= LP exprlist RP */
+ { 150, -12 }, /* (217) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */
+ { 233, -1 }, /* (218) uniqueflag ::= UNIQUE */
+ { 233, 0 }, /* (219) uniqueflag ::= */
+ { 179, 0 }, /* (220) eidlist_opt ::= */
+ { 179, -3 }, /* (221) eidlist_opt ::= LP eidlist RP */
+ { 189, -5 }, /* (222) eidlist ::= eidlist COMMA nm collate sortorder */
+ { 189, -3 }, /* (223) eidlist ::= nm collate sortorder */
+ { 234, 0 }, /* (224) collate ::= */
+ { 234, -2 }, /* (225) collate ::= COLLATE ID|STRING */
+ { 150, -4 }, /* (226) cmd ::= DROP INDEX ifexists fullname */
+ { 150, -1 }, /* (227) cmd ::= VACUUM */
+ { 150, -2 }, /* (228) cmd ::= VACUUM nm */
+ { 150, -3 }, /* (229) cmd ::= PRAGMA nm dbnm */
+ { 150, -5 }, /* (230) cmd ::= PRAGMA nm dbnm EQ nmnum */
+ { 150, -6 }, /* (231) cmd ::= PRAGMA nm dbnm LP nmnum RP */
+ { 150, -5 }, /* (232) cmd ::= PRAGMA nm dbnm EQ minus_num */
+ { 150, -6 }, /* (233) cmd ::= PRAGMA nm dbnm LP minus_num RP */
+ { 170, -2 }, /* (234) plus_num ::= PLUS INTEGER|FLOAT */
+ { 171, -2 }, /* (235) minus_num ::= MINUS INTEGER|FLOAT */
+ { 150, -5 }, /* (236) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */
+ { 236, -11 }, /* (237) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */
+ { 238, -1 }, /* (238) trigger_time ::= BEFORE|AFTER */
+ { 238, -2 }, /* (239) trigger_time ::= INSTEAD OF */
+ { 238, 0 }, /* (240) trigger_time ::= */
+ { 239, -1 }, /* (241) trigger_event ::= DELETE|INSERT */
+ { 239, -1 }, /* (242) trigger_event ::= UPDATE */
+ { 239, -3 }, /* (243) trigger_event ::= UPDATE OF idlist */
+ { 241, 0 }, /* (244) when_clause ::= */
+ { 241, -2 }, /* (245) when_clause ::= WHEN expr */
+ { 237, -3 }, /* (246) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */
+ { 237, -2 }, /* (247) trigger_cmd_list ::= trigger_cmd SEMI */
+ { 243, -3 }, /* (248) trnm ::= nm DOT nm */
+ { 244, -3 }, /* (249) tridxby ::= INDEXED BY nm */
+ { 244, -2 }, /* (250) tridxby ::= NOT INDEXED */
+ { 242, -8 }, /* (251) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */
+ { 242, -8 }, /* (252) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */
+ { 242, -6 }, /* (253) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */
+ { 242, -3 }, /* (254) trigger_cmd ::= scanpt select scanpt */
+ { 175, -4 }, /* (255) expr ::= RAISE LP IGNORE RP */
+ { 175, -6 }, /* (256) expr ::= RAISE LP raisetype COMMA nm RP */
+ { 193, -1 }, /* (257) raisetype ::= ROLLBACK */
+ { 193, -1 }, /* (258) raisetype ::= ABORT */
+ { 193, -1 }, /* (259) raisetype ::= FAIL */
+ { 150, -4 }, /* (260) cmd ::= DROP TRIGGER ifexists fullname */
+ { 150, -6 }, /* (261) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */
+ { 150, -3 }, /* (262) cmd ::= DETACH database_kw_opt expr */
+ { 246, 0 }, /* (263) key_opt ::= */
+ { 246, -2 }, /* (264) key_opt ::= KEY expr */
+ { 150, -1 }, /* (265) cmd ::= REINDEX */
+ { 150, -3 }, /* (266) cmd ::= REINDEX nm dbnm */
+ { 150, -1 }, /* (267) cmd ::= ANALYZE */
+ { 150, -3 }, /* (268) cmd ::= ANALYZE nm dbnm */
+ { 150, -6 }, /* (269) cmd ::= ALTER TABLE fullname RENAME TO nm */
+ { 150, -7 }, /* (270) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */
+ { 247, -1 }, /* (271) add_column_fullname ::= fullname */
+ { 150, -1 }, /* (272) cmd ::= create_vtab */
+ { 150, -4 }, /* (273) cmd ::= create_vtab LP vtabarglist RP */
+ { 249, -8 }, /* (274) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */
+ { 251, 0 }, /* (275) vtabarg ::= */
+ { 252, -1 }, /* (276) vtabargtoken ::= ANY */
+ { 252, -3 }, /* (277) vtabargtoken ::= lp anylist RP */
+ { 253, -1 }, /* (278) lp ::= LP */
+ { 221, -2 }, /* (279) with ::= WITH wqlist */
+ { 221, -3 }, /* (280) with ::= WITH RECURSIVE wqlist */
+ { 198, -6 }, /* (281) wqlist ::= nm eidlist_opt AS LP select RP */
+ { 198, -8 }, /* (282) wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */
+ { 145, -1 }, /* (283) input ::= cmdlist */
+ { 146, -2 }, /* (284) cmdlist ::= cmdlist ecmd */
+ { 146, -1 }, /* (285) cmdlist ::= ecmd */
+ { 147, -1 }, /* (286) ecmd ::= SEMI */
+ { 147, -2 }, /* (287) ecmd ::= cmdx SEMI */
+ { 147, -2 }, /* (288) ecmd ::= explain cmdx */
+ { 152, 0 }, /* (289) trans_opt ::= */
+ { 152, -1 }, /* (290) trans_opt ::= TRANSACTION */
+ { 152, -2 }, /* (291) trans_opt ::= TRANSACTION nm */
+ { 154, -1 }, /* (292) savepoint_opt ::= SAVEPOINT */
+ { 154, 0 }, /* (293) savepoint_opt ::= */
+ { 150, -2 }, /* (294) cmd ::= create_table create_table_args */
+ { 161, -4 }, /* (295) columnlist ::= columnlist COMMA columnname carglist */
+ { 161, -2 }, /* (296) columnlist ::= columnname carglist */
+ { 153, -1 }, /* (297) nm ::= ID|INDEXED */
+ { 153, -1 }, /* (298) nm ::= STRING */
+ { 153, -1 }, /* (299) nm ::= JOIN_KW */
+ { 167, -1 }, /* (300) typetoken ::= typename */
+ { 168, -1 }, /* (301) typename ::= ID|STRING */
+ { 169, -1 }, /* (302) signed ::= plus_num */
+ { 169, -1 }, /* (303) signed ::= minus_num */
+ { 166, -2 }, /* (304) carglist ::= carglist ccons */
+ { 166, 0 }, /* (305) carglist ::= */
+ { 173, -2 }, /* (306) ccons ::= NULL onconf */
+ { 162, -2 }, /* (307) conslist_opt ::= COMMA conslist */
+ { 185, -3 }, /* (308) conslist ::= conslist tconscomma tcons */
+ { 185, -1 }, /* (309) conslist ::= tcons */
+ { 186, 0 }, /* (310) tconscomma ::= */
+ { 190, -1 }, /* (311) defer_subclause_opt ::= defer_subclause */
+ { 192, -1 }, /* (312) resolvetype ::= raisetype */
+ { 196, -1 }, /* (313) selectnowith ::= oneselect */
+ { 197, -1 }, /* (314) oneselect ::= values */
+ { 211, -2 }, /* (315) sclp ::= selcollist COMMA */
+ { 212, -1 }, /* (316) as ::= ID|STRING */
+ { 175, -1 }, /* (317) expr ::= term */
+ { 226, -1 }, /* (318) likeop ::= LIKE_KW|MATCH */
+ { 210, -1 }, /* (319) exprlist ::= nexprlist */
+ { 235, -1 }, /* (320) nmnum ::= plus_num */
+ { 235, -1 }, /* (321) nmnum ::= nm */
+ { 235, -1 }, /* (322) nmnum ::= ON */
+ { 235, -1 }, /* (323) nmnum ::= DELETE */
+ { 235, -1 }, /* (324) nmnum ::= DEFAULT */
+ { 170, -1 }, /* (325) plus_num ::= INTEGER|FLOAT */
+ { 240, 0 }, /* (326) foreach_clause ::= */
+ { 240, -3 }, /* (327) foreach_clause ::= FOR EACH ROW */
+ { 243, -1 }, /* (328) trnm ::= nm */
+ { 244, 0 }, /* (329) tridxby ::= */
+ { 245, -1 }, /* (330) database_kw_opt ::= DATABASE */
+ { 245, 0 }, /* (331) database_kw_opt ::= */
+ { 248, 0 }, /* (332) kwcolumn_opt ::= */
+ { 248, -1 }, /* (333) kwcolumn_opt ::= COLUMNKW */
+ { 250, -1 }, /* (334) vtabarglist ::= vtabarg */
+ { 250, -3 }, /* (335) vtabarglist ::= vtabarglist COMMA vtabarg */
+ { 251, -2 }, /* (336) vtabarg ::= vtabarg vtabargtoken */
+ { 254, 0 }, /* (337) anylist ::= */
+ { 254, -4 }, /* (338) anylist ::= anylist LP anylist RP */
+ { 254, -2 }, /* (339) anylist ::= anylist ANY */
+ { 221, 0 }, /* (340) with ::= */
};
static void yy_accept(yyParser*); /* Forward Declaration */
@@ -139131,22 +143847,39 @@ static void yy_accept(yyParser*); /* Forward Declaration */
/*
** Perform a reduce action and the shift that must immediately
** follow the reduce.
+**
+** The yyLookahead and yyLookaheadToken parameters provide reduce actions
+** access to the lookahead token (if any). The yyLookahead will be YYNOCODE
+** if the lookahead token has already been consumed. As this procedure is
+** only called from one place, optimizing compilers will in-line it, which
+** means that the extra parameters have no performance impact.
*/
-static void yy_reduce(
+static YYACTIONTYPE yy_reduce(
yyParser *yypParser, /* The parser */
- unsigned int yyruleno /* Number of the rule by which to reduce */
+ unsigned int yyruleno, /* Number of the rule by which to reduce */
+ int yyLookahead, /* Lookahead token, or YYNOCODE if none */
+ sqlite3ParserTOKENTYPE yyLookaheadToken /* Value of the lookahead token */
+ sqlite3ParserCTX_PDECL /* %extra_context */
){
int yygoto; /* The next state */
int yyact; /* The next action */
yyStackEntry *yymsp; /* The top of the parser's stack */
int yysize; /* Amount to pop the stack */
- sqlite3ParserARG_FETCH;
+ sqlite3ParserARG_FETCH
+ (void)yyLookahead;
+ (void)yyLookaheadToken;
yymsp = yypParser->yytos;
#ifndef NDEBUG
if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){
yysize = yyRuleInfo[yyruleno].nrhs;
- fprintf(yyTraceFILE, "%sReduce [%s], go to state %d.\n", yyTracePrompt,
- yyRuleName[yyruleno], yymsp[yysize].stateno);
+ if( yysize ){
+ fprintf(yyTraceFILE, "%sReduce %d [%s], go to state %d.\n",
+ yyTracePrompt,
+ yyruleno, yyRuleName[yyruleno], yymsp[yysize].stateno);
+ }else{
+ fprintf(yyTraceFILE, "%sReduce %d [%s].\n",
+ yyTracePrompt, yyruleno, yyRuleName[yyruleno]);
+ }
}
#endif /* NDEBUG */
@@ -139163,13 +143896,19 @@ static void yy_reduce(
#if YYSTACKDEPTH>0
if( yypParser->yytos>=yypParser->yystackEnd ){
yyStackOverflow(yypParser);
- return;
+ /* The call to yyStackOverflow() above pops the stack until it is
+ ** empty, causing the main parser loop to exit. So the return value
+ ** is never used and does not matter. */
+ return 0;
}
#else
if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){
if( yyGrowStack(yypParser) ){
yyStackOverflow(yypParser);
- return;
+ /* The call to yyStackOverflow() above pops the stack until it is
+ ** empty, causing the main parser loop to exit. So the return value
+ ** is never used and does not matter. */
+ return 0;
}
yymsp = yypParser->yytos;
}
@@ -139197,15 +143936,15 @@ static void yy_reduce(
{ sqlite3FinishCoding(pParse); }
break;
case 3: /* cmd ::= BEGIN transtype trans_opt */
-{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy194);}
+{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy502);}
break;
case 4: /* transtype ::= */
-{yymsp[1].minor.yy194 = TK_DEFERRED;}
+{yymsp[1].minor.yy502 = TK_DEFERRED;}
break;
case 5: /* transtype ::= DEFERRED */
case 6: /* transtype ::= IMMEDIATE */ yytestcase(yyruleno==6);
case 7: /* transtype ::= EXCLUSIVE */ yytestcase(yyruleno==7);
-{yymsp[0].minor.yy194 = yymsp[0].major; /*A-overwrites-X*/}
+{yymsp[0].minor.yy502 = yymsp[0].major; /*A-overwrites-X*/}
break;
case 8: /* cmd ::= COMMIT|END trans_opt */
case 9: /* cmd ::= ROLLBACK trans_opt */ yytestcase(yyruleno==9);
@@ -139228,7 +143967,7 @@ static void yy_reduce(
break;
case 13: /* create_table ::= createkw temp TABLE ifnotexists nm dbnm */
{
- sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy194,0,0,yymsp[-2].minor.yy194);
+ sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy502,0,0,yymsp[-2].minor.yy502);
}
break;
case 14: /* createkw ::= CREATE */
@@ -139237,38 +143976,38 @@ static void yy_reduce(
case 15: /* ifnotexists ::= */
case 18: /* temp ::= */ yytestcase(yyruleno==18);
case 21: /* table_options ::= */ yytestcase(yyruleno==21);
- case 41: /* autoinc ::= */ yytestcase(yyruleno==41);
- case 56: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==56);
- case 66: /* defer_subclause_opt ::= */ yytestcase(yyruleno==66);
- case 75: /* ifexists ::= */ yytestcase(yyruleno==75);
- case 89: /* distinct ::= */ yytestcase(yyruleno==89);
- case 212: /* collate ::= */ yytestcase(yyruleno==212);
-{yymsp[1].minor.yy194 = 0;}
+ case 42: /* autoinc ::= */ yytestcase(yyruleno==42);
+ case 57: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==57);
+ case 67: /* defer_subclause_opt ::= */ yytestcase(yyruleno==67);
+ case 76: /* ifexists ::= */ yytestcase(yyruleno==76);
+ case 92: /* distinct ::= */ yytestcase(yyruleno==92);
+ case 224: /* collate ::= */ yytestcase(yyruleno==224);
+{yymsp[1].minor.yy502 = 0;}
break;
case 16: /* ifnotexists ::= IF NOT EXISTS */
-{yymsp[-2].minor.yy194 = 1;}
+{yymsp[-2].minor.yy502 = 1;}
break;
case 17: /* temp ::= TEMP */
- case 42: /* autoinc ::= AUTOINCR */ yytestcase(yyruleno==42);
-{yymsp[0].minor.yy194 = 1;}
+ case 43: /* autoinc ::= AUTOINCR */ yytestcase(yyruleno==43);
+{yymsp[0].minor.yy502 = 1;}
break;
case 19: /* create_table_args ::= LP columnlist conslist_opt RP table_options */
{
- sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy194,0);
+ sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy502,0);
}
break;
case 20: /* create_table_args ::= AS select */
{
- sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy243);
- sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy243);
+ sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy399);
+ sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy399);
}
break;
case 22: /* table_options ::= WITHOUT nm */
{
if( yymsp[0].minor.yy0.n==5 && sqlite3_strnicmp(yymsp[0].minor.yy0.z,"rowid",5)==0 ){
- yymsp[-1].minor.yy194 = TF_WithoutRowid | TF_NoVisibleRowid;
+ yymsp[-1].minor.yy502 = TF_WithoutRowid | TF_NoVisibleRowid;
}else{
- yymsp[-1].minor.yy194 = 0;
+ yymsp[-1].minor.yy502 = 0;
sqlite3ErrorMsg(pParse, "unknown table option: %.*s", yymsp[0].minor.yy0.n, yymsp[0].minor.yy0.z);
}
}
@@ -139277,8 +144016,8 @@ static void yy_reduce(
{sqlite3AddColumn(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
break;
case 24: /* typetoken ::= */
- case 59: /* conslist_opt ::= */ yytestcase(yyruleno==59);
- case 95: /* as ::= */ yytestcase(yyruleno==95);
+ case 60: /* conslist_opt ::= */ yytestcase(yyruleno==60);
+ case 98: /* as ::= */ yytestcase(yyruleno==98);
{yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.z = 0;}
break;
case 25: /* typetoken ::= typename LP signed RP */
@@ -139294,210 +144033,239 @@ static void yy_reduce(
case 27: /* typename ::= typename ID|STRING */
{yymsp[-1].minor.yy0.n=yymsp[0].minor.yy0.n+(int)(yymsp[0].minor.yy0.z-yymsp[-1].minor.yy0.z);}
break;
- case 28: /* ccons ::= CONSTRAINT nm */
- case 61: /* tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==61);
+ case 28: /* scanpt ::= */
+{
+ assert( yyLookahead!=YYNOCODE );
+ yymsp[1].minor.yy36 = yyLookaheadToken.z;
+}
+ break;
+ case 29: /* ccons ::= CONSTRAINT nm */
+ case 62: /* tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==62);
{pParse->constraintName = yymsp[0].minor.yy0;}
break;
- case 29: /* ccons ::= DEFAULT term */
- case 31: /* ccons ::= DEFAULT PLUS term */ yytestcase(yyruleno==31);
-{sqlite3AddDefaultValue(pParse,&yymsp[0].minor.yy190);}
+ case 30: /* ccons ::= DEFAULT scanpt term scanpt */
+{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy182,yymsp[-2].minor.yy36,yymsp[0].minor.yy36);}
break;
- case 30: /* ccons ::= DEFAULT LP expr RP */
-{sqlite3AddDefaultValue(pParse,&yymsp[-1].minor.yy190);}
+ case 31: /* ccons ::= DEFAULT LP expr RP */
+{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy182,yymsp[-2].minor.yy0.z+1,yymsp[0].minor.yy0.z);}
break;
- case 32: /* ccons ::= DEFAULT MINUS term */
+ case 32: /* ccons ::= DEFAULT PLUS term scanpt */
+{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy182,yymsp[-2].minor.yy0.z,yymsp[0].minor.yy36);}
+ break;
+ case 33: /* ccons ::= DEFAULT MINUS term scanpt */
{
- ExprSpan v;
- v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy190.pExpr, 0);
- v.zStart = yymsp[-1].minor.yy0.z;
- v.zEnd = yymsp[0].minor.yy190.zEnd;
- sqlite3AddDefaultValue(pParse,&v);
+ Expr *p = sqlite3PExpr(pParse, TK_UMINUS, yymsp[-1].minor.yy182, 0);
+ sqlite3AddDefaultValue(pParse,p,yymsp[-2].minor.yy0.z,yymsp[0].minor.yy36);
}
break;
- case 33: /* ccons ::= DEFAULT ID|INDEXED */
+ case 34: /* ccons ::= DEFAULT scanpt ID|INDEXED */
{
- ExprSpan v;
- spanExpr(&v, pParse, TK_STRING, yymsp[0].minor.yy0);
- sqlite3AddDefaultValue(pParse,&v);
+ Expr *p = tokenExpr(pParse, TK_STRING, yymsp[0].minor.yy0);
+ if( p ){
+ sqlite3ExprIdToTrueFalse(p);
+ testcase( p->op==TK_TRUEFALSE && sqlite3ExprTruthValue(p) );
+ }
+ sqlite3AddDefaultValue(pParse,p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.z+yymsp[0].minor.yy0.n);
}
break;
- case 34: /* ccons ::= NOT NULL onconf */
-{sqlite3AddNotNull(pParse, yymsp[0].minor.yy194);}
+ case 35: /* ccons ::= NOT NULL onconf */
+{sqlite3AddNotNull(pParse, yymsp[0].minor.yy502);}
break;
- case 35: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */
-{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy194,yymsp[0].minor.yy194,yymsp[-2].minor.yy194);}
+ case 36: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */
+{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy502,yymsp[0].minor.yy502,yymsp[-2].minor.yy502);}
break;
- case 36: /* ccons ::= UNIQUE onconf */
-{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy194,0,0,0,0,
+ case 37: /* ccons ::= UNIQUE onconf */
+{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy502,0,0,0,0,
SQLITE_IDXTYPE_UNIQUE);}
break;
- case 37: /* ccons ::= CHECK LP expr RP */
-{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy190.pExpr);}
+ case 38: /* ccons ::= CHECK LP expr RP */
+{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy182);}
break;
- case 38: /* ccons ::= REFERENCES nm eidlist_opt refargs */
-{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy148,yymsp[0].minor.yy194);}
+ case 39: /* ccons ::= REFERENCES nm eidlist_opt refargs */
+{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy232,yymsp[0].minor.yy502);}
break;
- case 39: /* ccons ::= defer_subclause */
-{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy194);}
+ case 40: /* ccons ::= defer_subclause */
+{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy502);}
break;
- case 40: /* ccons ::= COLLATE ID|STRING */
+ case 41: /* ccons ::= COLLATE ID|STRING */
{sqlite3AddCollateType(pParse, &yymsp[0].minor.yy0);}
break;
- case 43: /* refargs ::= */
-{ yymsp[1].minor.yy194 = OE_None*0x0101; /* EV: R-19803-45884 */}
+ case 44: /* refargs ::= */
+{ yymsp[1].minor.yy502 = OE_None*0x0101; /* EV: R-19803-45884 */}
break;
- case 44: /* refargs ::= refargs refarg */
-{ yymsp[-1].minor.yy194 = (yymsp[-1].minor.yy194 & ~yymsp[0].minor.yy497.mask) | yymsp[0].minor.yy497.value; }
+ case 45: /* refargs ::= refargs refarg */
+{ yymsp[-1].minor.yy502 = (yymsp[-1].minor.yy502 & ~yymsp[0].minor.yy107.mask) | yymsp[0].minor.yy107.value; }
break;
- case 45: /* refarg ::= MATCH nm */
-{ yymsp[-1].minor.yy497.value = 0; yymsp[-1].minor.yy497.mask = 0x000000; }
+ case 46: /* refarg ::= MATCH nm */
+{ yymsp[-1].minor.yy107.value = 0; yymsp[-1].minor.yy107.mask = 0x000000; }
break;
- case 46: /* refarg ::= ON INSERT refact */
-{ yymsp[-2].minor.yy497.value = 0; yymsp[-2].minor.yy497.mask = 0x000000; }
+ case 47: /* refarg ::= ON INSERT refact */
+{ yymsp[-2].minor.yy107.value = 0; yymsp[-2].minor.yy107.mask = 0x000000; }
break;
- case 47: /* refarg ::= ON DELETE refact */
-{ yymsp[-2].minor.yy497.value = yymsp[0].minor.yy194; yymsp[-2].minor.yy497.mask = 0x0000ff; }
+ case 48: /* refarg ::= ON DELETE refact */
+{ yymsp[-2].minor.yy107.value = yymsp[0].minor.yy502; yymsp[-2].minor.yy107.mask = 0x0000ff; }
break;
- case 48: /* refarg ::= ON UPDATE refact */
-{ yymsp[-2].minor.yy497.value = yymsp[0].minor.yy194<<8; yymsp[-2].minor.yy497.mask = 0x00ff00; }
+ case 49: /* refarg ::= ON UPDATE refact */
+{ yymsp[-2].minor.yy107.value = yymsp[0].minor.yy502<<8; yymsp[-2].minor.yy107.mask = 0x00ff00; }
break;
- case 49: /* refact ::= SET NULL */
-{ yymsp[-1].minor.yy194 = OE_SetNull; /* EV: R-33326-45252 */}
+ case 50: /* refact ::= SET NULL */
+{ yymsp[-1].minor.yy502 = OE_SetNull; /* EV: R-33326-45252 */}
break;
- case 50: /* refact ::= SET DEFAULT */
-{ yymsp[-1].minor.yy194 = OE_SetDflt; /* EV: R-33326-45252 */}
+ case 51: /* refact ::= SET DEFAULT */
+{ yymsp[-1].minor.yy502 = OE_SetDflt; /* EV: R-33326-45252 */}
break;
- case 51: /* refact ::= CASCADE */
-{ yymsp[0].minor.yy194 = OE_Cascade; /* EV: R-33326-45252 */}
+ case 52: /* refact ::= CASCADE */
+{ yymsp[0].minor.yy502 = OE_Cascade; /* EV: R-33326-45252 */}
break;
- case 52: /* refact ::= RESTRICT */
-{ yymsp[0].minor.yy194 = OE_Restrict; /* EV: R-33326-45252 */}
+ case 53: /* refact ::= RESTRICT */
+{ yymsp[0].minor.yy502 = OE_Restrict; /* EV: R-33326-45252 */}
break;
- case 53: /* refact ::= NO ACTION */
-{ yymsp[-1].minor.yy194 = OE_None; /* EV: R-33326-45252 */}
+ case 54: /* refact ::= NO ACTION */
+{ yymsp[-1].minor.yy502 = OE_None; /* EV: R-33326-45252 */}
break;
- case 54: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */
-{yymsp[-2].minor.yy194 = 0;}
+ case 55: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */
+{yymsp[-2].minor.yy502 = 0;}
break;
- case 55: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */
- case 70: /* orconf ::= OR resolvetype */ yytestcase(yyruleno==70);
- case 143: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==143);
-{yymsp[-1].minor.yy194 = yymsp[0].minor.yy194;}
+ case 56: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */
+ case 71: /* orconf ::= OR resolvetype */ yytestcase(yyruleno==71);
+ case 155: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==155);
+{yymsp[-1].minor.yy502 = yymsp[0].minor.yy502;}
break;
- case 57: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */
- case 74: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==74);
- case 184: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==184);
- case 187: /* in_op ::= NOT IN */ yytestcase(yyruleno==187);
- case 213: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==213);
-{yymsp[-1].minor.yy194 = 1;}
+ case 58: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */
+ case 75: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==75);
+ case 196: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==196);
+ case 199: /* in_op ::= NOT IN */ yytestcase(yyruleno==199);
+ case 225: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==225);
+{yymsp[-1].minor.yy502 = 1;}
break;
- case 58: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */
-{yymsp[-1].minor.yy194 = 0;}
+ case 59: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */
+{yymsp[-1].minor.yy502 = 0;}
break;
- case 60: /* tconscomma ::= COMMA */
+ case 61: /* tconscomma ::= COMMA */
{pParse->constraintName.n = 0;}
break;
- case 62: /* tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */
-{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy148,yymsp[0].minor.yy194,yymsp[-2].minor.yy194,0);}
+ case 63: /* tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */
+{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy232,yymsp[0].minor.yy502,yymsp[-2].minor.yy502,0);}
break;
- case 63: /* tcons ::= UNIQUE LP sortlist RP onconf */
-{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy148,yymsp[0].minor.yy194,0,0,0,0,
+ case 64: /* tcons ::= UNIQUE LP sortlist RP onconf */
+{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy232,yymsp[0].minor.yy502,0,0,0,0,
SQLITE_IDXTYPE_UNIQUE);}
break;
- case 64: /* tcons ::= CHECK LP expr RP onconf */
-{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy190.pExpr);}
+ case 65: /* tcons ::= CHECK LP expr RP onconf */
+{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy182);}
break;
- case 65: /* tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */
+ case 66: /* tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */
{
- sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy148, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy148, yymsp[-1].minor.yy194);
- sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy194);
+ sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy232, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy232, yymsp[-1].minor.yy502);
+ sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy502);
}
break;
- case 67: /* onconf ::= */
- case 69: /* orconf ::= */ yytestcase(yyruleno==69);
-{yymsp[1].minor.yy194 = OE_Default;}
+ case 68: /* onconf ::= */
+ case 70: /* orconf ::= */ yytestcase(yyruleno==70);
+{yymsp[1].minor.yy502 = OE_Default;}
break;
- case 68: /* onconf ::= ON CONFLICT resolvetype */
-{yymsp[-2].minor.yy194 = yymsp[0].minor.yy194;}
+ case 69: /* onconf ::= ON CONFLICT resolvetype */
+{yymsp[-2].minor.yy502 = yymsp[0].minor.yy502;}
break;
- case 71: /* resolvetype ::= IGNORE */
-{yymsp[0].minor.yy194 = OE_Ignore;}
+ case 72: /* resolvetype ::= IGNORE */
+{yymsp[0].minor.yy502 = OE_Ignore;}
break;
- case 72: /* resolvetype ::= REPLACE */
- case 144: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==144);
-{yymsp[0].minor.yy194 = OE_Replace;}
+ case 73: /* resolvetype ::= REPLACE */
+ case 156: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==156);
+{yymsp[0].minor.yy502 = OE_Replace;}
break;
- case 73: /* cmd ::= DROP TABLE ifexists fullname */
+ case 74: /* cmd ::= DROP TABLE ifexists fullname */
{
- sqlite3DropTable(pParse, yymsp[0].minor.yy185, 0, yymsp[-1].minor.yy194);
+ sqlite3DropTable(pParse, yymsp[0].minor.yy427, 0, yymsp[-1].minor.yy502);
}
break;
- case 76: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */
+ case 77: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */
{
- sqlite3CreateView(pParse, &yymsp[-8].minor.yy0, &yymsp[-4].minor.yy0, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy148, yymsp[0].minor.yy243, yymsp[-7].minor.yy194, yymsp[-5].minor.yy194);
+ sqlite3CreateView(pParse, &yymsp[-8].minor.yy0, &yymsp[-4].minor.yy0, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy232, yymsp[0].minor.yy399, yymsp[-7].minor.yy502, yymsp[-5].minor.yy502);
}
break;
- case 77: /* cmd ::= DROP VIEW ifexists fullname */
+ case 78: /* cmd ::= DROP VIEW ifexists fullname */
{
- sqlite3DropTable(pParse, yymsp[0].minor.yy185, 1, yymsp[-1].minor.yy194);
+ sqlite3DropTable(pParse, yymsp[0].minor.yy427, 1, yymsp[-1].minor.yy502);
}
break;
- case 78: /* cmd ::= select */
+ case 79: /* cmd ::= select */
{
SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0};
- sqlite3Select(pParse, yymsp[0].minor.yy243, &dest);
- sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy243);
+ sqlite3Select(pParse, yymsp[0].minor.yy399, &dest);
+ sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy399);
+}
+ break;
+ case 80: /* select ::= WITH wqlist selectnowith */
+{
+ Select *p = yymsp[0].minor.yy399;
+ if( p ){
+ p->pWith = yymsp[-1].minor.yy91;
+ parserDoubleLinkSelect(pParse, p);
+ }else{
+ sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy91);
+ }
+ yymsp[-2].minor.yy399 = p;
}
break;
- case 79: /* select ::= with selectnowith */
+ case 81: /* select ::= WITH RECURSIVE wqlist selectnowith */
{
- Select *p = yymsp[0].minor.yy243;
+ Select *p = yymsp[0].minor.yy399;
if( p ){
- p->pWith = yymsp[-1].minor.yy285;
+ p->pWith = yymsp[-1].minor.yy91;
parserDoubleLinkSelect(pParse, p);
}else{
- sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy285);
+ sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy91);
+ }
+ yymsp[-3].minor.yy399 = p;
+}
+ break;
+ case 82: /* select ::= selectnowith */
+{
+ Select *p = yymsp[0].minor.yy399;
+ if( p ){
+ parserDoubleLinkSelect(pParse, p);
}
- yymsp[-1].minor.yy243 = p; /*A-overwrites-W*/
+ yymsp[0].minor.yy399 = p; /*A-overwrites-X*/
}
break;
- case 80: /* selectnowith ::= selectnowith multiselect_op oneselect */
+ case 83: /* selectnowith ::= selectnowith multiselect_op oneselect */
{
- Select *pRhs = yymsp[0].minor.yy243;
- Select *pLhs = yymsp[-2].minor.yy243;
+ Select *pRhs = yymsp[0].minor.yy399;
+ Select *pLhs = yymsp[-2].minor.yy399;
if( pRhs && pRhs->pPrior ){
SrcList *pFrom;
Token x;
x.n = 0;
parserDoubleLinkSelect(pParse, pRhs);
pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0);
- pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0,0);
+ pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0);
}
if( pRhs ){
- pRhs->op = (u8)yymsp[-1].minor.yy194;
+ pRhs->op = (u8)yymsp[-1].minor.yy502;
pRhs->pPrior = pLhs;
if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue;
pRhs->selFlags &= ~SF_MultiValue;
- if( yymsp[-1].minor.yy194!=TK_ALL ) pParse->hasCompound = 1;
+ if( yymsp[-1].minor.yy502!=TK_ALL ) pParse->hasCompound = 1;
}else{
sqlite3SelectDelete(pParse->db, pLhs);
}
- yymsp[-2].minor.yy243 = pRhs;
+ yymsp[-2].minor.yy399 = pRhs;
}
break;
- case 81: /* multiselect_op ::= UNION */
- case 83: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==83);
-{yymsp[0].minor.yy194 = yymsp[0].major; /*A-overwrites-OP*/}
+ case 84: /* multiselect_op ::= UNION */
+ case 86: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==86);
+{yymsp[0].minor.yy502 = yymsp[0].major; /*A-overwrites-OP*/}
break;
- case 82: /* multiselect_op ::= UNION ALL */
-{yymsp[-1].minor.yy194 = TK_ALL;}
+ case 85: /* multiselect_op ::= UNION ALL */
+{yymsp[-1].minor.yy502 = TK_ALL;}
break;
- case 84: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
+ case 87: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
{
#if SELECTTRACE_ENABLED
Token s = yymsp[-8].minor.yy0; /*A-overwrites-S*/
#endif
- yymsp[-8].minor.yy243 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy148,yymsp[-5].minor.yy185,yymsp[-4].minor.yy72,yymsp[-3].minor.yy148,yymsp[-2].minor.yy72,yymsp[-1].minor.yy148,yymsp[-7].minor.yy194,yymsp[0].minor.yy354.pLimit,yymsp[0].minor.yy354.pOffset);
+ yymsp[-8].minor.yy399 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy232,yymsp[-5].minor.yy427,yymsp[-4].minor.yy182,yymsp[-3].minor.yy232,yymsp[-2].minor.yy182,yymsp[-1].minor.yy232,yymsp[-7].minor.yy502,yymsp[0].minor.yy182);
#if SELECTTRACE_ENABLED
/* Populate the Select.zSelName[] string that is used to help with
** query planner debugging, to differentiate between multiple Select
@@ -139508,483 +144276,492 @@ static void yy_reduce(
** comment to be the zSelName value. Otherwise, the label is #N where
** is an integer that is incremented with each SELECT statement seen.
*/
- if( yymsp[-8].minor.yy243!=0 ){
+ if( yymsp[-8].minor.yy399!=0 ){
const char *z = s.z+6;
int i;
- sqlite3_snprintf(sizeof(yymsp[-8].minor.yy243->zSelName), yymsp[-8].minor.yy243->zSelName, "#%d",
- ++pParse->nSelect);
+ sqlite3_snprintf(sizeof(yymsp[-8].minor.yy399->zSelName), yymsp[-8].minor.yy399->zSelName,"#%d",++pParse->nSelect);
while( z[0]==' ' ) z++;
if( z[0]=='/' && z[1]=='*' ){
z += 2;
while( z[0]==' ' ) z++;
for(i=0; sqlite3Isalnum(z[i]); i++){}
- sqlite3_snprintf(sizeof(yymsp[-8].minor.yy243->zSelName), yymsp[-8].minor.yy243->zSelName, "%.*s", i, z);
+ sqlite3_snprintf(sizeof(yymsp[-8].minor.yy399->zSelName), yymsp[-8].minor.yy399->zSelName, "%.*s", i, z);
}
}
#endif /* SELECTRACE_ENABLED */
}
break;
- case 85: /* values ::= VALUES LP nexprlist RP */
+ case 88: /* values ::= VALUES LP nexprlist RP */
{
- yymsp[-3].minor.yy243 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy148,0,0,0,0,0,SF_Values,0,0);
+ yymsp[-3].minor.yy399 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy232,0,0,0,0,0,SF_Values,0);
}
break;
- case 86: /* values ::= values COMMA LP exprlist RP */
+ case 89: /* values ::= values COMMA LP exprlist RP */
{
- Select *pRight, *pLeft = yymsp[-4].minor.yy243;
- pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy148,0,0,0,0,0,SF_Values|SF_MultiValue,0,0);
+ Select *pRight, *pLeft = yymsp[-4].minor.yy399;
+ pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy232,0,0,0,0,0,SF_Values|SF_MultiValue,0);
if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue;
if( pRight ){
pRight->op = TK_ALL;
pRight->pPrior = pLeft;
- yymsp[-4].minor.yy243 = pRight;
+ yymsp[-4].minor.yy399 = pRight;
}else{
- yymsp[-4].minor.yy243 = pLeft;
+ yymsp[-4].minor.yy399 = pLeft;
}
}
break;
- case 87: /* distinct ::= DISTINCT */
-{yymsp[0].minor.yy194 = SF_Distinct;}
+ case 90: /* distinct ::= DISTINCT */
+{yymsp[0].minor.yy502 = SF_Distinct;}
break;
- case 88: /* distinct ::= ALL */
-{yymsp[0].minor.yy194 = SF_All;}
+ case 91: /* distinct ::= ALL */
+{yymsp[0].minor.yy502 = SF_All;}
break;
- case 90: /* sclp ::= */
- case 118: /* orderby_opt ::= */ yytestcase(yyruleno==118);
- case 125: /* groupby_opt ::= */ yytestcase(yyruleno==125);
- case 200: /* exprlist ::= */ yytestcase(yyruleno==200);
- case 203: /* paren_exprlist ::= */ yytestcase(yyruleno==203);
- case 208: /* eidlist_opt ::= */ yytestcase(yyruleno==208);
-{yymsp[1].minor.yy148 = 0;}
+ case 93: /* sclp ::= */
+ case 126: /* orderby_opt ::= */ yytestcase(yyruleno==126);
+ case 133: /* groupby_opt ::= */ yytestcase(yyruleno==133);
+ case 212: /* exprlist ::= */ yytestcase(yyruleno==212);
+ case 215: /* paren_exprlist ::= */ yytestcase(yyruleno==215);
+ case 220: /* eidlist_opt ::= */ yytestcase(yyruleno==220);
+{yymsp[1].minor.yy232 = 0;}
break;
- case 91: /* selcollist ::= sclp expr as */
+ case 94: /* selcollist ::= sclp scanpt expr scanpt as */
{
- yymsp[-2].minor.yy148 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy148, yymsp[-1].minor.yy190.pExpr);
- if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-2].minor.yy148, &yymsp[0].minor.yy0, 1);
- sqlite3ExprListSetSpan(pParse,yymsp[-2].minor.yy148,&yymsp[-1].minor.yy190);
+ yymsp[-4].minor.yy232 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy232, yymsp[-2].minor.yy182);
+ if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy232, &yymsp[0].minor.yy0, 1);
+ sqlite3ExprListSetSpan(pParse,yymsp[-4].minor.yy232,yymsp[-3].minor.yy36,yymsp[-1].minor.yy36);
}
break;
- case 92: /* selcollist ::= sclp STAR */
+ case 95: /* selcollist ::= sclp scanpt STAR */
{
Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0);
- yymsp[-1].minor.yy148 = sqlite3ExprListAppend(pParse, yymsp[-1].minor.yy148, p);
+ yymsp[-2].minor.yy232 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy232, p);
}
break;
- case 93: /* selcollist ::= sclp nm DOT STAR */
+ case 96: /* selcollist ::= sclp scanpt nm DOT STAR */
{
Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0);
Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1);
Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight);
- yymsp[-3].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy148, pDot);
+ yymsp[-4].minor.yy232 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy232, pDot);
}
break;
- case 94: /* as ::= AS nm */
- case 105: /* dbnm ::= DOT nm */ yytestcase(yyruleno==105);
- case 222: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==222);
- case 223: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==223);
+ case 97: /* as ::= AS nm */
+ case 108: /* dbnm ::= DOT nm */ yytestcase(yyruleno==108);
+ case 234: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==234);
+ case 235: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==235);
{yymsp[-1].minor.yy0 = yymsp[0].minor.yy0;}
break;
- case 96: /* from ::= */
-{yymsp[1].minor.yy185 = sqlite3DbMallocZero(pParse->db, sizeof(*yymsp[1].minor.yy185));}
+ case 99: /* from ::= */
+{yymsp[1].minor.yy427 = sqlite3DbMallocZero(pParse->db, sizeof(*yymsp[1].minor.yy427));}
break;
- case 97: /* from ::= FROM seltablist */
+ case 100: /* from ::= FROM seltablist */
{
- yymsp[-1].minor.yy185 = yymsp[0].minor.yy185;
- sqlite3SrcListShiftJoinType(yymsp[-1].minor.yy185);
+ yymsp[-1].minor.yy427 = yymsp[0].minor.yy427;
+ sqlite3SrcListShiftJoinType(yymsp[-1].minor.yy427);
}
break;
- case 98: /* stl_prefix ::= seltablist joinop */
+ case 101: /* stl_prefix ::= seltablist joinop */
{
- if( ALWAYS(yymsp[-1].minor.yy185 && yymsp[-1].minor.yy185->nSrc>0) ) yymsp[-1].minor.yy185->a[yymsp[-1].minor.yy185->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy194;
+ if( ALWAYS(yymsp[-1].minor.yy427 && yymsp[-1].minor.yy427->nSrc>0) ) yymsp[-1].minor.yy427->a[yymsp[-1].minor.yy427->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy502;
}
break;
- case 99: /* stl_prefix ::= */
-{yymsp[1].minor.yy185 = 0;}
+ case 102: /* stl_prefix ::= */
+{yymsp[1].minor.yy427 = 0;}
break;
- case 100: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */
+ case 103: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */
{
- yymsp[-6].minor.yy185 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy185,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy72,yymsp[0].minor.yy254);
- sqlite3SrcListIndexedBy(pParse, yymsp[-6].minor.yy185, &yymsp[-2].minor.yy0);
+ yymsp[-6].minor.yy427 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy427,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy182,yymsp[0].minor.yy510);
+ sqlite3SrcListIndexedBy(pParse, yymsp[-6].minor.yy427, &yymsp[-2].minor.yy0);
}
break;
- case 101: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */
+ case 104: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */
{
- yymsp[-8].minor.yy185 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-8].minor.yy185,&yymsp[-7].minor.yy0,&yymsp[-6].minor.yy0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy72,yymsp[0].minor.yy254);
- sqlite3SrcListFuncArgs(pParse, yymsp[-8].minor.yy185, yymsp[-4].minor.yy148);
+ yymsp[-8].minor.yy427 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-8].minor.yy427,&yymsp[-7].minor.yy0,&yymsp[-6].minor.yy0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy182,yymsp[0].minor.yy510);
+ sqlite3SrcListFuncArgs(pParse, yymsp[-8].minor.yy427, yymsp[-4].minor.yy232);
}
break;
- case 102: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */
+ case 105: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */
{
- yymsp[-6].minor.yy185 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy185,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy243,yymsp[-1].minor.yy72,yymsp[0].minor.yy254);
+ yymsp[-6].minor.yy427 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy427,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy399,yymsp[-1].minor.yy182,yymsp[0].minor.yy510);
}
break;
- case 103: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */
+ case 106: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */
{
- if( yymsp[-6].minor.yy185==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy72==0 && yymsp[0].minor.yy254==0 ){
- yymsp[-6].minor.yy185 = yymsp[-4].minor.yy185;
- }else if( yymsp[-4].minor.yy185->nSrc==1 ){
- yymsp[-6].minor.yy185 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy185,0,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy72,yymsp[0].minor.yy254);
- if( yymsp[-6].minor.yy185 ){
- struct SrcList_item *pNew = &yymsp[-6].minor.yy185->a[yymsp[-6].minor.yy185->nSrc-1];
- struct SrcList_item *pOld = yymsp[-4].minor.yy185->a;
+ if( yymsp[-6].minor.yy427==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy182==0 && yymsp[0].minor.yy510==0 ){
+ yymsp[-6].minor.yy427 = yymsp[-4].minor.yy427;
+ }else if( yymsp[-4].minor.yy427->nSrc==1 ){
+ yymsp[-6].minor.yy427 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy427,0,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy182,yymsp[0].minor.yy510);
+ if( yymsp[-6].minor.yy427 ){
+ struct SrcList_item *pNew = &yymsp[-6].minor.yy427->a[yymsp[-6].minor.yy427->nSrc-1];
+ struct SrcList_item *pOld = yymsp[-4].minor.yy427->a;
pNew->zName = pOld->zName;
pNew->zDatabase = pOld->zDatabase;
pNew->pSelect = pOld->pSelect;
pOld->zName = pOld->zDatabase = 0;
pOld->pSelect = 0;
}
- sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy185);
+ sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy427);
}else{
Select *pSubquery;
- sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy185);
- pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy185,0,0,0,0,SF_NestedFrom,0,0);
- yymsp[-6].minor.yy185 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy185,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy72,yymsp[0].minor.yy254);
+ sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy427);
+ pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy427,0,0,0,0,SF_NestedFrom,0);
+ yymsp[-6].minor.yy427 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy427,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy182,yymsp[0].minor.yy510);
}
}
break;
- case 104: /* dbnm ::= */
- case 113: /* indexed_opt ::= */ yytestcase(yyruleno==113);
+ case 107: /* dbnm ::= */
+ case 121: /* indexed_opt ::= */ yytestcase(yyruleno==121);
{yymsp[1].minor.yy0.z=0; yymsp[1].minor.yy0.n=0;}
break;
- case 106: /* fullname ::= nm dbnm */
-{yymsp[-1].minor.yy185 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/}
+ case 109: /* fullname ::= nm */
+ case 111: /* xfullname ::= nm */ yytestcase(yyruleno==111);
+{yymsp[0].minor.yy427 = sqlite3SrcListAppend(pParse->db,0,&yymsp[0].minor.yy0,0); /*A-overwrites-X*/}
+ break;
+ case 110: /* fullname ::= nm DOT nm */
+ case 112: /* xfullname ::= nm DOT nm */ yytestcase(yyruleno==112);
+{yymsp[-2].minor.yy427 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/}
+ break;
+ case 113: /* xfullname ::= nm DOT nm AS nm */
+{
+ yymsp[-4].minor.yy427 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-4].minor.yy0,&yymsp[-2].minor.yy0); /*A-overwrites-X*/
+ if( yymsp[-4].minor.yy427 ) yymsp[-4].minor.yy427->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0);
+}
+ break;
+ case 114: /* xfullname ::= nm AS nm */
+{
+ yymsp[-2].minor.yy427 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-2].minor.yy0,0); /*A-overwrites-X*/
+ if( yymsp[-2].minor.yy427 ) yymsp[-2].minor.yy427->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0);
+}
break;
- case 107: /* joinop ::= COMMA|JOIN */
-{ yymsp[0].minor.yy194 = JT_INNER; }
+ case 115: /* joinop ::= COMMA|JOIN */
+{ yymsp[0].minor.yy502 = JT_INNER; }
break;
- case 108: /* joinop ::= JOIN_KW JOIN */
-{yymsp[-1].minor.yy194 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/}
+ case 116: /* joinop ::= JOIN_KW JOIN */
+{yymsp[-1].minor.yy502 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/}
break;
- case 109: /* joinop ::= JOIN_KW nm JOIN */
-{yymsp[-2].minor.yy194 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/}
+ case 117: /* joinop ::= JOIN_KW nm JOIN */
+{yymsp[-2].minor.yy502 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/}
break;
- case 110: /* joinop ::= JOIN_KW nm nm JOIN */
-{yymsp[-3].minor.yy194 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/}
+ case 118: /* joinop ::= JOIN_KW nm nm JOIN */
+{yymsp[-3].minor.yy502 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/}
break;
- case 111: /* on_opt ::= ON expr */
- case 128: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==128);
- case 135: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==135);
- case 196: /* case_else ::= ELSE expr */ yytestcase(yyruleno==196);
-{yymsp[-1].minor.yy72 = yymsp[0].minor.yy190.pExpr;}
+ case 119: /* on_opt ::= ON expr */
+ case 136: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==136);
+ case 143: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==143);
+ case 208: /* case_else ::= ELSE expr */ yytestcase(yyruleno==208);
+{yymsp[-1].minor.yy182 = yymsp[0].minor.yy182;}
break;
- case 112: /* on_opt ::= */
- case 127: /* having_opt ::= */ yytestcase(yyruleno==127);
- case 134: /* where_opt ::= */ yytestcase(yyruleno==134);
- case 197: /* case_else ::= */ yytestcase(yyruleno==197);
- case 199: /* case_operand ::= */ yytestcase(yyruleno==199);
-{yymsp[1].minor.yy72 = 0;}
+ case 120: /* on_opt ::= */
+ case 135: /* having_opt ::= */ yytestcase(yyruleno==135);
+ case 137: /* limit_opt ::= */ yytestcase(yyruleno==137);
+ case 142: /* where_opt ::= */ yytestcase(yyruleno==142);
+ case 209: /* case_else ::= */ yytestcase(yyruleno==209);
+ case 211: /* case_operand ::= */ yytestcase(yyruleno==211);
+{yymsp[1].minor.yy182 = 0;}
break;
- case 114: /* indexed_opt ::= INDEXED BY nm */
+ case 122: /* indexed_opt ::= INDEXED BY nm */
{yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;}
break;
- case 115: /* indexed_opt ::= NOT INDEXED */
+ case 123: /* indexed_opt ::= NOT INDEXED */
{yymsp[-1].minor.yy0.z=0; yymsp[-1].minor.yy0.n=1;}
break;
- case 116: /* using_opt ::= USING LP idlist RP */
-{yymsp[-3].minor.yy254 = yymsp[-1].minor.yy254;}
+ case 124: /* using_opt ::= USING LP idlist RP */
+{yymsp[-3].minor.yy510 = yymsp[-1].minor.yy510;}
break;
- case 117: /* using_opt ::= */
- case 145: /* idlist_opt ::= */ yytestcase(yyruleno==145);
-{yymsp[1].minor.yy254 = 0;}
+ case 125: /* using_opt ::= */
+ case 157: /* idlist_opt ::= */ yytestcase(yyruleno==157);
+{yymsp[1].minor.yy510 = 0;}
break;
- case 119: /* orderby_opt ::= ORDER BY sortlist */
- case 126: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==126);
-{yymsp[-2].minor.yy148 = yymsp[0].minor.yy148;}
+ case 127: /* orderby_opt ::= ORDER BY sortlist */
+ case 134: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==134);
+{yymsp[-2].minor.yy232 = yymsp[0].minor.yy232;}
break;
- case 120: /* sortlist ::= sortlist COMMA expr sortorder */
+ case 128: /* sortlist ::= sortlist COMMA expr sortorder */
{
- yymsp[-3].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy148,yymsp[-1].minor.yy190.pExpr);
- sqlite3ExprListSetSortOrder(yymsp[-3].minor.yy148,yymsp[0].minor.yy194);
+ yymsp[-3].minor.yy232 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy232,yymsp[-1].minor.yy182);
+ sqlite3ExprListSetSortOrder(yymsp[-3].minor.yy232,yymsp[0].minor.yy502);
}
break;
- case 121: /* sortlist ::= expr sortorder */
+ case 129: /* sortlist ::= expr sortorder */
{
- yymsp[-1].minor.yy148 = sqlite3ExprListAppend(pParse,0,yymsp[-1].minor.yy190.pExpr); /*A-overwrites-Y*/
- sqlite3ExprListSetSortOrder(yymsp[-1].minor.yy148,yymsp[0].minor.yy194);
+ yymsp[-1].minor.yy232 = sqlite3ExprListAppend(pParse,0,yymsp[-1].minor.yy182); /*A-overwrites-Y*/
+ sqlite3ExprListSetSortOrder(yymsp[-1].minor.yy232,yymsp[0].minor.yy502);
}
break;
- case 122: /* sortorder ::= ASC */
-{yymsp[0].minor.yy194 = SQLITE_SO_ASC;}
- break;
- case 123: /* sortorder ::= DESC */
-{yymsp[0].minor.yy194 = SQLITE_SO_DESC;}
+ case 130: /* sortorder ::= ASC */
+{yymsp[0].minor.yy502 = SQLITE_SO_ASC;}
break;
- case 124: /* sortorder ::= */
-{yymsp[1].minor.yy194 = SQLITE_SO_UNDEFINED;}
+ case 131: /* sortorder ::= DESC */
+{yymsp[0].minor.yy502 = SQLITE_SO_DESC;}
break;
- case 129: /* limit_opt ::= */
-{yymsp[1].minor.yy354.pLimit = 0; yymsp[1].minor.yy354.pOffset = 0;}
+ case 132: /* sortorder ::= */
+{yymsp[1].minor.yy502 = SQLITE_SO_UNDEFINED;}
break;
- case 130: /* limit_opt ::= LIMIT expr */
-{yymsp[-1].minor.yy354.pLimit = yymsp[0].minor.yy190.pExpr; yymsp[-1].minor.yy354.pOffset = 0;}
+ case 138: /* limit_opt ::= LIMIT expr */
+{yymsp[-1].minor.yy182 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy182,0);}
break;
- case 131: /* limit_opt ::= LIMIT expr OFFSET expr */
-{yymsp[-3].minor.yy354.pLimit = yymsp[-2].minor.yy190.pExpr; yymsp[-3].minor.yy354.pOffset = yymsp[0].minor.yy190.pExpr;}
+ case 139: /* limit_opt ::= LIMIT expr OFFSET expr */
+{yymsp[-3].minor.yy182 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[-2].minor.yy182,yymsp[0].minor.yy182);}
break;
- case 132: /* limit_opt ::= LIMIT expr COMMA expr */
-{yymsp[-3].minor.yy354.pOffset = yymsp[-2].minor.yy190.pExpr; yymsp[-3].minor.yy354.pLimit = yymsp[0].minor.yy190.pExpr;}
+ case 140: /* limit_opt ::= LIMIT expr COMMA expr */
+{yymsp[-3].minor.yy182 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy182,yymsp[-2].minor.yy182);}
break;
- case 133: /* cmd ::= with DELETE FROM fullname indexed_opt where_opt */
+ case 141: /* cmd ::= with DELETE FROM xfullname indexed_opt where_opt */
{
- sqlite3WithPush(pParse, yymsp[-5].minor.yy285, 1);
- sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy185, &yymsp[-1].minor.yy0);
- sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy185,yymsp[0].minor.yy72);
+ sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy427, &yymsp[-1].minor.yy0);
+ sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy427,yymsp[0].minor.yy182,0,0);
}
break;
- case 136: /* cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt */
+ case 144: /* cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt */
{
- sqlite3WithPush(pParse, yymsp[-7].minor.yy285, 1);
- sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy185, &yymsp[-3].minor.yy0);
- sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy148,"set list");
- sqlite3Update(pParse,yymsp[-4].minor.yy185,yymsp[-1].minor.yy148,yymsp[0].minor.yy72,yymsp[-5].minor.yy194);
+ sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy427, &yymsp[-3].minor.yy0);
+ sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy232,"set list");
+ sqlite3Update(pParse,yymsp[-4].minor.yy427,yymsp[-1].minor.yy232,yymsp[0].minor.yy182,yymsp[-5].minor.yy502,0,0,0);
}
break;
- case 137: /* setlist ::= setlist COMMA nm EQ expr */
+ case 145: /* setlist ::= setlist COMMA nm EQ expr */
{
- yymsp[-4].minor.yy148 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy148, yymsp[0].minor.yy190.pExpr);
- sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy148, &yymsp[-2].minor.yy0, 1);
+ yymsp[-4].minor.yy232 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy232, yymsp[0].minor.yy182);
+ sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy232, &yymsp[-2].minor.yy0, 1);
}
break;
- case 138: /* setlist ::= setlist COMMA LP idlist RP EQ expr */
+ case 146: /* setlist ::= setlist COMMA LP idlist RP EQ expr */
{
- yymsp[-6].minor.yy148 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy148, yymsp[-3].minor.yy254, yymsp[0].minor.yy190.pExpr);
+ yymsp[-6].minor.yy232 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy232, yymsp[-3].minor.yy510, yymsp[0].minor.yy182);
}
break;
- case 139: /* setlist ::= nm EQ expr */
+ case 147: /* setlist ::= nm EQ expr */
{
- yylhsminor.yy148 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy190.pExpr);
- sqlite3ExprListSetName(pParse, yylhsminor.yy148, &yymsp[-2].minor.yy0, 1);
+ yylhsminor.yy232 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy182);
+ sqlite3ExprListSetName(pParse, yylhsminor.yy232, &yymsp[-2].minor.yy0, 1);
}
- yymsp[-2].minor.yy148 = yylhsminor.yy148;
+ yymsp[-2].minor.yy232 = yylhsminor.yy232;
break;
- case 140: /* setlist ::= LP idlist RP EQ expr */
+ case 148: /* setlist ::= LP idlist RP EQ expr */
{
- yymsp[-4].minor.yy148 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy254, yymsp[0].minor.yy190.pExpr);
+ yymsp[-4].minor.yy232 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy510, yymsp[0].minor.yy182);
}
break;
- case 141: /* cmd ::= with insert_cmd INTO fullname idlist_opt select */
+ case 149: /* cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */
{
- sqlite3WithPush(pParse, yymsp[-5].minor.yy285, 1);
- sqlite3Insert(pParse, yymsp[-2].minor.yy185, yymsp[0].minor.yy243, yymsp[-1].minor.yy254, yymsp[-4].minor.yy194);
+ sqlite3Insert(pParse, yymsp[-3].minor.yy427, yymsp[-1].minor.yy399, yymsp[-2].minor.yy510, yymsp[-5].minor.yy502, yymsp[0].minor.yy198);
}
break;
- case 142: /* cmd ::= with insert_cmd INTO fullname idlist_opt DEFAULT VALUES */
+ case 150: /* cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES */
{
- sqlite3WithPush(pParse, yymsp[-6].minor.yy285, 1);
- sqlite3Insert(pParse, yymsp[-3].minor.yy185, 0, yymsp[-2].minor.yy254, yymsp[-5].minor.yy194);
+ sqlite3Insert(pParse, yymsp[-3].minor.yy427, 0, yymsp[-2].minor.yy510, yymsp[-5].minor.yy502, 0);
}
break;
- case 146: /* idlist_opt ::= LP idlist RP */
-{yymsp[-2].minor.yy254 = yymsp[-1].minor.yy254;}
+ case 151: /* upsert ::= */
+{ yymsp[1].minor.yy198 = 0; }
+ break;
+ case 152: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt */
+{ yymsp[-10].minor.yy198 = sqlite3UpsertNew(pParse->db,yymsp[-7].minor.yy232,yymsp[-5].minor.yy182,yymsp[-1].minor.yy232,yymsp[0].minor.yy182);}
+ break;
+ case 153: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING */
+{ yymsp[-7].minor.yy198 = sqlite3UpsertNew(pParse->db,yymsp[-4].minor.yy232,yymsp[-2].minor.yy182,0,0); }
+ break;
+ case 154: /* upsert ::= ON CONFLICT DO NOTHING */
+{ yymsp[-3].minor.yy198 = sqlite3UpsertNew(pParse->db,0,0,0,0); }
break;
- case 147: /* idlist ::= idlist COMMA nm */
-{yymsp[-2].minor.yy254 = sqlite3IdListAppend(pParse->db,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
+ case 158: /* idlist_opt ::= LP idlist RP */
+{yymsp[-2].minor.yy510 = yymsp[-1].minor.yy510;}
break;
- case 148: /* idlist ::= nm */
-{yymsp[0].minor.yy254 = sqlite3IdListAppend(pParse->db,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/}
+ case 159: /* idlist ::= idlist COMMA nm */
+{yymsp[-2].minor.yy510 = sqlite3IdListAppend(pParse->db,yymsp[-2].minor.yy510,&yymsp[0].minor.yy0);}
break;
- case 149: /* expr ::= LP expr RP */
-{spanSet(&yymsp[-2].minor.yy190,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-B*/ yymsp[-2].minor.yy190.pExpr = yymsp[-1].minor.yy190.pExpr;}
+ case 160: /* idlist ::= nm */
+{yymsp[0].minor.yy510 = sqlite3IdListAppend(pParse->db,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/}
break;
- case 150: /* expr ::= ID|INDEXED */
- case 151: /* expr ::= JOIN_KW */ yytestcase(yyruleno==151);
-{spanExpr(&yymsp[0].minor.yy190,pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/}
+ case 161: /* expr ::= LP expr RP */
+{yymsp[-2].minor.yy182 = yymsp[-1].minor.yy182;}
break;
- case 152: /* expr ::= nm DOT nm */
+ case 162: /* expr ::= ID|INDEXED */
+ case 163: /* expr ::= JOIN_KW */ yytestcase(yyruleno==163);
+{yymsp[0].minor.yy182=tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/}
+ break;
+ case 164: /* expr ::= nm DOT nm */
{
Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1);
Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[0].minor.yy0, 1);
- spanSet(&yymsp[-2].minor.yy190,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/
- yymsp[-2].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2);
+ yylhsminor.yy182 = sqlite3PExpr(pParse, TK_DOT, temp1, temp2);
}
+ yymsp[-2].minor.yy182 = yylhsminor.yy182;
break;
- case 153: /* expr ::= nm DOT nm DOT nm */
+ case 165: /* expr ::= nm DOT nm DOT nm */
{
Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-4].minor.yy0, 1);
Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1);
Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[0].minor.yy0, 1);
Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3);
- spanSet(&yymsp[-4].minor.yy190,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/
- yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4);
+ yylhsminor.yy182 = sqlite3PExpr(pParse, TK_DOT, temp1, temp4);
}
+ yymsp[-4].minor.yy182 = yylhsminor.yy182;
break;
- case 154: /* term ::= NULL|FLOAT|BLOB */
- case 155: /* term ::= STRING */ yytestcase(yyruleno==155);
-{spanExpr(&yymsp[0].minor.yy190,pParse,yymsp[0].major,yymsp[0].minor.yy0); /*A-overwrites-X*/}
+ case 166: /* term ::= NULL|FLOAT|BLOB */
+ case 167: /* term ::= STRING */ yytestcase(yyruleno==167);
+{yymsp[0].minor.yy182=tokenExpr(pParse,yymsp[0].major,yymsp[0].minor.yy0); /*A-overwrites-X*/}
break;
- case 156: /* term ::= INTEGER */
+ case 168: /* term ::= INTEGER */
{
- yylhsminor.yy190.pExpr = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1);
- yylhsminor.yy190.zStart = yymsp[0].minor.yy0.z;
- yylhsminor.yy190.zEnd = yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n;
+ yylhsminor.yy182 = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1);
}
- yymsp[0].minor.yy190 = yylhsminor.yy190;
+ yymsp[0].minor.yy182 = yylhsminor.yy182;
break;
- case 157: /* expr ::= VARIABLE */
+ case 169: /* expr ::= VARIABLE */
{
if( !(yymsp[0].minor.yy0.z[0]=='#' && sqlite3Isdigit(yymsp[0].minor.yy0.z[1])) ){
u32 n = yymsp[0].minor.yy0.n;
- spanExpr(&yymsp[0].minor.yy190, pParse, TK_VARIABLE, yymsp[0].minor.yy0);
- sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy190.pExpr, n);
+ yymsp[0].minor.yy182 = tokenExpr(pParse, TK_VARIABLE, yymsp[0].minor.yy0);
+ sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy182, n);
}else{
/* When doing a nested parse, one can include terms in an expression
** that look like this: #1 #2 ... These terms refer to registers
** in the virtual machine. #N is the N-th register. */
Token t = yymsp[0].minor.yy0; /*A-overwrites-X*/
assert( t.n>=2 );
- spanSet(&yymsp[0].minor.yy190, &t, &t);
if( pParse->nested==0 ){
sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t);
- yymsp[0].minor.yy190.pExpr = 0;
+ yymsp[0].minor.yy182 = 0;
}else{
- yymsp[0].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0);
- if( yymsp[0].minor.yy190.pExpr ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy190.pExpr->iTable);
+ yymsp[0].minor.yy182 = sqlite3PExpr(pParse, TK_REGISTER, 0, 0);
+ if( yymsp[0].minor.yy182 ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy182->iTable);
}
}
}
break;
- case 158: /* expr ::= expr COLLATE ID|STRING */
+ case 170: /* expr ::= expr COLLATE ID|STRING */
{
- yymsp[-2].minor.yy190.pExpr = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy190.pExpr, &yymsp[0].minor.yy0, 1);
- yymsp[-2].minor.yy190.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
+ yymsp[-2].minor.yy182 = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy182, &yymsp[0].minor.yy0, 1);
}
break;
- case 159: /* expr ::= CAST LP expr AS typetoken RP */
+ case 171: /* expr ::= CAST LP expr AS typetoken RP */
{
- spanSet(&yymsp[-5].minor.yy190,&yymsp[-5].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/
- yymsp[-5].minor.yy190.pExpr = sqlite3ExprAlloc(pParse->db, TK_CAST, &yymsp[-1].minor.yy0, 1);
- sqlite3ExprAttachSubtrees(pParse->db, yymsp[-5].minor.yy190.pExpr, yymsp[-3].minor.yy190.pExpr, 0);
+ yymsp[-5].minor.yy182 = sqlite3ExprAlloc(pParse->db, TK_CAST, &yymsp[-1].minor.yy0, 1);
+ sqlite3ExprAttachSubtrees(pParse->db, yymsp[-5].minor.yy182, yymsp[-3].minor.yy182, 0);
}
break;
- case 160: /* expr ::= ID|INDEXED LP distinct exprlist RP */
+ case 172: /* expr ::= ID|INDEXED LP distinct exprlist RP */
{
- if( yymsp[-1].minor.yy148 && yymsp[-1].minor.yy148->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
+ if( yymsp[-1].minor.yy232 && yymsp[-1].minor.yy232->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
sqlite3ErrorMsg(pParse, "too many arguments on function %T", &yymsp[-4].minor.yy0);
}
- yylhsminor.yy190.pExpr = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy148, &yymsp[-4].minor.yy0);
- spanSet(&yylhsminor.yy190,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0);
- if( yymsp[-2].minor.yy194==SF_Distinct && yylhsminor.yy190.pExpr ){
- yylhsminor.yy190.pExpr->flags |= EP_Distinct;
+ yylhsminor.yy182 = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy232, &yymsp[-4].minor.yy0);
+ if( yymsp[-2].minor.yy502==SF_Distinct && yylhsminor.yy182 ){
+ yylhsminor.yy182->flags |= EP_Distinct;
}
}
- yymsp[-4].minor.yy190 = yylhsminor.yy190;
+ yymsp[-4].minor.yy182 = yylhsminor.yy182;
break;
- case 161: /* expr ::= ID|INDEXED LP STAR RP */
+ case 173: /* expr ::= ID|INDEXED LP STAR RP */
{
- yylhsminor.yy190.pExpr = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0);
- spanSet(&yylhsminor.yy190,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0);
+ yylhsminor.yy182 = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0);
}
- yymsp[-3].minor.yy190 = yylhsminor.yy190;
+ yymsp[-3].minor.yy182 = yylhsminor.yy182;
break;
- case 162: /* term ::= CTIME_KW */
+ case 174: /* term ::= CTIME_KW */
{
- yylhsminor.yy190.pExpr = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0);
- spanSet(&yylhsminor.yy190, &yymsp[0].minor.yy0, &yymsp[0].minor.yy0);
+ yylhsminor.yy182 = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0);
}
- yymsp[0].minor.yy190 = yylhsminor.yy190;
+ yymsp[0].minor.yy182 = yylhsminor.yy182;
break;
- case 163: /* expr ::= LP nexprlist COMMA expr RP */
+ case 175: /* expr ::= LP nexprlist COMMA expr RP */
{
- ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy148, yymsp[-1].minor.yy190.pExpr);
- yylhsminor.yy190.pExpr = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
- if( yylhsminor.yy190.pExpr ){
- yylhsminor.yy190.pExpr->x.pList = pList;
- spanSet(&yylhsminor.yy190, &yymsp[-4].minor.yy0, &yymsp[0].minor.yy0);
+ ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy232, yymsp[-1].minor.yy182);
+ yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
+ if( yymsp[-4].minor.yy182 ){
+ yymsp[-4].minor.yy182->x.pList = pList;
}else{
sqlite3ExprListDelete(pParse->db, pList);
}
}
- yymsp[-4].minor.yy190 = yylhsminor.yy190;
break;
- case 164: /* expr ::= expr AND expr */
- case 165: /* expr ::= expr OR expr */ yytestcase(yyruleno==165);
- case 166: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==166);
- case 167: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==167);
- case 168: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==168);
- case 169: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==169);
- case 170: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==170);
- case 171: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==171);
-{spanBinaryExpr(pParse,yymsp[-1].major,&yymsp[-2].minor.yy190,&yymsp[0].minor.yy190);}
+ case 176: /* expr ::= expr AND expr */
+ case 177: /* expr ::= expr OR expr */ yytestcase(yyruleno==177);
+ case 178: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==178);
+ case 179: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==179);
+ case 180: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==180);
+ case 181: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==181);
+ case 182: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==182);
+ case 183: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==183);
+{yymsp[-2].minor.yy182=sqlite3PExpr(pParse,yymsp[-1].major,yymsp[-2].minor.yy182,yymsp[0].minor.yy182);}
break;
- case 172: /* likeop ::= NOT LIKE_KW|MATCH */
+ case 184: /* likeop ::= NOT LIKE_KW|MATCH */
{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.n|=0x80000000; /*yymsp[-1].minor.yy0-overwrite-yymsp[0].minor.yy0*/}
break;
- case 173: /* expr ::= expr likeop expr */
+ case 185: /* expr ::= expr likeop expr */
{
ExprList *pList;
int bNot = yymsp[-1].minor.yy0.n & 0x80000000;
yymsp[-1].minor.yy0.n &= 0x7fffffff;
- pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy190.pExpr);
- pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy190.pExpr);
- yymsp[-2].minor.yy190.pExpr = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0);
- exprNot(pParse, bNot, &yymsp[-2].minor.yy190);
- yymsp[-2].minor.yy190.zEnd = yymsp[0].minor.yy190.zEnd;
- if( yymsp[-2].minor.yy190.pExpr ) yymsp[-2].minor.yy190.pExpr->flags |= EP_InfixFunc;
+ pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy182);
+ pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy182);
+ yymsp[-2].minor.yy182 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0);
+ if( bNot ) yymsp[-2].minor.yy182 = sqlite3PExpr(pParse, TK_NOT, yymsp[-2].minor.yy182, 0);
+ if( yymsp[-2].minor.yy182 ) yymsp[-2].minor.yy182->flags |= EP_InfixFunc;
}
break;
- case 174: /* expr ::= expr likeop expr ESCAPE expr */
+ case 186: /* expr ::= expr likeop expr ESCAPE expr */
{
ExprList *pList;
int bNot = yymsp[-3].minor.yy0.n & 0x80000000;
yymsp[-3].minor.yy0.n &= 0x7fffffff;
- pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy190.pExpr);
- pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy190.pExpr);
- pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy190.pExpr);
- yymsp[-4].minor.yy190.pExpr = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy0);
- exprNot(pParse, bNot, &yymsp[-4].minor.yy190);
- yymsp[-4].minor.yy190.zEnd = yymsp[0].minor.yy190.zEnd;
- if( yymsp[-4].minor.yy190.pExpr ) yymsp[-4].minor.yy190.pExpr->flags |= EP_InfixFunc;
+ pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy182);
+ pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy182);
+ pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy182);
+ yymsp[-4].minor.yy182 = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy0);
+ if( bNot ) yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy182, 0);
+ if( yymsp[-4].minor.yy182 ) yymsp[-4].minor.yy182->flags |= EP_InfixFunc;
}
break;
- case 175: /* expr ::= expr ISNULL|NOTNULL */
-{spanUnaryPostfix(pParse,yymsp[0].major,&yymsp[-1].minor.yy190,&yymsp[0].minor.yy0);}
+ case 187: /* expr ::= expr ISNULL|NOTNULL */
+{yymsp[-1].minor.yy182 = sqlite3PExpr(pParse,yymsp[0].major,yymsp[-1].minor.yy182,0);}
break;
- case 176: /* expr ::= expr NOT NULL */
-{spanUnaryPostfix(pParse,TK_NOTNULL,&yymsp[-2].minor.yy190,&yymsp[0].minor.yy0);}
+ case 188: /* expr ::= expr NOT NULL */
+{yymsp[-2].minor.yy182 = sqlite3PExpr(pParse,TK_NOTNULL,yymsp[-2].minor.yy182,0);}
break;
- case 177: /* expr ::= expr IS expr */
+ case 189: /* expr ::= expr IS expr */
{
- spanBinaryExpr(pParse,TK_IS,&yymsp[-2].minor.yy190,&yymsp[0].minor.yy190);
- binaryToUnaryIfNull(pParse, yymsp[0].minor.yy190.pExpr, yymsp[-2].minor.yy190.pExpr, TK_ISNULL);
+ yymsp[-2].minor.yy182 = sqlite3PExpr(pParse,TK_IS,yymsp[-2].minor.yy182,yymsp[0].minor.yy182);
+ binaryToUnaryIfNull(pParse, yymsp[0].minor.yy182, yymsp[-2].minor.yy182, TK_ISNULL);
}
break;
- case 178: /* expr ::= expr IS NOT expr */
+ case 190: /* expr ::= expr IS NOT expr */
{
- spanBinaryExpr(pParse,TK_ISNOT,&yymsp[-3].minor.yy190,&yymsp[0].minor.yy190);
- binaryToUnaryIfNull(pParse, yymsp[0].minor.yy190.pExpr, yymsp[-3].minor.yy190.pExpr, TK_NOTNULL);
+ yymsp[-3].minor.yy182 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-3].minor.yy182,yymsp[0].minor.yy182);
+ binaryToUnaryIfNull(pParse, yymsp[0].minor.yy182, yymsp[-3].minor.yy182, TK_NOTNULL);
}
break;
- case 179: /* expr ::= NOT expr */
- case 180: /* expr ::= BITNOT expr */ yytestcase(yyruleno==180);
-{spanUnaryPrefix(&yymsp[-1].minor.yy190,pParse,yymsp[-1].major,&yymsp[0].minor.yy190,&yymsp[-1].minor.yy0);/*A-overwrites-B*/}
+ case 191: /* expr ::= NOT expr */
+ case 192: /* expr ::= BITNOT expr */ yytestcase(yyruleno==192);
+{yymsp[-1].minor.yy182 = sqlite3PExpr(pParse, yymsp[-1].major, yymsp[0].minor.yy182, 0);/*A-overwrites-B*/}
break;
- case 181: /* expr ::= MINUS expr */
-{spanUnaryPrefix(&yymsp[-1].minor.yy190,pParse,TK_UMINUS,&yymsp[0].minor.yy190,&yymsp[-1].minor.yy0);/*A-overwrites-B*/}
+ case 193: /* expr ::= MINUS expr */
+{yymsp[-1].minor.yy182 = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy182, 0);}
break;
- case 182: /* expr ::= PLUS expr */
-{spanUnaryPrefix(&yymsp[-1].minor.yy190,pParse,TK_UPLUS,&yymsp[0].minor.yy190,&yymsp[-1].minor.yy0);/*A-overwrites-B*/}
+ case 194: /* expr ::= PLUS expr */
+{yymsp[-1].minor.yy182 = sqlite3PExpr(pParse, TK_UPLUS, yymsp[0].minor.yy182, 0);}
break;
- case 183: /* between_op ::= BETWEEN */
- case 186: /* in_op ::= IN */ yytestcase(yyruleno==186);
-{yymsp[0].minor.yy194 = 0;}
+ case 195: /* between_op ::= BETWEEN */
+ case 198: /* in_op ::= IN */ yytestcase(yyruleno==198);
+{yymsp[0].minor.yy502 = 0;}
break;
- case 185: /* expr ::= expr between_op expr AND expr */
+ case 197: /* expr ::= expr between_op expr AND expr */
{
- ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy190.pExpr);
- pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy190.pExpr);
- yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy190.pExpr, 0);
- if( yymsp[-4].minor.yy190.pExpr ){
- yymsp[-4].minor.yy190.pExpr->x.pList = pList;
+ ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy182);
+ pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy182);
+ yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy182, 0);
+ if( yymsp[-4].minor.yy182 ){
+ yymsp[-4].minor.yy182->x.pList = pList;
}else{
sqlite3ExprListDelete(pParse->db, pList);
}
- exprNot(pParse, yymsp[-3].minor.yy194, &yymsp[-4].minor.yy190);
- yymsp[-4].minor.yy190.zEnd = yymsp[0].minor.yy190.zEnd;
+ if( yymsp[-3].minor.yy502 ) yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy182, 0);
}
break;
- case 188: /* expr ::= expr in_op LP exprlist RP */
+ case 200: /* expr ::= expr in_op LP exprlist RP */
{
- if( yymsp[-1].minor.yy148==0 ){
+ if( yymsp[-1].minor.yy232==0 ){
/* Expressions of the form
**
** expr1 IN ()
@@ -139993,9 +144770,9 @@ static void yy_reduce(
** simplify to constants 0 (false) and 1 (true), respectively,
** regardless of the value of expr1.
*/
- sqlite3ExprDelete(pParse->db, yymsp[-4].minor.yy190.pExpr);
- yymsp[-4].minor.yy190.pExpr = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[yymsp[-3].minor.yy194],1);
- }else if( yymsp[-1].minor.yy148->nExpr==1 ){
+ sqlite3ExprDelete(pParse->db, yymsp[-4].minor.yy182);
+ yymsp[-4].minor.yy182 = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[yymsp[-3].minor.yy502],1);
+ }else if( yymsp[-1].minor.yy232->nExpr==1 ){
/* Expressions of the form:
**
** expr1 IN (?1)
@@ -140012,201 +144789,195 @@ static void yy_reduce(
** affinity or the collating sequence to use for comparison. Otherwise,
** the semantics would be subtly different from IN or NOT IN.
*/
- Expr *pRHS = yymsp[-1].minor.yy148->a[0].pExpr;
- yymsp[-1].minor.yy148->a[0].pExpr = 0;
- sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy148);
+ Expr *pRHS = yymsp[-1].minor.yy232->a[0].pExpr;
+ yymsp[-1].minor.yy232->a[0].pExpr = 0;
+ sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy232);
/* pRHS cannot be NULL because a malloc error would have been detected
** before now and control would have never reached this point */
if( ALWAYS(pRHS) ){
pRHS->flags &= ~EP_Collate;
pRHS->flags |= EP_Generic;
}
- yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, yymsp[-3].minor.yy194 ? TK_NE : TK_EQ, yymsp[-4].minor.yy190.pExpr, pRHS);
+ yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, yymsp[-3].minor.yy502 ? TK_NE : TK_EQ, yymsp[-4].minor.yy182, pRHS);
}else{
- yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy190.pExpr, 0);
- if( yymsp[-4].minor.yy190.pExpr ){
- yymsp[-4].minor.yy190.pExpr->x.pList = yymsp[-1].minor.yy148;
- sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy190.pExpr);
+ yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy182, 0);
+ if( yymsp[-4].minor.yy182 ){
+ yymsp[-4].minor.yy182->x.pList = yymsp[-1].minor.yy232;
+ sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy182);
}else{
- sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy148);
+ sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy232);
}
- exprNot(pParse, yymsp[-3].minor.yy194, &yymsp[-4].minor.yy190);
+ if( yymsp[-3].minor.yy502 ) yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy182, 0);
}
- yymsp[-4].minor.yy190.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
}
break;
- case 189: /* expr ::= LP select RP */
+ case 201: /* expr ::= LP select RP */
{
- spanSet(&yymsp[-2].minor.yy190,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-B*/
- yymsp[-2].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0);
- sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy190.pExpr, yymsp[-1].minor.yy243);
+ yymsp[-2].minor.yy182 = sqlite3PExpr(pParse, TK_SELECT, 0, 0);
+ sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy182, yymsp[-1].minor.yy399);
}
break;
- case 190: /* expr ::= expr in_op LP select RP */
+ case 202: /* expr ::= expr in_op LP select RP */
{
- yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy190.pExpr, 0);
- sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy190.pExpr, yymsp[-1].minor.yy243);
- exprNot(pParse, yymsp[-3].minor.yy194, &yymsp[-4].minor.yy190);
- yymsp[-4].minor.yy190.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
+ yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy182, 0);
+ sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy182, yymsp[-1].minor.yy399);
+ if( yymsp[-3].minor.yy502 ) yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy182, 0);
}
break;
- case 191: /* expr ::= expr in_op nm dbnm paren_exprlist */
+ case 203: /* expr ::= expr in_op nm dbnm paren_exprlist */
{
SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);
- Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0);
- if( yymsp[0].minor.yy148 ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy148);
- yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy190.pExpr, 0);
- sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy190.pExpr, pSelect);
- exprNot(pParse, yymsp[-3].minor.yy194, &yymsp[-4].minor.yy190);
- yymsp[-4].minor.yy190.zEnd = yymsp[-1].minor.yy0.z ? &yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n] : &yymsp[-2].minor.yy0.z[yymsp[-2].minor.yy0.n];
+ Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0);
+ if( yymsp[0].minor.yy232 ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy232);
+ yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy182, 0);
+ sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy182, pSelect);
+ if( yymsp[-3].minor.yy502 ) yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy182, 0);
}
break;
- case 192: /* expr ::= EXISTS LP select RP */
+ case 204: /* expr ::= EXISTS LP select RP */
{
Expr *p;
- spanSet(&yymsp[-3].minor.yy190,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-B*/
- p = yymsp[-3].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0);
- sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy243);
+ p = yymsp[-3].minor.yy182 = sqlite3PExpr(pParse, TK_EXISTS, 0, 0);
+ sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy399);
}
break;
- case 193: /* expr ::= CASE case_operand case_exprlist case_else END */
+ case 205: /* expr ::= CASE case_operand case_exprlist case_else END */
{
- spanSet(&yymsp[-4].minor.yy190,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-C*/
- yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy72, 0);
- if( yymsp[-4].minor.yy190.pExpr ){
- yymsp[-4].minor.yy190.pExpr->x.pList = yymsp[-1].minor.yy72 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy148,yymsp[-1].minor.yy72) : yymsp[-2].minor.yy148;
- sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy190.pExpr);
+ yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy182, 0);
+ if( yymsp[-4].minor.yy182 ){
+ yymsp[-4].minor.yy182->x.pList = yymsp[-1].minor.yy182 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy232,yymsp[-1].minor.yy182) : yymsp[-2].minor.yy232;
+ sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy182);
}else{
- sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy148);
- sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy72);
+ sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy232);
+ sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy182);
}
}
break;
- case 194: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */
+ case 206: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */
{
- yymsp[-4].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy148, yymsp[-2].minor.yy190.pExpr);
- yymsp[-4].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy148, yymsp[0].minor.yy190.pExpr);
+ yymsp[-4].minor.yy232 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy232, yymsp[-2].minor.yy182);
+ yymsp[-4].minor.yy232 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy232, yymsp[0].minor.yy182);
}
break;
- case 195: /* case_exprlist ::= WHEN expr THEN expr */
+ case 207: /* case_exprlist ::= WHEN expr THEN expr */
{
- yymsp[-3].minor.yy148 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy190.pExpr);
- yymsp[-3].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy148, yymsp[0].minor.yy190.pExpr);
+ yymsp[-3].minor.yy232 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy182);
+ yymsp[-3].minor.yy232 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy232, yymsp[0].minor.yy182);
}
break;
- case 198: /* case_operand ::= expr */
-{yymsp[0].minor.yy72 = yymsp[0].minor.yy190.pExpr; /*A-overwrites-X*/}
+ case 210: /* case_operand ::= expr */
+{yymsp[0].minor.yy182 = yymsp[0].minor.yy182; /*A-overwrites-X*/}
break;
- case 201: /* nexprlist ::= nexprlist COMMA expr */
-{yymsp[-2].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy148,yymsp[0].minor.yy190.pExpr);}
+ case 213: /* nexprlist ::= nexprlist COMMA expr */
+{yymsp[-2].minor.yy232 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy232,yymsp[0].minor.yy182);}
break;
- case 202: /* nexprlist ::= expr */
-{yymsp[0].minor.yy148 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy190.pExpr); /*A-overwrites-Y*/}
+ case 214: /* nexprlist ::= expr */
+{yymsp[0].minor.yy232 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy182); /*A-overwrites-Y*/}
break;
- case 204: /* paren_exprlist ::= LP exprlist RP */
- case 209: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==209);
-{yymsp[-2].minor.yy148 = yymsp[-1].minor.yy148;}
+ case 216: /* paren_exprlist ::= LP exprlist RP */
+ case 221: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==221);
+{yymsp[-2].minor.yy232 = yymsp[-1].minor.yy232;}
break;
- case 205: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */
+ case 217: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */
{
sqlite3CreateIndex(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0,
- sqlite3SrcListAppend(pParse->db,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy148, yymsp[-10].minor.yy194,
- &yymsp[-11].minor.yy0, yymsp[0].minor.yy72, SQLITE_SO_ASC, yymsp[-8].minor.yy194, SQLITE_IDXTYPE_APPDEF);
+ sqlite3SrcListAppend(pParse->db,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy232, yymsp[-10].minor.yy502,
+ &yymsp[-11].minor.yy0, yymsp[0].minor.yy182, SQLITE_SO_ASC, yymsp[-8].minor.yy502, SQLITE_IDXTYPE_APPDEF);
}
break;
- case 206: /* uniqueflag ::= UNIQUE */
- case 246: /* raisetype ::= ABORT */ yytestcase(yyruleno==246);
-{yymsp[0].minor.yy194 = OE_Abort;}
+ case 218: /* uniqueflag ::= UNIQUE */
+ case 258: /* raisetype ::= ABORT */ yytestcase(yyruleno==258);
+{yymsp[0].minor.yy502 = OE_Abort;}
break;
- case 207: /* uniqueflag ::= */
-{yymsp[1].minor.yy194 = OE_None;}
+ case 219: /* uniqueflag ::= */
+{yymsp[1].minor.yy502 = OE_None;}
break;
- case 210: /* eidlist ::= eidlist COMMA nm collate sortorder */
+ case 222: /* eidlist ::= eidlist COMMA nm collate sortorder */
{
- yymsp[-4].minor.yy148 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy148, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy194, yymsp[0].minor.yy194);
+ yymsp[-4].minor.yy232 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy232, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy502, yymsp[0].minor.yy502);
}
break;
- case 211: /* eidlist ::= nm collate sortorder */
+ case 223: /* eidlist ::= nm collate sortorder */
{
- yymsp[-2].minor.yy148 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy194, yymsp[0].minor.yy194); /*A-overwrites-Y*/
+ yymsp[-2].minor.yy232 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy502, yymsp[0].minor.yy502); /*A-overwrites-Y*/
}
break;
- case 214: /* cmd ::= DROP INDEX ifexists fullname */
-{sqlite3DropIndex(pParse, yymsp[0].minor.yy185, yymsp[-1].minor.yy194);}
+ case 226: /* cmd ::= DROP INDEX ifexists fullname */
+{sqlite3DropIndex(pParse, yymsp[0].minor.yy427, yymsp[-1].minor.yy502);}
break;
- case 215: /* cmd ::= VACUUM */
+ case 227: /* cmd ::= VACUUM */
{sqlite3Vacuum(pParse,0);}
break;
- case 216: /* cmd ::= VACUUM nm */
+ case 228: /* cmd ::= VACUUM nm */
{sqlite3Vacuum(pParse,&yymsp[0].minor.yy0);}
break;
- case 217: /* cmd ::= PRAGMA nm dbnm */
+ case 229: /* cmd ::= PRAGMA nm dbnm */
{sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);}
break;
- case 218: /* cmd ::= PRAGMA nm dbnm EQ nmnum */
+ case 230: /* cmd ::= PRAGMA nm dbnm EQ nmnum */
{sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0);}
break;
- case 219: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */
+ case 231: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */
{sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);}
break;
- case 220: /* cmd ::= PRAGMA nm dbnm EQ minus_num */
+ case 232: /* cmd ::= PRAGMA nm dbnm EQ minus_num */
{sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);}
break;
- case 221: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */
+ case 233: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */
{sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,1);}
break;
- case 224: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */
+ case 236: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */
{
Token all;
all.z = yymsp[-3].minor.yy0.z;
all.n = (int)(yymsp[0].minor.yy0.z - yymsp[-3].minor.yy0.z) + yymsp[0].minor.yy0.n;
- sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy145, &all);
+ sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy47, &all);
}
break;
- case 225: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */
+ case 237: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */
{
- sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy194, yymsp[-4].minor.yy332.a, yymsp[-4].minor.yy332.b, yymsp[-2].minor.yy185, yymsp[0].minor.yy72, yymsp[-10].minor.yy194, yymsp[-8].minor.yy194);
+ sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy502, yymsp[-4].minor.yy300.a, yymsp[-4].minor.yy300.b, yymsp[-2].minor.yy427, yymsp[0].minor.yy182, yymsp[-10].minor.yy502, yymsp[-8].minor.yy502);
yymsp[-10].minor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0); /*A-overwrites-T*/
}
break;
- case 226: /* trigger_time ::= BEFORE|AFTER */
-{ yymsp[0].minor.yy194 = yymsp[0].major; /*A-overwrites-X*/ }
+ case 238: /* trigger_time ::= BEFORE|AFTER */
+{ yymsp[0].minor.yy502 = yymsp[0].major; /*A-overwrites-X*/ }
break;
- case 227: /* trigger_time ::= INSTEAD OF */
-{ yymsp[-1].minor.yy194 = TK_INSTEAD;}
+ case 239: /* trigger_time ::= INSTEAD OF */
+{ yymsp[-1].minor.yy502 = TK_INSTEAD;}
break;
- case 228: /* trigger_time ::= */
-{ yymsp[1].minor.yy194 = TK_BEFORE; }
+ case 240: /* trigger_time ::= */
+{ yymsp[1].minor.yy502 = TK_BEFORE; }
break;
- case 229: /* trigger_event ::= DELETE|INSERT */
- case 230: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==230);
-{yymsp[0].minor.yy332.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy332.b = 0;}
+ case 241: /* trigger_event ::= DELETE|INSERT */
+ case 242: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==242);
+{yymsp[0].minor.yy300.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy300.b = 0;}
break;
- case 231: /* trigger_event ::= UPDATE OF idlist */
-{yymsp[-2].minor.yy332.a = TK_UPDATE; yymsp[-2].minor.yy332.b = yymsp[0].minor.yy254;}
+ case 243: /* trigger_event ::= UPDATE OF idlist */
+{yymsp[-2].minor.yy300.a = TK_UPDATE; yymsp[-2].minor.yy300.b = yymsp[0].minor.yy510;}
break;
- case 232: /* when_clause ::= */
- case 251: /* key_opt ::= */ yytestcase(yyruleno==251);
-{ yymsp[1].minor.yy72 = 0; }
+ case 244: /* when_clause ::= */
+ case 263: /* key_opt ::= */ yytestcase(yyruleno==263);
+{ yymsp[1].minor.yy182 = 0; }
break;
- case 233: /* when_clause ::= WHEN expr */
- case 252: /* key_opt ::= KEY expr */ yytestcase(yyruleno==252);
-{ yymsp[-1].minor.yy72 = yymsp[0].minor.yy190.pExpr; }
+ case 245: /* when_clause ::= WHEN expr */
+ case 264: /* key_opt ::= KEY expr */ yytestcase(yyruleno==264);
+{ yymsp[-1].minor.yy182 = yymsp[0].minor.yy182; }
break;
- case 234: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */
+ case 246: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */
{
- assert( yymsp[-2].minor.yy145!=0 );
- yymsp[-2].minor.yy145->pLast->pNext = yymsp[-1].minor.yy145;
- yymsp[-2].minor.yy145->pLast = yymsp[-1].minor.yy145;
+ assert( yymsp[-2].minor.yy47!=0 );
+ yymsp[-2].minor.yy47->pLast->pNext = yymsp[-1].minor.yy47;
+ yymsp[-2].minor.yy47->pLast = yymsp[-1].minor.yy47;
}
break;
- case 235: /* trigger_cmd_list ::= trigger_cmd SEMI */
+ case 247: /* trigger_cmd_list ::= trigger_cmd SEMI */
{
- assert( yymsp[-1].minor.yy145!=0 );
- yymsp[-1].minor.yy145->pLast = yymsp[-1].minor.yy145;
+ assert( yymsp[-1].minor.yy47!=0 );
+ yymsp[-1].minor.yy47->pLast = yymsp[-1].minor.yy47;
}
break;
- case 236: /* trnm ::= nm DOT nm */
+ case 248: /* trnm ::= nm DOT nm */
{
yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;
sqlite3ErrorMsg(pParse,
@@ -140214,196 +144985,196 @@ static void yy_reduce(
"statements within triggers");
}
break;
- case 237: /* tridxby ::= INDEXED BY nm */
+ case 249: /* tridxby ::= INDEXED BY nm */
{
sqlite3ErrorMsg(pParse,
"the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
"within triggers");
}
break;
- case 238: /* tridxby ::= NOT INDEXED */
+ case 250: /* tridxby ::= NOT INDEXED */
{
sqlite3ErrorMsg(pParse,
"the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
"within triggers");
}
break;
- case 239: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt */
-{yymsp[-6].minor.yy145 = sqlite3TriggerUpdateStep(pParse->db, &yymsp[-4].minor.yy0, yymsp[-1].minor.yy148, yymsp[0].minor.yy72, yymsp[-5].minor.yy194);}
+ case 251: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */
+{yylhsminor.yy47 = sqlite3TriggerUpdateStep(pParse->db, &yymsp[-5].minor.yy0, yymsp[-2].minor.yy232, yymsp[-1].minor.yy182, yymsp[-6].minor.yy502, yymsp[-7].minor.yy0.z, yymsp[0].minor.yy36);}
+ yymsp[-7].minor.yy47 = yylhsminor.yy47;
break;
- case 240: /* trigger_cmd ::= insert_cmd INTO trnm idlist_opt select */
-{yymsp[-4].minor.yy145 = sqlite3TriggerInsertStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy254, yymsp[0].minor.yy243, yymsp[-4].minor.yy194);/*A-overwrites-R*/}
+ case 252: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */
+{
+ yylhsminor.yy47 = sqlite3TriggerInsertStep(pParse->db,&yymsp[-4].minor.yy0,yymsp[-3].minor.yy510,yymsp[-2].minor.yy399,yymsp[-6].minor.yy502,yymsp[-1].minor.yy198,yymsp[-7].minor.yy36,yymsp[0].minor.yy36);/*yylhsminor.yy47-overwrites-yymsp[-6].minor.yy502*/
+}
+ yymsp[-7].minor.yy47 = yylhsminor.yy47;
break;
- case 241: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt */
-{yymsp[-4].minor.yy145 = sqlite3TriggerDeleteStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[0].minor.yy72);}
+ case 253: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */
+{yylhsminor.yy47 = sqlite3TriggerDeleteStep(pParse->db, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy182, yymsp[-5].minor.yy0.z, yymsp[0].minor.yy36);}
+ yymsp[-5].minor.yy47 = yylhsminor.yy47;
break;
- case 242: /* trigger_cmd ::= select */
-{yymsp[0].minor.yy145 = sqlite3TriggerSelectStep(pParse->db, yymsp[0].minor.yy243); /*A-overwrites-X*/}
+ case 254: /* trigger_cmd ::= scanpt select scanpt */
+{yylhsminor.yy47 = sqlite3TriggerSelectStep(pParse->db, yymsp[-1].minor.yy399, yymsp[-2].minor.yy36, yymsp[0].minor.yy36); /*yylhsminor.yy47-overwrites-yymsp[-1].minor.yy399*/}
+ yymsp[-2].minor.yy47 = yylhsminor.yy47;
break;
- case 243: /* expr ::= RAISE LP IGNORE RP */
+ case 255: /* expr ::= RAISE LP IGNORE RP */
{
- spanSet(&yymsp[-3].minor.yy190,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/
- yymsp[-3].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0);
- if( yymsp[-3].minor.yy190.pExpr ){
- yymsp[-3].minor.yy190.pExpr->affinity = OE_Ignore;
+ yymsp[-3].minor.yy182 = sqlite3PExpr(pParse, TK_RAISE, 0, 0);
+ if( yymsp[-3].minor.yy182 ){
+ yymsp[-3].minor.yy182->affinity = OE_Ignore;
}
}
break;
- case 244: /* expr ::= RAISE LP raisetype COMMA nm RP */
+ case 256: /* expr ::= RAISE LP raisetype COMMA nm RP */
{
- spanSet(&yymsp[-5].minor.yy190,&yymsp[-5].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/
- yymsp[-5].minor.yy190.pExpr = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1);
- if( yymsp[-5].minor.yy190.pExpr ) {
- yymsp[-5].minor.yy190.pExpr->affinity = (char)yymsp[-3].minor.yy194;
+ yymsp[-5].minor.yy182 = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1);
+ if( yymsp[-5].minor.yy182 ) {
+ yymsp[-5].minor.yy182->affinity = (char)yymsp[-3].minor.yy502;
}
}
break;
- case 245: /* raisetype ::= ROLLBACK */
-{yymsp[0].minor.yy194 = OE_Rollback;}
+ case 257: /* raisetype ::= ROLLBACK */
+{yymsp[0].minor.yy502 = OE_Rollback;}
break;
- case 247: /* raisetype ::= FAIL */
-{yymsp[0].minor.yy194 = OE_Fail;}
+ case 259: /* raisetype ::= FAIL */
+{yymsp[0].minor.yy502 = OE_Fail;}
break;
- case 248: /* cmd ::= DROP TRIGGER ifexists fullname */
+ case 260: /* cmd ::= DROP TRIGGER ifexists fullname */
{
- sqlite3DropTrigger(pParse,yymsp[0].minor.yy185,yymsp[-1].minor.yy194);
+ sqlite3DropTrigger(pParse,yymsp[0].minor.yy427,yymsp[-1].minor.yy502);
}
break;
- case 249: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */
+ case 261: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */
{
- sqlite3Attach(pParse, yymsp[-3].minor.yy190.pExpr, yymsp[-1].minor.yy190.pExpr, yymsp[0].minor.yy72);
+ sqlite3Attach(pParse, yymsp[-3].minor.yy182, yymsp[-1].minor.yy182, yymsp[0].minor.yy182);
}
break;
- case 250: /* cmd ::= DETACH database_kw_opt expr */
+ case 262: /* cmd ::= DETACH database_kw_opt expr */
{
- sqlite3Detach(pParse, yymsp[0].minor.yy190.pExpr);
+ sqlite3Detach(pParse, yymsp[0].minor.yy182);
}
break;
- case 253: /* cmd ::= REINDEX */
+ case 265: /* cmd ::= REINDEX */
{sqlite3Reindex(pParse, 0, 0);}
break;
- case 254: /* cmd ::= REINDEX nm dbnm */
+ case 266: /* cmd ::= REINDEX nm dbnm */
{sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);}
break;
- case 255: /* cmd ::= ANALYZE */
+ case 267: /* cmd ::= ANALYZE */
{sqlite3Analyze(pParse, 0, 0);}
break;
- case 256: /* cmd ::= ANALYZE nm dbnm */
+ case 268: /* cmd ::= ANALYZE nm dbnm */
{sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);}
break;
- case 257: /* cmd ::= ALTER TABLE fullname RENAME TO nm */
+ case 269: /* cmd ::= ALTER TABLE fullname RENAME TO nm */
{
- sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy185,&yymsp[0].minor.yy0);
+ sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy427,&yymsp[0].minor.yy0);
}
break;
- case 258: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */
+ case 270: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */
{
yymsp[-1].minor.yy0.n = (int)(pParse->sLastToken.z-yymsp[-1].minor.yy0.z) + pParse->sLastToken.n;
sqlite3AlterFinishAddColumn(pParse, &yymsp[-1].minor.yy0);
}
break;
- case 259: /* add_column_fullname ::= fullname */
+ case 271: /* add_column_fullname ::= fullname */
{
disableLookaside(pParse);
- sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy185);
+ sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy427);
}
break;
- case 260: /* cmd ::= create_vtab */
+ case 272: /* cmd ::= create_vtab */
{sqlite3VtabFinishParse(pParse,0);}
break;
- case 261: /* cmd ::= create_vtab LP vtabarglist RP */
+ case 273: /* cmd ::= create_vtab LP vtabarglist RP */
{sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);}
break;
- case 262: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */
+ case 274: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */
{
- sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy194);
+ sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy502);
}
break;
- case 263: /* vtabarg ::= */
+ case 275: /* vtabarg ::= */
{sqlite3VtabArgInit(pParse);}
break;
- case 264: /* vtabargtoken ::= ANY */
- case 265: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==265);
- case 266: /* lp ::= LP */ yytestcase(yyruleno==266);
+ case 276: /* vtabargtoken ::= ANY */
+ case 277: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==277);
+ case 278: /* lp ::= LP */ yytestcase(yyruleno==278);
{sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);}
break;
- case 267: /* with ::= */
-{yymsp[1].minor.yy285 = 0;}
- break;
- case 268: /* with ::= WITH wqlist */
-{ yymsp[-1].minor.yy285 = yymsp[0].minor.yy285; }
+ case 279: /* with ::= WITH wqlist */
+ case 280: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==280);
+{ sqlite3WithPush(pParse, yymsp[0].minor.yy91, 1); }
break;
- case 269: /* with ::= WITH RECURSIVE wqlist */
-{ yymsp[-2].minor.yy285 = yymsp[0].minor.yy285; }
- break;
- case 270: /* wqlist ::= nm eidlist_opt AS LP select RP */
+ case 281: /* wqlist ::= nm eidlist_opt AS LP select RP */
{
- yymsp[-5].minor.yy285 = sqlite3WithAdd(pParse, 0, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy148, yymsp[-1].minor.yy243); /*A-overwrites-X*/
+ yymsp[-5].minor.yy91 = sqlite3WithAdd(pParse, 0, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy232, yymsp[-1].minor.yy399); /*A-overwrites-X*/
}
break;
- case 271: /* wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */
+ case 282: /* wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */
{
- yymsp[-7].minor.yy285 = sqlite3WithAdd(pParse, yymsp[-7].minor.yy285, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy148, yymsp[-1].minor.yy243);
+ yymsp[-7].minor.yy91 = sqlite3WithAdd(pParse, yymsp[-7].minor.yy91, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy232, yymsp[-1].minor.yy399);
}
break;
default:
- /* (272) input ::= cmdlist */ yytestcase(yyruleno==272);
- /* (273) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==273);
- /* (274) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=274);
- /* (275) ecmd ::= SEMI */ yytestcase(yyruleno==275);
- /* (276) ecmd ::= explain cmdx SEMI */ yytestcase(yyruleno==276);
- /* (277) explain ::= */ yytestcase(yyruleno==277);
- /* (278) trans_opt ::= */ yytestcase(yyruleno==278);
- /* (279) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==279);
- /* (280) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==280);
- /* (281) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==281);
- /* (282) savepoint_opt ::= */ yytestcase(yyruleno==282);
- /* (283) cmd ::= create_table create_table_args */ yytestcase(yyruleno==283);
- /* (284) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==284);
- /* (285) columnlist ::= columnname carglist */ yytestcase(yyruleno==285);
- /* (286) nm ::= ID|INDEXED */ yytestcase(yyruleno==286);
- /* (287) nm ::= STRING */ yytestcase(yyruleno==287);
- /* (288) nm ::= JOIN_KW */ yytestcase(yyruleno==288);
- /* (289) typetoken ::= typename */ yytestcase(yyruleno==289);
- /* (290) typename ::= ID|STRING */ yytestcase(yyruleno==290);
- /* (291) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=291);
- /* (292) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=292);
- /* (293) carglist ::= carglist ccons */ yytestcase(yyruleno==293);
- /* (294) carglist ::= */ yytestcase(yyruleno==294);
- /* (295) ccons ::= NULL onconf */ yytestcase(yyruleno==295);
- /* (296) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==296);
- /* (297) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==297);
- /* (298) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=298);
- /* (299) tconscomma ::= */ yytestcase(yyruleno==299);
- /* (300) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=300);
- /* (301) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=301);
- /* (302) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=302);
- /* (303) oneselect ::= values */ yytestcase(yyruleno==303);
- /* (304) sclp ::= selcollist COMMA */ yytestcase(yyruleno==304);
- /* (305) as ::= ID|STRING */ yytestcase(yyruleno==305);
- /* (306) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=306);
- /* (307) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==307);
- /* (308) exprlist ::= nexprlist */ yytestcase(yyruleno==308);
- /* (309) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=309);
- /* (310) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=310);
- /* (311) nmnum ::= ON */ yytestcase(yyruleno==311);
- /* (312) nmnum ::= DELETE */ yytestcase(yyruleno==312);
- /* (313) nmnum ::= DEFAULT */ yytestcase(yyruleno==313);
- /* (314) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==314);
- /* (315) foreach_clause ::= */ yytestcase(yyruleno==315);
- /* (316) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==316);
- /* (317) trnm ::= nm */ yytestcase(yyruleno==317);
- /* (318) tridxby ::= */ yytestcase(yyruleno==318);
- /* (319) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==319);
- /* (320) database_kw_opt ::= */ yytestcase(yyruleno==320);
- /* (321) kwcolumn_opt ::= */ yytestcase(yyruleno==321);
- /* (322) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==322);
- /* (323) vtabarglist ::= vtabarg */ yytestcase(yyruleno==323);
- /* (324) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==324);
- /* (325) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==325);
- /* (326) anylist ::= */ yytestcase(yyruleno==326);
- /* (327) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==327);
- /* (328) anylist ::= anylist ANY */ yytestcase(yyruleno==328);
+ /* (283) input ::= cmdlist */ yytestcase(yyruleno==283);
+ /* (284) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==284);
+ /* (285) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=285);
+ /* (286) ecmd ::= SEMI */ yytestcase(yyruleno==286);
+ /* (287) ecmd ::= cmdx SEMI */ yytestcase(yyruleno==287);
+ /* (288) ecmd ::= explain cmdx */ yytestcase(yyruleno==288);
+ /* (289) trans_opt ::= */ yytestcase(yyruleno==289);
+ /* (290) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==290);
+ /* (291) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==291);
+ /* (292) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==292);
+ /* (293) savepoint_opt ::= */ yytestcase(yyruleno==293);
+ /* (294) cmd ::= create_table create_table_args */ yytestcase(yyruleno==294);
+ /* (295) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==295);
+ /* (296) columnlist ::= columnname carglist */ yytestcase(yyruleno==296);
+ /* (297) nm ::= ID|INDEXED */ yytestcase(yyruleno==297);
+ /* (298) nm ::= STRING */ yytestcase(yyruleno==298);
+ /* (299) nm ::= JOIN_KW */ yytestcase(yyruleno==299);
+ /* (300) typetoken ::= typename */ yytestcase(yyruleno==300);
+ /* (301) typename ::= ID|STRING */ yytestcase(yyruleno==301);
+ /* (302) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=302);
+ /* (303) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=303);
+ /* (304) carglist ::= carglist ccons */ yytestcase(yyruleno==304);
+ /* (305) carglist ::= */ yytestcase(yyruleno==305);
+ /* (306) ccons ::= NULL onconf */ yytestcase(yyruleno==306);
+ /* (307) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==307);
+ /* (308) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==308);
+ /* (309) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=309);
+ /* (310) tconscomma ::= */ yytestcase(yyruleno==310);
+ /* (311) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=311);
+ /* (312) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=312);
+ /* (313) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=313);
+ /* (314) oneselect ::= values */ yytestcase(yyruleno==314);
+ /* (315) sclp ::= selcollist COMMA */ yytestcase(yyruleno==315);
+ /* (316) as ::= ID|STRING */ yytestcase(yyruleno==316);
+ /* (317) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=317);
+ /* (318) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==318);
+ /* (319) exprlist ::= nexprlist */ yytestcase(yyruleno==319);
+ /* (320) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=320);
+ /* (321) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=321);
+ /* (322) nmnum ::= ON */ yytestcase(yyruleno==322);
+ /* (323) nmnum ::= DELETE */ yytestcase(yyruleno==323);
+ /* (324) nmnum ::= DEFAULT */ yytestcase(yyruleno==324);
+ /* (325) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==325);
+ /* (326) foreach_clause ::= */ yytestcase(yyruleno==326);
+ /* (327) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==327);
+ /* (328) trnm ::= nm */ yytestcase(yyruleno==328);
+ /* (329) tridxby ::= */ yytestcase(yyruleno==329);
+ /* (330) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==330);
+ /* (331) database_kw_opt ::= */ yytestcase(yyruleno==331);
+ /* (332) kwcolumn_opt ::= */ yytestcase(yyruleno==332);
+ /* (333) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==333);
+ /* (334) vtabarglist ::= vtabarg */ yytestcase(yyruleno==334);
+ /* (335) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==335);
+ /* (336) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==336);
+ /* (337) anylist ::= */ yytestcase(yyruleno==337);
+ /* (338) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==338);
+ /* (339) anylist ::= anylist ANY */ yytestcase(yyruleno==339);
+ /* (340) with ::= */ yytestcase(yyruleno==340);
break;
/********** End reduce actions ************************************************/
};
@@ -140419,16 +145190,12 @@ static void yy_reduce(
/* It is not possible for a REDUCE to be followed by an error */
assert( yyact!=YY_ERROR_ACTION );
- if( yyact==YY_ACCEPT_ACTION ){
- yypParser->yytos += yysize;
- yy_accept(yypParser);
- }else{
- yymsp += yysize+1;
- yypParser->yytos = yymsp;
- yymsp->stateno = (YYACTIONTYPE)yyact;
- yymsp->major = (YYCODETYPE)yygoto;
- yyTraceShift(yypParser, yyact);
- }
+ yymsp += yysize+1;
+ yypParser->yytos = yymsp;
+ yymsp->stateno = (YYACTIONTYPE)yyact;
+ yymsp->major = (YYCODETYPE)yygoto;
+ yyTraceShift(yypParser, yyact, "... then shift");
+ return yyact;
}
/*
@@ -140438,7 +145205,8 @@ static void yy_reduce(
static void yy_parse_failed(
yyParser *yypParser /* The parser */
){
- sqlite3ParserARG_FETCH;
+ sqlite3ParserARG_FETCH
+ sqlite3ParserCTX_FETCH
#ifndef NDEBUG
if( yyTraceFILE ){
fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt);
@@ -140449,7 +145217,8 @@ static void yy_parse_failed(
** parser fails */
/************ Begin %parse_failure code ***************************************/
/************ End %parse_failure code *****************************************/
- sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */
+ sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument variable */
+ sqlite3ParserCTX_STORE
}
#endif /* YYNOERRORRECOVERY */
@@ -140461,15 +145230,20 @@ static void yy_syntax_error(
int yymajor, /* The major type of the error token */
sqlite3ParserTOKENTYPE yyminor /* The minor type of the error token */
){
- sqlite3ParserARG_FETCH;
+ sqlite3ParserARG_FETCH
+ sqlite3ParserCTX_FETCH
#define TOKEN yyminor
/************ Begin %syntax_error code ****************************************/
UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */
- assert( TOKEN.z[0] ); /* The tokenizer always gives us a token */
- sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
+ if( TOKEN.z[0] ){
+ sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
+ }else{
+ sqlite3ErrorMsg(pParse, "incomplete input");
+ }
/************ End %syntax_error code ******************************************/
- sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */
+ sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument variable */
+ sqlite3ParserCTX_STORE
}
/*
@@ -140478,7 +145252,8 @@ static void yy_syntax_error(
static void yy_accept(
yyParser *yypParser /* The parser */
){
- sqlite3ParserARG_FETCH;
+ sqlite3ParserARG_FETCH
+ sqlite3ParserCTX_FETCH
#ifndef NDEBUG
if( yyTraceFILE ){
fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt);
@@ -140492,7 +145267,8 @@ static void yy_accept(
** parser accepts */
/*********** Begin %parse_accept code *****************************************/
/*********** End %parse_accept code *******************************************/
- sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */
+ sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument variable */
+ sqlite3ParserCTX_STORE
}
/* The main parser program.
@@ -140521,38 +145297,51 @@ SQLITE_PRIVATE void sqlite3Parser(
sqlite3ParserARG_PDECL /* Optional %extra_argument parameter */
){
YYMINORTYPE yyminorunion;
- unsigned int yyact; /* The parser action. */
+ YYACTIONTYPE yyact; /* The parser action. */
#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY)
int yyendofinput; /* True if we are at the end of input */
#endif
#ifdef YYERRORSYMBOL
int yyerrorhit = 0; /* True if yymajor has invoked an error */
#endif
- yyParser *yypParser; /* The parser */
+ yyParser *yypParser = (yyParser*)yyp; /* The parser */
+ sqlite3ParserCTX_FETCH
+ sqlite3ParserARG_STORE
- yypParser = (yyParser*)yyp;
assert( yypParser->yytos!=0 );
#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY)
yyendofinput = (yymajor==0);
#endif
- sqlite3ParserARG_STORE;
+ yyact = yypParser->yytos->stateno;
#ifndef NDEBUG
if( yyTraceFILE ){
- fprintf(yyTraceFILE,"%sInput '%s'\n",yyTracePrompt,yyTokenName[yymajor]);
+ if( yyact < YY_MIN_REDUCE ){
+ fprintf(yyTraceFILE,"%sInput '%s' in state %d\n",
+ yyTracePrompt,yyTokenName[yymajor],yyact);
+ }else{
+ fprintf(yyTraceFILE,"%sInput '%s' with pending reduce %d\n",
+ yyTracePrompt,yyTokenName[yymajor],yyact-YY_MIN_REDUCE);
+ }
}
#endif
do{
- yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor);
- if( yyact <= YY_MAX_SHIFTREDUCE ){
+ assert( yyact==yypParser->yytos->stateno );
+ yyact = yy_find_shift_action(yymajor,yyact);
+ if( yyact >= YY_MIN_REDUCE ){
+ yyact = yy_reduce(yypParser,yyact-YY_MIN_REDUCE,yymajor,
+ yyminor sqlite3ParserCTX_PARAM);
+ }else if( yyact <= YY_MAX_SHIFTREDUCE ){
yy_shift(yypParser,yyact,yymajor,yyminor);
#ifndef YYNOERRORRECOVERY
yypParser->yyerrcnt--;
#endif
- yymajor = YYNOCODE;
- }else if( yyact <= YY_MAX_REDUCE ){
- yy_reduce(yypParser,yyact-YY_MIN_REDUCE);
+ break;
+ }else if( yyact==YY_ACCEPT_ACTION ){
+ yypParser->yytos--;
+ yy_accept(yypParser);
+ return;
}else{
assert( yyact == YY_ERROR_ACTION );
yyminorunion.yy0 = yyminor;
@@ -140619,6 +145408,8 @@ SQLITE_PRIVATE void sqlite3Parser(
}
yypParser->yyerrcnt = 3;
yyerrorhit = 1;
+ if( yymajor==YYNOCODE ) break;
+ yyact = yypParser->yytos->stateno;
#elif defined(YYNOERRORRECOVERY)
/* If the YYNOERRORRECOVERY macro is defined, then do not attempt to
** do any kind of error recovery. Instead, simply invoke the syntax
@@ -140629,8 +145420,7 @@ SQLITE_PRIVATE void sqlite3Parser(
*/
yy_syntax_error(yypParser,yymajor, yyminor);
yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
- yymajor = YYNOCODE;
-
+ break;
#else /* YYERRORSYMBOL is not defined */
/* This is what we do if the grammar does not define ERROR:
**
@@ -140652,10 +145442,10 @@ SQLITE_PRIVATE void sqlite3Parser(
yypParser->yyerrcnt = -1;
#endif
}
- yymajor = YYNOCODE;
+ break;
#endif
}
- }while( yymajor!=YYNOCODE && yypParser->yytos>yypParser->yystack );
+ }while( yypParser->yytos>yypParser->yystack );
#ifndef NDEBUG
if( yyTraceFILE ){
yyStackEntry *i;
@@ -140832,19 +145622,19 @@ const unsigned char ebcdicToAscii[] = {
** is substantially reduced. This is important for embedded applications
** on platforms with limited memory.
*/
-/* Hash score: 182 */
-/* zKWText[] encodes 834 bytes of keyword text in 554 bytes */
+/* Hash score: 185 */
+/* zKWText[] encodes 845 bytes of keyword text in 561 bytes */
/* REINDEXEDESCAPEACHECKEYBEFOREIGNOREGEXPLAINSTEADDATABASELECT */
/* ABLEFTHENDEFERRABLELSEXCEPTRANSACTIONATURALTERAISEXCLUSIVE */
/* XISTSAVEPOINTERSECTRIGGEREFERENCESCONSTRAINTOFFSETEMPORARY */
/* UNIQUERYWITHOUTERELEASEATTACHAVINGROUPDATEBEGINNERECURSIVE */
-/* BETWEENOTNULLIKECASCADELETECASECOLLATECREATECURRENT_DATEDETACH */
-/* IMMEDIATEJOINSERTMATCHPLANALYZEPRAGMABORTVALUESVIRTUALIMITWHEN */
-/* WHERENAMEAFTEREPLACEANDEFAULTAUTOINCREMENTCASTCOLUMNCOMMIT */
-/* CONFLICTCROSSCURRENT_TIMESTAMPRIMARYDEFERREDISTINCTDROPFAIL */
-/* FROMFULLGLOBYIFISNULLORDERESTRICTRIGHTROLLBACKROWUNIONUSING */
-/* VACUUMVIEWINITIALLY */
-static const char zKWText[553] = {
+/* BETWEENOTHINGLOBYCASCADELETECASECOLLATECREATECURRENT_DATE */
+/* DETACHIMMEDIATEJOINSERTLIKEMATCHPLANALYZEPRAGMABORTVALUES */
+/* VIRTUALIMITWHENOTNULLWHERENAMEAFTEREPLACEANDEFAULT */
+/* AUTOINCREMENTCASTCOLUMNCOMMITCONFLICTCROSSCURRENT_TIMESTAMP */
+/* RIMARYDEFERREDISTINCTDORDERESTRICTDROPFAILFROMFULLIFISNULL */
+/* RIGHTROLLBACKROWUNIONUSINGVACUUMVIEWINITIALLY */
+static const char zKWText[560] = {
'R','E','I','N','D','E','X','E','D','E','S','C','A','P','E','A','C','H',
'E','C','K','E','Y','B','E','F','O','R','E','I','G','N','O','R','E','G',
'E','X','P','L','A','I','N','S','T','E','A','D','D','A','T','A','B','A',
@@ -140858,82 +145648,83 @@ static const char zKWText[553] = {
'U','E','R','Y','W','I','T','H','O','U','T','E','R','E','L','E','A','S',
'E','A','T','T','A','C','H','A','V','I','N','G','R','O','U','P','D','A',
'T','E','B','E','G','I','N','N','E','R','E','C','U','R','S','I','V','E',
- 'B','E','T','W','E','E','N','O','T','N','U','L','L','I','K','E','C','A',
- 'S','C','A','D','E','L','E','T','E','C','A','S','E','C','O','L','L','A',
- 'T','E','C','R','E','A','T','E','C','U','R','R','E','N','T','_','D','A',
- 'T','E','D','E','T','A','C','H','I','M','M','E','D','I','A','T','E','J',
- 'O','I','N','S','E','R','T','M','A','T','C','H','P','L','A','N','A','L',
- 'Y','Z','E','P','R','A','G','M','A','B','O','R','T','V','A','L','U','E',
- 'S','V','I','R','T','U','A','L','I','M','I','T','W','H','E','N','W','H',
- 'E','R','E','N','A','M','E','A','F','T','E','R','E','P','L','A','C','E',
- 'A','N','D','E','F','A','U','L','T','A','U','T','O','I','N','C','R','E',
- 'M','E','N','T','C','A','S','T','C','O','L','U','M','N','C','O','M','M',
- 'I','T','C','O','N','F','L','I','C','T','C','R','O','S','S','C','U','R',
- 'R','E','N','T','_','T','I','M','E','S','T','A','M','P','R','I','M','A',
- 'R','Y','D','E','F','E','R','R','E','D','I','S','T','I','N','C','T','D',
- 'R','O','P','F','A','I','L','F','R','O','M','F','U','L','L','G','L','O',
- 'B','Y','I','F','I','S','N','U','L','L','O','R','D','E','R','E','S','T',
- 'R','I','C','T','R','I','G','H','T','R','O','L','L','B','A','C','K','R',
- 'O','W','U','N','I','O','N','U','S','I','N','G','V','A','C','U','U','M',
- 'V','I','E','W','I','N','I','T','I','A','L','L','Y',
+ 'B','E','T','W','E','E','N','O','T','H','I','N','G','L','O','B','Y','C',
+ 'A','S','C','A','D','E','L','E','T','E','C','A','S','E','C','O','L','L',
+ 'A','T','E','C','R','E','A','T','E','C','U','R','R','E','N','T','_','D',
+ 'A','T','E','D','E','T','A','C','H','I','M','M','E','D','I','A','T','E',
+ 'J','O','I','N','S','E','R','T','L','I','K','E','M','A','T','C','H','P',
+ 'L','A','N','A','L','Y','Z','E','P','R','A','G','M','A','B','O','R','T',
+ 'V','A','L','U','E','S','V','I','R','T','U','A','L','I','M','I','T','W',
+ 'H','E','N','O','T','N','U','L','L','W','H','E','R','E','N','A','M','E',
+ 'A','F','T','E','R','E','P','L','A','C','E','A','N','D','E','F','A','U',
+ 'L','T','A','U','T','O','I','N','C','R','E','M','E','N','T','C','A','S',
+ 'T','C','O','L','U','M','N','C','O','M','M','I','T','C','O','N','F','L',
+ 'I','C','T','C','R','O','S','S','C','U','R','R','E','N','T','_','T','I',
+ 'M','E','S','T','A','M','P','R','I','M','A','R','Y','D','E','F','E','R',
+ 'R','E','D','I','S','T','I','N','C','T','D','O','R','D','E','R','E','S',
+ 'T','R','I','C','T','D','R','O','P','F','A','I','L','F','R','O','M','F',
+ 'U','L','L','I','F','I','S','N','U','L','L','R','I','G','H','T','R','O',
+ 'L','L','B','A','C','K','R','O','W','U','N','I','O','N','U','S','I','N',
+ 'G','V','A','C','U','U','M','V','I','E','W','I','N','I','T','I','A','L',
+ 'L','Y',
};
/* aKWHash[i] is the hash value for the i-th keyword */
static const unsigned char aKWHash[127] = {
- 76, 105, 117, 74, 0, 45, 0, 0, 82, 0, 77, 0, 0,
- 42, 12, 78, 15, 0, 116, 85, 54, 112, 0, 19, 0, 0,
- 121, 0, 119, 115, 0, 22, 93, 0, 9, 0, 0, 70, 71,
- 0, 69, 6, 0, 48, 90, 102, 0, 118, 101, 0, 0, 44,
- 0, 103, 24, 0, 17, 0, 122, 53, 23, 0, 5, 110, 25,
- 96, 0, 0, 124, 106, 60, 123, 57, 28, 55, 0, 91, 0,
- 100, 26, 0, 99, 0, 0, 0, 95, 92, 97, 88, 109, 14,
- 39, 108, 0, 81, 0, 18, 89, 111, 32, 0, 120, 80, 113,
- 62, 46, 84, 0, 0, 94, 40, 59, 114, 0, 36, 0, 0,
- 29, 0, 86, 63, 64, 0, 20, 61, 0, 56,
+ 74, 108, 119, 72, 0, 45, 0, 0, 81, 0, 76, 61, 0,
+ 42, 12, 77, 15, 0, 118, 84, 54, 116, 0, 19, 0, 0,
+ 123, 0, 121, 111, 0, 22, 96, 0, 9, 0, 0, 68, 69,
+ 0, 67, 6, 0, 48, 93, 105, 0, 120, 104, 0, 0, 44,
+ 0, 106, 24, 0, 17, 0, 124, 53, 23, 0, 5, 62, 25,
+ 99, 0, 0, 126, 112, 60, 125, 57, 28, 55, 0, 94, 0,
+ 103, 26, 0, 102, 0, 0, 0, 98, 95, 100, 91, 115, 14,
+ 39, 114, 0, 80, 0, 109, 92, 90, 32, 0, 122, 79, 117,
+ 86, 46, 83, 0, 0, 97, 40, 59, 110, 0, 36, 0, 0,
+ 29, 0, 89, 87, 88, 0, 20, 85, 0, 56,
};
/* aKWNext[] forms the hash collision chain. If aKWHash[i]==0
** then the i-th keyword has no more hash collisions. Otherwise,
** the next keyword with the same hash is aKWHash[i]-1. */
-static const unsigned char aKWNext[124] = {
+static const unsigned char aKWNext[126] = {
0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0,
0, 2, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0,
0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 33, 0, 21, 0, 0, 0, 0, 0, 50,
- 0, 43, 3, 47, 0, 0, 0, 0, 30, 0, 58, 0, 38,
- 0, 0, 0, 1, 66, 0, 0, 67, 0, 41, 0, 0, 0,
- 0, 0, 0, 49, 65, 0, 0, 0, 0, 31, 52, 16, 34,
- 10, 0, 0, 0, 0, 0, 0, 0, 11, 72, 79, 0, 8,
- 0, 104, 98, 0, 107, 0, 87, 0, 75, 51, 0, 27, 37,
- 73, 83, 0, 35, 68, 0, 0,
+ 0, 43, 3, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 64, 0, 0, 65, 0, 41, 0, 38, 0, 0, 0,
+ 0, 0, 49, 75, 0, 0, 30, 0, 58, 0, 0, 63, 31,
+ 52, 16, 34, 10, 0, 0, 0, 0, 0, 0, 0, 11, 70,
+ 78, 0, 8, 0, 18, 51, 0, 107, 101, 0, 113, 0, 73,
+ 27, 37, 71, 82, 0, 35, 66, 0, 0,
};
/* aKWLen[i] is the length (in bytes) of the i-th keyword */
-static const unsigned char aKWLen[124] = {
+static const unsigned char aKWLen[126] = {
7, 7, 5, 4, 6, 4, 5, 3, 6, 7, 3, 6, 6,
7, 7, 3, 8, 2, 6, 5, 4, 4, 3, 10, 4, 6,
11, 6, 2, 7, 5, 5, 9, 6, 9, 9, 7, 10, 10,
4, 6, 2, 3, 9, 4, 2, 6, 5, 7, 4, 5, 7,
- 6, 6, 5, 6, 5, 5, 9, 7, 7, 3, 2, 4, 4,
- 7, 3, 6, 4, 7, 6, 12, 6, 9, 4, 6, 5, 4,
- 7, 6, 5, 6, 7, 5, 4, 5, 6, 5, 7, 3, 7,
- 13, 2, 2, 4, 6, 6, 8, 5, 17, 12, 7, 8, 8,
- 2, 4, 4, 4, 4, 4, 2, 2, 6, 5, 8, 5, 8,
- 3, 5, 5, 6, 4, 9, 3,
+ 6, 6, 5, 6, 5, 5, 9, 7, 7, 4, 2, 7, 3,
+ 6, 4, 7, 6, 12, 6, 9, 4, 6, 4, 5, 4, 7,
+ 6, 5, 6, 7, 5, 4, 7, 3, 2, 4, 5, 6, 5,
+ 7, 3, 7, 13, 2, 2, 4, 6, 6, 8, 5, 17, 12,
+ 7, 8, 8, 2, 2, 5, 8, 4, 4, 4, 4, 2, 6,
+ 5, 8, 3, 5, 5, 6, 4, 9, 3,
};
/* aKWOffset[i] is the index into zKWText[] of the start of
** the text for the i-th keyword. */
-static const unsigned short int aKWOffset[124] = {
+static const unsigned short int aKWOffset[126] = {
0, 2, 2, 8, 9, 14, 16, 20, 23, 25, 25, 29, 33,
36, 41, 46, 48, 53, 54, 59, 62, 65, 67, 69, 78, 81,
86, 91, 95, 96, 101, 105, 109, 117, 122, 128, 136, 142, 152,
159, 162, 162, 165, 167, 167, 171, 176, 179, 184, 184, 188, 192,
- 199, 204, 209, 212, 218, 221, 225, 234, 240, 240, 240, 243, 246,
- 250, 251, 255, 261, 265, 272, 278, 290, 296, 305, 307, 313, 318,
- 320, 327, 332, 337, 343, 349, 354, 358, 361, 367, 371, 378, 380,
- 387, 389, 391, 400, 404, 410, 416, 424, 429, 429, 445, 452, 459,
- 460, 467, 471, 475, 479, 483, 486, 488, 490, 496, 500, 508, 513,
- 521, 524, 529, 534, 540, 544, 549,
+ 199, 204, 209, 212, 218, 221, 225, 234, 240, 246, 249, 251, 252,
+ 256, 262, 266, 273, 279, 291, 297, 306, 308, 314, 318, 323, 325,
+ 332, 337, 342, 348, 354, 359, 362, 362, 362, 365, 369, 372, 378,
+ 382, 389, 391, 398, 400, 402, 411, 415, 421, 427, 435, 440, 440,
+ 456, 463, 470, 471, 478, 479, 483, 491, 495, 499, 503, 507, 509,
+ 515, 520, 528, 531, 536, 541, 547, 551, 556,
};
/* aKWCode[i] is the parser symbol code for the i-th keyword */
-static const unsigned char aKWCode[124] = {
+static const unsigned char aKWCode[126] = {
TK_REINDEX, TK_INDEXED, TK_INDEX, TK_DESC, TK_ESCAPE,
TK_EACH, TK_CHECK, TK_KEY, TK_BEFORE, TK_FOREIGN,
TK_FOR, TK_IGNORE, TK_LIKE_KW, TK_EXPLAIN, TK_INSTEAD,
@@ -140946,19 +145737,20 @@ static const unsigned char aKWCode[124] = {
TK_OR, TK_UNIQUE, TK_QUERY, TK_WITHOUT, TK_WITH,
TK_JOIN_KW, TK_RELEASE, TK_ATTACH, TK_HAVING, TK_GROUP,
TK_UPDATE, TK_BEGIN, TK_JOIN_KW, TK_RECURSIVE, TK_BETWEEN,
- TK_NOTNULL, TK_NOT, TK_NO, TK_NULL, TK_LIKE_KW,
- TK_CASCADE, TK_ASC, TK_DELETE, TK_CASE, TK_COLLATE,
- TK_CREATE, TK_CTIME_KW, TK_DETACH, TK_IMMEDIATE, TK_JOIN,
- TK_INSERT, TK_MATCH, TK_PLAN, TK_ANALYZE, TK_PRAGMA,
- TK_ABORT, TK_VALUES, TK_VIRTUAL, TK_LIMIT, TK_WHEN,
- TK_WHERE, TK_RENAME, TK_AFTER, TK_REPLACE, TK_AND,
- TK_DEFAULT, TK_AUTOINCR, TK_TO, TK_IN, TK_CAST,
- TK_COLUMNKW, TK_COMMIT, TK_CONFLICT, TK_JOIN_KW, TK_CTIME_KW,
- TK_CTIME_KW, TK_PRIMARY, TK_DEFERRED, TK_DISTINCT, TK_IS,
- TK_DROP, TK_FAIL, TK_FROM, TK_JOIN_KW, TK_LIKE_KW,
- TK_BY, TK_IF, TK_ISNULL, TK_ORDER, TK_RESTRICT,
- TK_JOIN_KW, TK_ROLLBACK, TK_ROW, TK_UNION, TK_USING,
- TK_VACUUM, TK_VIEW, TK_INITIALLY, TK_ALL,
+ TK_NOTHING, TK_LIKE_KW, TK_BY, TK_CASCADE, TK_ASC,
+ TK_DELETE, TK_CASE, TK_COLLATE, TK_CREATE, TK_CTIME_KW,
+ TK_DETACH, TK_IMMEDIATE, TK_JOIN, TK_INSERT, TK_LIKE_KW,
+ TK_MATCH, TK_PLAN, TK_ANALYZE, TK_PRAGMA, TK_ABORT,
+ TK_VALUES, TK_VIRTUAL, TK_LIMIT, TK_WHEN, TK_NOTNULL,
+ TK_NOT, TK_NO, TK_NULL, TK_WHERE, TK_RENAME,
+ TK_AFTER, TK_REPLACE, TK_AND, TK_DEFAULT, TK_AUTOINCR,
+ TK_TO, TK_IN, TK_CAST, TK_COLUMNKW, TK_COMMIT,
+ TK_CONFLICT, TK_JOIN_KW, TK_CTIME_KW, TK_CTIME_KW, TK_PRIMARY,
+ TK_DEFERRED, TK_DISTINCT, TK_IS, TK_DO, TK_ORDER,
+ TK_RESTRICT, TK_DROP, TK_FAIL, TK_FROM, TK_JOIN_KW,
+ TK_IF, TK_ISNULL, TK_JOIN_KW, TK_ROLLBACK, TK_ROW,
+ TK_UNION, TK_USING, TK_VACUUM, TK_VIEW, TK_INITIALLY,
+ TK_ALL,
};
/* Check to see if z[0..n-1] is a keyword. If it is, write the
** parser symbol code for that keyword into *pType. Always
@@ -141039,70 +145831,72 @@ static int keywordCode(const char *z, int n, int *pType){
testcase( i==57 ); /* INNER */
testcase( i==58 ); /* RECURSIVE */
testcase( i==59 ); /* BETWEEN */
- testcase( i==60 ); /* NOTNULL */
- testcase( i==61 ); /* NOT */
- testcase( i==62 ); /* NO */
- testcase( i==63 ); /* NULL */
- testcase( i==64 ); /* LIKE */
- testcase( i==65 ); /* CASCADE */
- testcase( i==66 ); /* ASC */
- testcase( i==67 ); /* DELETE */
- testcase( i==68 ); /* CASE */
- testcase( i==69 ); /* COLLATE */
- testcase( i==70 ); /* CREATE */
- testcase( i==71 ); /* CURRENT_DATE */
- testcase( i==72 ); /* DETACH */
- testcase( i==73 ); /* IMMEDIATE */
- testcase( i==74 ); /* JOIN */
- testcase( i==75 ); /* INSERT */
- testcase( i==76 ); /* MATCH */
- testcase( i==77 ); /* PLAN */
- testcase( i==78 ); /* ANALYZE */
- testcase( i==79 ); /* PRAGMA */
- testcase( i==80 ); /* ABORT */
- testcase( i==81 ); /* VALUES */
- testcase( i==82 ); /* VIRTUAL */
- testcase( i==83 ); /* LIMIT */
- testcase( i==84 ); /* WHEN */
- testcase( i==85 ); /* WHERE */
- testcase( i==86 ); /* RENAME */
- testcase( i==87 ); /* AFTER */
- testcase( i==88 ); /* REPLACE */
- testcase( i==89 ); /* AND */
- testcase( i==90 ); /* DEFAULT */
- testcase( i==91 ); /* AUTOINCREMENT */
- testcase( i==92 ); /* TO */
- testcase( i==93 ); /* IN */
- testcase( i==94 ); /* CAST */
- testcase( i==95 ); /* COLUMN */
- testcase( i==96 ); /* COMMIT */
- testcase( i==97 ); /* CONFLICT */
- testcase( i==98 ); /* CROSS */
- testcase( i==99 ); /* CURRENT_TIMESTAMP */
- testcase( i==100 ); /* CURRENT_TIME */
- testcase( i==101 ); /* PRIMARY */
- testcase( i==102 ); /* DEFERRED */
- testcase( i==103 ); /* DISTINCT */
- testcase( i==104 ); /* IS */
- testcase( i==105 ); /* DROP */
- testcase( i==106 ); /* FAIL */
- testcase( i==107 ); /* FROM */
- testcase( i==108 ); /* FULL */
- testcase( i==109 ); /* GLOB */
- testcase( i==110 ); /* BY */
- testcase( i==111 ); /* IF */
- testcase( i==112 ); /* ISNULL */
- testcase( i==113 ); /* ORDER */
- testcase( i==114 ); /* RESTRICT */
- testcase( i==115 ); /* RIGHT */
- testcase( i==116 ); /* ROLLBACK */
- testcase( i==117 ); /* ROW */
- testcase( i==118 ); /* UNION */
- testcase( i==119 ); /* USING */
- testcase( i==120 ); /* VACUUM */
- testcase( i==121 ); /* VIEW */
- testcase( i==122 ); /* INITIALLY */
- testcase( i==123 ); /* ALL */
+ testcase( i==60 ); /* NOTHING */
+ testcase( i==61 ); /* GLOB */
+ testcase( i==62 ); /* BY */
+ testcase( i==63 ); /* CASCADE */
+ testcase( i==64 ); /* ASC */
+ testcase( i==65 ); /* DELETE */
+ testcase( i==66 ); /* CASE */
+ testcase( i==67 ); /* COLLATE */
+ testcase( i==68 ); /* CREATE */
+ testcase( i==69 ); /* CURRENT_DATE */
+ testcase( i==70 ); /* DETACH */
+ testcase( i==71 ); /* IMMEDIATE */
+ testcase( i==72 ); /* JOIN */
+ testcase( i==73 ); /* INSERT */
+ testcase( i==74 ); /* LIKE */
+ testcase( i==75 ); /* MATCH */
+ testcase( i==76 ); /* PLAN */
+ testcase( i==77 ); /* ANALYZE */
+ testcase( i==78 ); /* PRAGMA */
+ testcase( i==79 ); /* ABORT */
+ testcase( i==80 ); /* VALUES */
+ testcase( i==81 ); /* VIRTUAL */
+ testcase( i==82 ); /* LIMIT */
+ testcase( i==83 ); /* WHEN */
+ testcase( i==84 ); /* NOTNULL */
+ testcase( i==85 ); /* NOT */
+ testcase( i==86 ); /* NO */
+ testcase( i==87 ); /* NULL */
+ testcase( i==88 ); /* WHERE */
+ testcase( i==89 ); /* RENAME */
+ testcase( i==90 ); /* AFTER */
+ testcase( i==91 ); /* REPLACE */
+ testcase( i==92 ); /* AND */
+ testcase( i==93 ); /* DEFAULT */
+ testcase( i==94 ); /* AUTOINCREMENT */
+ testcase( i==95 ); /* TO */
+ testcase( i==96 ); /* IN */
+ testcase( i==97 ); /* CAST */
+ testcase( i==98 ); /* COLUMN */
+ testcase( i==99 ); /* COMMIT */
+ testcase( i==100 ); /* CONFLICT */
+ testcase( i==101 ); /* CROSS */
+ testcase( i==102 ); /* CURRENT_TIMESTAMP */
+ testcase( i==103 ); /* CURRENT_TIME */
+ testcase( i==104 ); /* PRIMARY */
+ testcase( i==105 ); /* DEFERRED */
+ testcase( i==106 ); /* DISTINCT */
+ testcase( i==107 ); /* IS */
+ testcase( i==108 ); /* DO */
+ testcase( i==109 ); /* ORDER */
+ testcase( i==110 ); /* RESTRICT */
+ testcase( i==111 ); /* DROP */
+ testcase( i==112 ); /* FAIL */
+ testcase( i==113 ); /* FROM */
+ testcase( i==114 ); /* FULL */
+ testcase( i==115 ); /* IF */
+ testcase( i==116 ); /* ISNULL */
+ testcase( i==117 ); /* RIGHT */
+ testcase( i==118 ); /* ROLLBACK */
+ testcase( i==119 ); /* ROW */
+ testcase( i==120 ); /* UNION */
+ testcase( i==121 ); /* USING */
+ testcase( i==122 ); /* VACUUM */
+ testcase( i==123 ); /* VIEW */
+ testcase( i==124 ); /* INITIALLY */
+ testcase( i==125 ); /* ALL */
*pType = aKWCode[i];
break;
}
@@ -141114,7 +145908,17 @@ SQLITE_PRIVATE int sqlite3KeywordCode(const unsigned char *z, int n){
keywordCode((char*)z, n, &id);
return id;
}
-#define SQLITE_N_KEYWORD 124
+#define SQLITE_N_KEYWORD 126
+SQLITE_API int sqlite3_keyword_name(int i,const char **pzName,int *pnName){
+ if( i<0 || i>=SQLITE_N_KEYWORD ) return SQLITE_ERROR;
+ *pzName = zKWText + aKWOffset[i];
+ *pnName = aKWLen[i];
+ return SQLITE_OK;
+}
+SQLITE_API int sqlite3_keyword_count(void){ return SQLITE_N_KEYWORD; }
+SQLITE_API int sqlite3_keyword_check(const char *zName, int nName){
+ return TK_ID!=sqlite3KeywordCode((const u8*)zName, nName);
+}
/************** End of keywordhash.h *****************************************/
/************** Continuing where we left off in tokenize.c *******************/
@@ -141471,9 +146275,9 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr
/* sqlite3ParserTrace(stdout, "parser: "); */
#ifdef sqlite3Parser_ENGINEALWAYSONSTACK
pEngine = &sEngine;
- sqlite3ParserInit(pEngine);
+ sqlite3ParserInit(pEngine, pParse);
#else
- pEngine = sqlite3ParserAlloc(sqlite3Malloc);
+ pEngine = sqlite3ParserAlloc(sqlite3Malloc, pParse);
if( pEngine==0 ){
sqlite3OomFault(db);
return SQLITE_NOMEM_BKPT;
@@ -141501,7 +146305,7 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr
}else{
tokenType = TK_SEMI;
}
- zSql -= n;
+ n = 0;
}
if( tokenType>=TK_SPACE ){
assert( tokenType==TK_SPACE || tokenType==TK_ILLEGAL );
@@ -141517,7 +146321,7 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr
}else{
pParse->sLastToken.z = zSql;
pParse->sLastToken.n = n;
- sqlite3Parser(pEngine, tokenType, pParse->sLastToken, pParse);
+ sqlite3Parser(pEngine, tokenType, pParse->sLastToken);
lastTokenParsed = tokenType;
zSql += n;
if( pParse->rc!=SQLITE_OK || db->mallocFailed ) break;
@@ -141956,6 +146760,10 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db);
*/
/* #include "sqlite3.h" */
+#ifdef SQLITE_OMIT_VIRTUALTABLE
+# undef SQLITE_ENABLE_RTREE
+#endif
+
#if 0
extern "C" {
#endif /* __cplusplus */
@@ -141969,7 +146777,7 @@ SQLITE_PRIVATE int sqlite3RtreeInit(sqlite3 *db);
/************** End of rtree.h ***********************************************/
/************** Continuing where we left off in main.c ***********************/
#endif
-#ifdef SQLITE_ENABLE_ICU
+#if defined(SQLITE_ENABLE_ICU) || defined(SQLITE_ENABLE_ICU_COLLATIONS)
/************** Include sqliteicu.h in the middle of main.c ******************/
/************** Begin file sqliteicu.h ***************************************/
/*
@@ -142217,6 +147025,11 @@ SQLITE_API int sqlite3_initialize(void){
sqlite3GlobalConfig.isPCacheInit = 1;
rc = sqlite3OsInit();
}
+#ifdef SQLITE_ENABLE_DESERIALIZE
+ if( rc==SQLITE_OK ){
+ rc = sqlite3MemdbInit();
+ }
+#endif
if( rc==SQLITE_OK ){
sqlite3PCacheBufferSetup( sqlite3GlobalConfig.pPage,
sqlite3GlobalConfig.szPage, sqlite3GlobalConfig.nPage);
@@ -142249,7 +147062,7 @@ SQLITE_API int sqlite3_initialize(void){
#ifndef NDEBUG
#ifndef SQLITE_OMIT_FLOATING_POINT
/* This section of code's only "output" is via assert() statements. */
- if ( rc==SQLITE_OK ){
+ if( rc==SQLITE_OK ){
u64 x = (((u64)1)<<63)-1;
double y;
assert(sizeof(x)==8);
@@ -142615,6 +147428,17 @@ SQLITE_API int sqlite3_config(int op, ...){
break;
}
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ case SQLITE_CONFIG_SORTERREF_SIZE: {
+ int iVal = va_arg(ap, int);
+ if( iVal<0 ){
+ iVal = SQLITE_DEFAULT_SORTERREF_SIZE;
+ }
+ sqlite3GlobalConfig.szSorterRef = (u32)iVal;
+ break;
+ }
+#endif /* SQLITE_ENABLE_SORTER_REFERENCES */
+
default: {
rc = SQLITE_ERROR;
break;
@@ -142795,6 +147619,8 @@ SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){
{ SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, SQLITE_LoadExtension },
{ SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE, SQLITE_NoCkptOnClose },
{ SQLITE_DBCONFIG_ENABLE_QPSG, SQLITE_EnableQPSG },
+ { SQLITE_DBCONFIG_TRIGGER_EQP, SQLITE_TriggerEQP },
+ { SQLITE_DBCONFIG_RESET_DATABASE, SQLITE_ResetDatabase },
};
unsigned int i;
rc = SQLITE_ERROR; /* IMP: R-42790-23372 */
@@ -143292,9 +148118,10 @@ SQLITE_PRIVATE const char *sqlite3ErrName(int rc){
case SQLITE_NOMEM: zName = "SQLITE_NOMEM"; break;
case SQLITE_READONLY: zName = "SQLITE_READONLY"; break;
case SQLITE_READONLY_RECOVERY: zName = "SQLITE_READONLY_RECOVERY"; break;
- case SQLITE_READONLY_CANTLOCK: zName = "SQLITE_READONLY_CANTLOCK"; break;
+ case SQLITE_READONLY_CANTINIT: zName = "SQLITE_READONLY_CANTINIT"; break;
case SQLITE_READONLY_ROLLBACK: zName = "SQLITE_READONLY_ROLLBACK"; break;
case SQLITE_READONLY_DBMOVED: zName = "SQLITE_READONLY_DBMOVED"; break;
+ case SQLITE_READONLY_DIRECTORY: zName = "SQLITE_READONLY_DIRECTORY";break;
case SQLITE_INTERRUPT: zName = "SQLITE_INTERRUPT"; break;
case SQLITE_IOERR: zName = "SQLITE_IOERR"; break;
case SQLITE_IOERR_READ: zName = "SQLITE_IOERR_READ"; break;
@@ -143414,6 +148241,8 @@ SQLITE_PRIVATE const char *sqlite3ErrStr(int rc){
/* SQLITE_FORMAT */ 0,
/* SQLITE_RANGE */ "column index out of range",
/* SQLITE_NOTADB */ "file is not a database",
+ /* SQLITE_NOTICE */ "notification message",
+ /* SQLITE_WARNING */ "warning message",
};
const char *zErr = "unknown error";
switch( rc ){
@@ -143421,6 +148250,14 @@ SQLITE_PRIVATE const char *sqlite3ErrStr(int rc){
zErr = "abort due to ROLLBACK";
break;
}
+ case SQLITE_ROW: {
+ zErr = "another row available";
+ break;
+ }
+ case SQLITE_DONE: {
+ zErr = "no more rows available";
+ break;
+ }
default: {
rc &= 0xff;
if( ALWAYS(rc>=0) && rc<ArraySize(aMsg) && aMsg[rc]!=0 ){
@@ -143437,21 +148274,40 @@ SQLITE_PRIVATE const char *sqlite3ErrStr(int rc){
** again until a timeout value is reached. The timeout value is
** an integer number of milliseconds passed in as the first
** argument.
+**
+** Return non-zero to retry the lock. Return zero to stop trying
+** and cause SQLite to return SQLITE_BUSY.
*/
static int sqliteDefaultBusyCallback(
- void *ptr, /* Database connection */
- int count /* Number of times table has been busy */
+ void *ptr, /* Database connection */
+ int count, /* Number of times table has been busy */
+ sqlite3_file *pFile /* The file on which the lock occurred */
){
#if SQLITE_OS_WIN || HAVE_USLEEP
+ /* This case is for systems that have support for sleeping for fractions of
+ ** a second. Examples: All windows systems, unix systems with usleep() */
static const u8 delays[] =
{ 1, 2, 5, 10, 15, 20, 25, 25, 25, 50, 50, 100 };
static const u8 totals[] =
{ 0, 1, 3, 8, 18, 33, 53, 78, 103, 128, 178, 228 };
# define NDELAY ArraySize(delays)
sqlite3 *db = (sqlite3 *)ptr;
- int timeout = db->busyTimeout;
+ int tmout = db->busyTimeout;
int delay, prior;
+#ifdef SQLITE_ENABLE_SETLK_TIMEOUT
+ if( sqlite3OsFileControl(pFile,SQLITE_FCNTL_LOCK_TIMEOUT,&tmout)==SQLITE_OK ){
+ if( count ){
+ tmout = 0;
+ sqlite3OsFileControl(pFile, SQLITE_FCNTL_LOCK_TIMEOUT, &tmout);
+ return 0;
+ }else{
+ return 1;
+ }
+ }
+#else
+ UNUSED_PARAMETER(pFile);
+#endif
assert( count>=0 );
if( count < NDELAY ){
delay = delays[count];
@@ -143460,16 +148316,19 @@ static int sqliteDefaultBusyCallback(
delay = delays[NDELAY-1];
prior = totals[NDELAY-1] + delay*(count-(NDELAY-1));
}
- if( prior + delay > timeout ){
- delay = timeout - prior;
+ if( prior + delay > tmout ){
+ delay = tmout - prior;
if( delay<=0 ) return 0;
}
sqlite3OsSleep(db->pVfs, delay*1000);
return 1;
#else
+ /* This case for unix systems that lack usleep() support. Sleeping
+ ** must be done in increments of whole seconds */
sqlite3 *db = (sqlite3 *)ptr;
- int timeout = ((sqlite3 *)ptr)->busyTimeout;
- if( (count+1)*1000 > timeout ){
+ int tmout = ((sqlite3 *)ptr)->busyTimeout;
+ UNUSED_PARAMETER(pFile);
+ if( (count+1)*1000 > tmout ){
return 0;
}
sqlite3OsSleep(db->pVfs, 1000000);
@@ -143480,14 +148339,25 @@ static int sqliteDefaultBusyCallback(
/*
** Invoke the given busy handler.
**
-** This routine is called when an operation failed with a lock.
+** This routine is called when an operation failed to acquire a
+** lock on VFS file pFile.
+**
** If this routine returns non-zero, the lock is retried. If it
** returns 0, the operation aborts with an SQLITE_BUSY error.
*/
-SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler *p){
+SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler *p, sqlite3_file *pFile){
int rc;
- if( NEVER(p==0) || p->xFunc==0 || p->nBusy<0 ) return 0;
- rc = p->xFunc(p->pArg, p->nBusy);
+ if( p->xBusyHandler==0 || p->nBusy<0 ) return 0;
+ if( p->bExtraFileArg ){
+ /* Add an extra parameter with the pFile pointer to the end of the
+ ** callback argument list */
+ int (*xTra)(void*,int,sqlite3_file*);
+ xTra = (int(*)(void*,int,sqlite3_file*))p->xBusyHandler;
+ rc = xTra(p->pBusyArg, p->nBusy, pFile);
+ }else{
+ /* Legacy style busy handler callback */
+ rc = p->xBusyHandler(p->pBusyArg, p->nBusy);
+ }
if( rc==0 ){
p->nBusy = -1;
}else{
@@ -143509,9 +148379,10 @@ SQLITE_API int sqlite3_busy_handler(
if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT;
#endif
sqlite3_mutex_enter(db->mutex);
- db->busyHandler.xFunc = xBusy;
- db->busyHandler.pArg = pArg;
+ db->busyHandler.xBusyHandler = xBusy;
+ db->busyHandler.pBusyArg = pArg;
db->busyHandler.nBusy = 0;
+ db->busyHandler.bExtraFileArg = 0;
db->busyTimeout = 0;
sqlite3_mutex_leave(db->mutex);
return SQLITE_OK;
@@ -143559,8 +148430,10 @@ SQLITE_API int sqlite3_busy_timeout(sqlite3 *db, int ms){
if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT;
#endif
if( ms>0 ){
- sqlite3_busy_handler(db, sqliteDefaultBusyCallback, (void*)db);
+ sqlite3_busy_handler(db, (int(*)(void*,int))sqliteDefaultBusyCallback,
+ (void*)db);
db->busyTimeout = ms;
+ db->busyHandler.bExtraFileArg = 1;
}else{
sqlite3_busy_handler(db, 0, 0);
}
@@ -143721,11 +148594,13 @@ SQLITE_API int sqlite3_create_function_v2(
#endif
sqlite3_mutex_enter(db->mutex);
if( xDestroy ){
- pArg = (FuncDestructor *)sqlite3DbMallocZero(db, sizeof(FuncDestructor));
+ pArg = (FuncDestructor *)sqlite3Malloc(sizeof(FuncDestructor));
if( !pArg ){
+ sqlite3OomFault(db);
xDestroy(p);
goto out;
}
+ pArg->nRef = 0;
pArg->xDestroy = xDestroy;
pArg->pUserData = p;
}
@@ -143733,7 +148608,7 @@ SQLITE_API int sqlite3_create_function_v2(
if( pArg && pArg->nRef==0 ){
assert( rc!=SQLITE_OK );
xDestroy(p);
- sqlite3DbFree(db, pArg);
+ sqlite3_free(pArg);
}
out:
@@ -143772,6 +148647,28 @@ SQLITE_API int sqlite3_create_function16(
/*
+** The following is the implementation of an SQL function that always
+** fails with an error message stating that the function is used in the
+** wrong context. The sqlite3_overload_function() API might construct
+** SQL function that use this routine so that the functions will exist
+** for name resolution but are actually overloaded by the xFindFunction
+** method of virtual tables.
+*/
+static void sqlite3InvalidFunction(
+ sqlite3_context *context, /* The function calling context */
+ int NotUsed, /* Number of arguments to the function */
+ sqlite3_value **NotUsed2 /* Value of each argument */
+){
+ const char *zName = (const char*)sqlite3_user_data(context);
+ char *zErr;
+ UNUSED_PARAMETER2(NotUsed, NotUsed2);
+ zErr = sqlite3_mprintf(
+ "unable to use function %s in the requested context", zName);
+ sqlite3_result_error(context, zErr, -1);
+ sqlite3_free(zErr);
+}
+
+/*
** Declare that a function has been overloaded by a virtual table.
**
** If the function already exists as a regular global function, then
@@ -143788,7 +148685,8 @@ SQLITE_API int sqlite3_overload_function(
const char *zName,
int nArg
){
- int rc = SQLITE_OK;
+ int rc;
+ char *zCopy;
#ifdef SQLITE_ENABLE_API_ARMOR
if( !sqlite3SafetyCheckOk(db) || zName==0 || nArg<-2 ){
@@ -143796,13 +148694,13 @@ SQLITE_API int sqlite3_overload_function(
}
#endif
sqlite3_mutex_enter(db->mutex);
- if( sqlite3FindFunction(db, zName, nArg, SQLITE_UTF8, 0)==0 ){
- rc = sqlite3CreateFunc(db, zName, nArg, SQLITE_UTF8,
- 0, sqlite3InvalidFunction, 0, 0, 0);
- }
- rc = sqlite3ApiExit(db, rc);
+ rc = sqlite3FindFunction(db, zName, nArg, SQLITE_UTF8, 0)!=0;
sqlite3_mutex_leave(db->mutex);
- return rc;
+ if( rc ) return SQLITE_OK;
+ zCopy = sqlite3_mprintf(zName);
+ if( zCopy==0 ) return SQLITE_NOMEM;
+ return sqlite3_create_function_v2(db, zName, nArg, SQLITE_UTF8,
+ zCopy, sqlite3InvalidFunction, 0, 0, sqlite3_free);
}
#ifndef SQLITE_OMIT_TRACE
@@ -144800,6 +149698,7 @@ static int openDatabase(
}else{
isThreadsafe = sqlite3GlobalConfig.bFullMutex;
}
+
if( flags & SQLITE_OPEN_PRIVATECACHE ){
flags &= ~SQLITE_OPEN_SHAREDCACHE;
}else if( sqlite3GlobalConfig.sharedCacheEnabled ){
@@ -144832,13 +149731,20 @@ static int openDatabase(
/* Allocate the sqlite data structure */
db = sqlite3MallocZero( sizeof(sqlite3) );
if( db==0 ) goto opendb_out;
- if( isThreadsafe ){
+ if( isThreadsafe
+#ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS
+ || sqlite3GlobalConfig.bCoreMutex
+#endif
+ ){
db->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE);
if( db->mutex==0 ){
sqlite3_free(db);
db = 0;
goto opendb_out;
}
+ if( isThreadsafe==0 ){
+ sqlite3MutexWarnOnContention(db->mutex);
+ }
}
sqlite3_mutex_enter(db->mutex);
db->errMask = 0xff;
@@ -145020,7 +149926,7 @@ static int openDatabase(
}
#endif
-#ifdef SQLITE_ENABLE_ICU
+#if defined(SQLITE_ENABLE_ICU) || defined(SQLITE_ENABLE_ICU_COLLATIONS)
if( !db->mallocFailed && rc==SQLITE_OK ){
rc = sqlite3IcuInit(db);
}
@@ -145322,37 +150228,37 @@ SQLITE_API int sqlite3_get_autocommit(sqlite3 *db){
** 2. Invoke sqlite3_log() to provide the source code location where
** a low-level error is first detected.
*/
-static int reportError(int iErr, int lineno, const char *zType){
+SQLITE_PRIVATE int sqlite3ReportError(int iErr, int lineno, const char *zType){
sqlite3_log(iErr, "%s at line %d of [%.10s]",
zType, lineno, 20+sqlite3_sourceid());
return iErr;
}
SQLITE_PRIVATE int sqlite3CorruptError(int lineno){
testcase( sqlite3GlobalConfig.xLog!=0 );
- return reportError(SQLITE_CORRUPT, lineno, "database corruption");
+ return sqlite3ReportError(SQLITE_CORRUPT, lineno, "database corruption");
}
SQLITE_PRIVATE int sqlite3MisuseError(int lineno){
testcase( sqlite3GlobalConfig.xLog!=0 );
- return reportError(SQLITE_MISUSE, lineno, "misuse");
+ return sqlite3ReportError(SQLITE_MISUSE, lineno, "misuse");
}
SQLITE_PRIVATE int sqlite3CantopenError(int lineno){
testcase( sqlite3GlobalConfig.xLog!=0 );
- return reportError(SQLITE_CANTOPEN, lineno, "cannot open file");
+ return sqlite3ReportError(SQLITE_CANTOPEN, lineno, "cannot open file");
}
#ifdef SQLITE_DEBUG
SQLITE_PRIVATE int sqlite3CorruptPgnoError(int lineno, Pgno pgno){
char zMsg[100];
sqlite3_snprintf(sizeof(zMsg), zMsg, "database corruption page %d", pgno);
testcase( sqlite3GlobalConfig.xLog!=0 );
- return reportError(SQLITE_CORRUPT, lineno, zMsg);
+ return sqlite3ReportError(SQLITE_CORRUPT, lineno, zMsg);
}
SQLITE_PRIVATE int sqlite3NomemError(int lineno){
testcase( sqlite3GlobalConfig.xLog!=0 );
- return reportError(SQLITE_NOMEM, lineno, "OOM");
+ return sqlite3ReportError(SQLITE_NOMEM, lineno, "OOM");
}
SQLITE_PRIVATE int sqlite3IoerrnomemError(int lineno){
testcase( sqlite3GlobalConfig.xLog!=0 );
- return reportError(SQLITE_IOERR_NOMEM, lineno, "I/O OOM error");
+ return sqlite3ReportError(SQLITE_IOERR_NOMEM, lineno, "I/O OOM error");
}
#endif
@@ -145545,10 +150451,8 @@ SQLITE_API int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, vo
}else if( op==SQLITE_FCNTL_JOURNAL_POINTER ){
*(sqlite3_file**)pArg = sqlite3PagerJrnlFile(pPager);
rc = SQLITE_OK;
- }else if( fd->pMethods ){
- rc = sqlite3OsFileControl(fd, op, pArg);
}else{
- rc = SQLITE_NOTFOUND;
+ rc = sqlite3OsFileControl(fd, op, pArg);
}
sqlite3BtreeLeave(pBtree);
}
@@ -145769,24 +150673,6 @@ SQLITE_API int sqlite3_test_control(int op, ...){
break;
}
-#ifdef SQLITE_N_KEYWORD
- /* sqlite3_test_control(SQLITE_TESTCTRL_ISKEYWORD, const char *zWord)
- **
- ** If zWord is a keyword recognized by the parser, then return the
- ** number of keywords. Or if zWord is not a keyword, return 0.
- **
- ** This test feature is only available in the amalgamation since
- ** the SQLITE_N_KEYWORD macro is not defined in this file if SQLite
- ** is built using separate source files.
- */
- case SQLITE_TESTCTRL_ISKEYWORD: {
- const char *zWord = va_arg(ap, const char*);
- int n = sqlite3Strlen30(zWord);
- rc = (sqlite3KeywordCode((u8*)zWord, n)!=TK_ID) ? SQLITE_N_KEYWORD : 0;
- break;
- }
-#endif
-
/* sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, int onoff);
**
** If parameter onoff is non-zero, configure the wrappers so that all
@@ -145880,6 +150766,22 @@ SQLITE_API int sqlite3_test_control(int op, ...){
sqlite3_mutex_leave(db->mutex);
break;
}
+
+#if defined(YYCOVERAGE)
+ /* sqlite3_test_control(SQLITE_TESTCTRL_PARSER_COVERAGE, FILE *out)
+ **
+ ** This test control (only available when SQLite is compiled with
+ ** -DYYCOVERAGE) writes a report onto "out" that shows all
+ ** state/lookahead combinations in the parser state machine
+ ** which are never exercised. If any state is missed, make the
+ ** return code SQLITE_ERROR.
+ */
+ case SQLITE_TESTCTRL_PARSER_COVERAGE: {
+ FILE *out = va_arg(ap, FILE*);
+ if( sqlite3ParserCoverage(out) ) rc = SQLITE_ERROR;
+ break;
+ }
+#endif /* defined(YYCOVERAGE) */
}
va_end(ap);
#endif /* SQLITE_UNTESTABLE */
@@ -147637,7 +152539,7 @@ SQLITE_PRIVATE int sqlite3Fts3ExprParse(sqlite3_tokenizer *, int,
);
SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *);
#ifdef SQLITE_TEST
-SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db);
+SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db, Fts3Hash*);
SQLITE_PRIVATE int sqlite3Fts3InitTerm(sqlite3 *db);
#endif
@@ -151347,7 +156249,7 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){
#ifdef SQLITE_TEST
if( rc==SQLITE_OK ){
- rc = sqlite3Fts3ExprInitTestInterface(db);
+ rc = sqlite3Fts3ExprInitTestInterface(db, pHash);
}
#endif
@@ -155008,34 +159910,6 @@ SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *pDel){
/* #include <stdio.h> */
/*
-** Function to query the hash-table of tokenizers (see README.tokenizers).
-*/
-static int queryTestTokenizer(
- sqlite3 *db,
- const char *zName,
- const sqlite3_tokenizer_module **pp
-){
- int rc;
- sqlite3_stmt *pStmt;
- const char zSql[] = "SELECT fts3_tokenizer(?)";
-
- *pp = 0;
- rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
- if( rc!=SQLITE_OK ){
- return rc;
- }
-
- sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC);
- if( SQLITE_ROW==sqlite3_step(pStmt) ){
- if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB ){
- memcpy((void *)pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp));
- }
- }
-
- return sqlite3_finalize(pStmt);
-}
-
-/*
** Return a pointer to a buffer containing a text representation of the
** expression passed as the first argument. The buffer is obtained from
** sqlite3_malloc(). It is the responsibility of the caller to use
@@ -155102,12 +159976,12 @@ static char *exprToString(Fts3Expr *pExpr, char *zBuf){
**
** SELECT fts3_exprtest('simple', 'Bill col2:Bloggs', 'col1', 'col2');
*/
-static void fts3ExprTest(
+static void fts3ExprTestCommon(
+ int bRebalance,
sqlite3_context *context,
int argc,
sqlite3_value **argv
){
- sqlite3_tokenizer_module const *pModule = 0;
sqlite3_tokenizer *pTokenizer = 0;
int rc;
char **azCol = 0;
@@ -155117,7 +159991,9 @@ static void fts3ExprTest(
int ii;
Fts3Expr *pExpr;
char *zBuf = 0;
- sqlite3 *db = sqlite3_context_db_handle(context);
+ Fts3Hash *pHash = (Fts3Hash*)sqlite3_user_data(context);
+ const char *zTokenizer = 0;
+ char *zErr = 0;
if( argc<3 ){
sqlite3_result_error(context,
@@ -155126,23 +160002,17 @@ static void fts3ExprTest(
return;
}
- rc = queryTestTokenizer(db,
- (const char *)sqlite3_value_text(argv[0]), &pModule);
- if( rc==SQLITE_NOMEM ){
- sqlite3_result_error_nomem(context);
- goto exprtest_out;
- }else if( !pModule ){
- sqlite3_result_error(context, "No such tokenizer module", -1);
- goto exprtest_out;
- }
-
- rc = pModule->xCreate(0, 0, &pTokenizer);
- assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
- if( rc==SQLITE_NOMEM ){
- sqlite3_result_error_nomem(context);
- goto exprtest_out;
+ zTokenizer = (const char*)sqlite3_value_text(argv[0]);
+ rc = sqlite3Fts3InitTokenizer(pHash, zTokenizer, &pTokenizer, &zErr);
+ if( rc!=SQLITE_OK ){
+ if( rc==SQLITE_NOMEM ){
+ sqlite3_result_error_nomem(context);
+ }else{
+ sqlite3_result_error(context, zErr, -1);
+ }
+ sqlite3_free(zErr);
+ return;
}
- pTokenizer->pModule = pModule;
zExpr = (const char *)sqlite3_value_text(argv[1]);
nExpr = sqlite3_value_bytes(argv[1]);
@@ -155156,7 +160026,7 @@ static void fts3ExprTest(
azCol[ii] = (char *)sqlite3_value_text(argv[ii+2]);
}
- if( sqlite3_user_data(context) ){
+ if( bRebalance ){
char *zDummy = 0;
rc = sqlite3Fts3ExprParse(
pTokenizer, 0, azCol, 0, nCol, nCol, zExpr, nExpr, &pExpr, &zDummy
@@ -155182,23 +160052,38 @@ static void fts3ExprTest(
sqlite3Fts3ExprFree(pExpr);
exprtest_out:
- if( pModule && pTokenizer ){
- rc = pModule->xDestroy(pTokenizer);
+ if( pTokenizer ){
+ rc = pTokenizer->pModule->xDestroy(pTokenizer);
}
sqlite3_free(azCol);
}
+static void fts3ExprTest(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+ fts3ExprTestCommon(0, context, argc, argv);
+}
+static void fts3ExprTestRebalance(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+ fts3ExprTestCommon(1, context, argc, argv);
+}
+
/*
** Register the query expression parser test function fts3_exprtest()
** with database connection db.
*/
-SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3* db){
+SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db, Fts3Hash *pHash){
int rc = sqlite3_create_function(
- db, "fts3_exprtest", -1, SQLITE_UTF8, 0, fts3ExprTest, 0, 0
+ db, "fts3_exprtest", -1, SQLITE_UTF8, (void*)pHash, fts3ExprTest, 0, 0
);
if( rc==SQLITE_OK ){
rc = sqlite3_create_function(db, "fts3_exprtest_rebalance",
- -1, SQLITE_UTF8, (void *)1, fts3ExprTest, 0, 0
+ -1, SQLITE_UTF8, (void*)pHash, fts3ExprTestRebalance, 0, 0
);
}
return rc;
@@ -159383,6 +164268,7 @@ static int fts3WriteSegment(
sqlite3_bind_blob(pStmt, 2, z, n, SQLITE_STATIC);
sqlite3_step(pStmt);
rc = sqlite3_reset(pStmt);
+ sqlite3_bind_null(pStmt, 2);
}
return rc;
}
@@ -159439,6 +164325,7 @@ static int fts3WriteSegdir(
sqlite3_bind_blob(pStmt, 6, zRoot, nRoot, SQLITE_STATIC);
sqlite3_step(pStmt);
rc = sqlite3_reset(pStmt);
+ sqlite3_bind_null(pStmt, 6);
}
return rc;
}
@@ -160918,6 +165805,7 @@ static void fts3UpdateDocTotals(
sqlite3_bind_blob(pStmt, 2, pBlob, nBlob, SQLITE_STATIC);
sqlite3_step(pStmt);
*pRC = sqlite3_reset(pStmt);
+ sqlite3_bind_null(pStmt, 2);
sqlite3_free(a);
}
@@ -162106,6 +166994,7 @@ static int fts3TruncateSegment(
sqlite3_bind_int(pChomp, 4, iIdx);
sqlite3_step(pChomp);
rc = sqlite3_reset(pChomp);
+ sqlite3_bind_null(pChomp, 2);
}
}
@@ -162185,6 +167074,7 @@ static int fts3IncrmergeHintStore(Fts3Table *p, Blob *pHint){
sqlite3_bind_blob(pReplace, 2, pHint->a, pHint->n, SQLITE_STATIC);
sqlite3_step(pReplace);
rc = sqlite3_reset(pReplace);
+ sqlite3_bind_null(pReplace, 2);
}
return rc;
@@ -162999,7 +167889,6 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod(
){
Fts3Table *p = (Fts3Table *)pVtab;
int rc = SQLITE_OK; /* Return Code */
- int isRemove = 0; /* True for an UPDATE or DELETE */
u32 *aSzIns = 0; /* Sizes of inserted documents */
u32 *aSzDel = 0; /* Sizes of deleted documents */
int nChng = 0; /* Net change in number of documents */
@@ -163097,7 +167986,6 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod(
if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){
assert( sqlite3_value_type(apVal[0])==SQLITE_INTEGER );
rc = fts3DeleteByRowid(p, apVal[0], &nChng, aSzDel);
- isRemove = 1;
}
/* If this is an INSERT or UPDATE operation, insert the new record. */
@@ -163109,7 +167997,7 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod(
rc = FTS_CORRUPT_VTAB;
}
}
- if( rc==SQLITE_OK && (!isRemove || *pRowid!=p->iPrevDocid ) ){
+ if( rc==SQLITE_OK ){
rc = fts3PendingTermsDocid(p, 0, iLangid, *pRowid);
}
if( rc==SQLITE_OK ){
@@ -165656,14 +170544,15 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int bRemoveDiacritic){
**
** CREATE TABLE %_node(nodeno INTEGER PRIMARY KEY, data BLOB)
** CREATE TABLE %_parent(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)
-** CREATE TABLE %_rowid(rowid INTEGER PRIMARY KEY, nodeno INTEGER)
+** CREATE TABLE %_rowid(rowid INTEGER PRIMARY KEY, nodeno INTEGER, ...)
**
** The data for each node of the r-tree structure is stored in the %_node
** table. For each node that is not the root node of the r-tree, there is
** an entry in the %_parent table associating the node with its parent.
** And for each row of data in the table, there is an entry in the %_rowid
** table that maps from the entries rowid to the id of the node that it
-** is stored on.
+** is stored on. If the r-tree contains auxiliary columns, those are stored
+** on the end of the %_rowid table.
**
** The root node of an r-tree always exists, even if the r-tree table is
** empty. The nodeno of the root node is always 1. All other nodes in the
@@ -165684,7 +170573,8 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int bRemoveDiacritic){
** child page.
*/
-#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_RTREE)
+#if !defined(SQLITE_CORE) \
+ || (defined(SQLITE_ENABLE_RTREE) && !defined(SQLITE_OMIT_VIRTUALTABLE))
#ifndef SQLITE_CORE
/* #include "sqlite3ext.h" */
@@ -165725,6 +170615,9 @@ typedef struct RtreeSearchPoint RtreeSearchPoint;
/* The rtree may have between 1 and RTREE_MAX_DIMENSIONS dimensions. */
#define RTREE_MAX_DIMENSIONS 5
+/* Maximum number of auxiliary columns */
+#define RTREE_MAX_AUX_COLUMN 100
+
/* Size of hash table Rtree.aHash. This hash table is not expected to
** ever contain very many entries, so a fixed number of buckets is
** used.
@@ -165753,12 +170646,15 @@ struct Rtree {
u8 eCoordType; /* RTREE_COORD_REAL32 or RTREE_COORD_INT32 */
u8 nBytesPerCell; /* Bytes consumed per cell */
u8 inWrTrans; /* True if inside write transaction */
+ u8 nAux; /* # of auxiliary columns in %_rowid */
int iDepth; /* Current depth of the r-tree structure */
char *zDb; /* Name of database containing r-tree table */
char *zName; /* Name of r-tree table */
u32 nBusy; /* Current number of users of this structure */
i64 nRowEst; /* Estimated number of rows in this table */
u32 nCursor; /* Number of open cursors */
+ u32 nNodeRef; /* Number RtreeNodes with positive nRef */
+ char *zReadAuxSql; /* SQL for statement to read aux data */
/* List of nodes removed during a CondenseTree operation. List is
** linked together via the pointer normally used for hash chains -
@@ -165785,6 +170681,9 @@ struct Rtree {
sqlite3_stmt *pWriteParent;
sqlite3_stmt *pDeleteParent;
+ /* Statement for writing to the "aux:" fields, if there are any */
+ sqlite3_stmt *pWriteAux;
+
RtreeNode *aHash[HASHSIZE]; /* Hash table of in-memory nodes. */
};
@@ -165841,7 +170740,7 @@ struct RtreeSearchPoint {
** The smallest possible node-size is (512-64)==448 bytes. And the largest
** supported cell size is 48 bytes (8 byte rowid + ten 4 byte coordinates).
** Therefore all non-root nodes must contain at least 3 entries. Since
-** 2^40 is greater than 2^64, an r-tree structure always has a depth of
+** 3^40 is greater than 2^64, an r-tree structure always has a depth of
** 40 or less.
*/
#define RTREE_MAX_DEPTH 40
@@ -165861,6 +170760,7 @@ struct RtreeCursor {
sqlite3_vtab_cursor base; /* Base class. Must be first */
u8 atEOF; /* True if at end of search */
u8 bPoint; /* True if sPoint is valid */
+ u8 bAuxValid; /* True if pReadAux is valid */
int iStrategy; /* Copy of idxNum search parameter */
int nConstraint; /* Number of entries in aConstraint */
RtreeConstraint *aConstraint; /* Search constraints. */
@@ -165868,6 +170768,7 @@ struct RtreeCursor {
int nPoint; /* Number of slots used in aPoint[] */
int mxLevel; /* iLevel value for root of the tree */
RtreeSearchPoint *aPoint; /* Priority queue for search points */
+ sqlite3_stmt *pReadAux; /* Statement to read aux-data */
RtreeSearchPoint sPoint; /* Cached next search point */
RtreeNode *aNode[RTREE_CACHE_SZ]; /* Rtree node cache */
u32 anQueue[RTREE_MAX_DEPTH+1]; /* Number of queued entries by iLevel */
@@ -166154,6 +171055,7 @@ static int writeInt64(u8 *p, i64 i){
*/
static void nodeReference(RtreeNode *p){
if( p ){
+ assert( p->nRef>0 );
p->nRef++;
}
}
@@ -166221,6 +171123,7 @@ static RtreeNode *nodeNew(Rtree *pRtree, RtreeNode *pParent){
memset(pNode, 0, sizeof(RtreeNode) + pRtree->iNodeSize);
pNode->zData = (u8 *)&pNode[1];
pNode->nRef = 1;
+ pRtree->nNodeRef++;
pNode->pParent = pParent;
pNode->isDirty = 1;
nodeReference(pParent);
@@ -166254,10 +171157,10 @@ static int nodeAcquire(
/* Check if the requested node is already in the hash table. If so,
** increase its reference count and return it.
*/
- if( (pNode = nodeHashLookup(pRtree, iNode)) ){
+ if( (pNode = nodeHashLookup(pRtree, iNode))!=0 ){
assert( !pParent || !pNode->pParent || pNode->pParent==pParent );
if( pParent && !pNode->pParent ){
- nodeReference(pParent);
+ pParent->nRef++;
pNode->pParent = pParent;
}
pNode->nRef++;
@@ -166296,6 +171199,7 @@ static int nodeAcquire(
pNode->pParent = pParent;
pNode->zData = (u8 *)&pNode[1];
pNode->nRef = 1;
+ pRtree->nNodeRef++;
pNode->iNode = iNode;
pNode->isDirty = 0;
pNode->pNext = 0;
@@ -166336,7 +171240,10 @@ static int nodeAcquire(
}
*ppNode = pNode;
}else{
- sqlite3_free(pNode);
+ if( pNode ){
+ pRtree->nNodeRef--;
+ sqlite3_free(pNode);
+ }
*ppNode = 0;
}
@@ -166416,6 +171323,7 @@ static int nodeWrite(Rtree *pRtree, RtreeNode *pNode){
sqlite3_step(p);
pNode->isDirty = 0;
rc = sqlite3_reset(p);
+ sqlite3_bind_null(p, 2);
if( pNode->iNode==0 && rc==SQLITE_OK ){
pNode->iNode = sqlite3_last_insert_rowid(pRtree->db);
nodeHashInsert(pRtree, pNode);
@@ -166432,8 +171340,10 @@ static int nodeRelease(Rtree *pRtree, RtreeNode *pNode){
int rc = SQLITE_OK;
if( pNode ){
assert( pNode->nRef>0 );
+ assert( pRtree->nNodeRef>0 );
pNode->nRef--;
if( pNode->nRef==0 ){
+ pRtree->nNodeRef--;
if( pNode->iNode==1 ){
pRtree->iDepth = -1;
}
@@ -166550,8 +171460,9 @@ static void rtreeRelease(Rtree *pRtree){
pRtree->nBusy--;
if( pRtree->nBusy==0 ){
pRtree->inWrTrans = 0;
- pRtree->nCursor = 0;
+ assert( pRtree->nCursor==0 );
nodeBlobReset(pRtree);
+ assert( pRtree->nNodeRef==0 );
sqlite3_finalize(pRtree->pWriteNode);
sqlite3_finalize(pRtree->pDeleteNode);
sqlite3_finalize(pRtree->pReadRowid);
@@ -166560,6 +171471,8 @@ static void rtreeRelease(Rtree *pRtree){
sqlite3_finalize(pRtree->pReadParent);
sqlite3_finalize(pRtree->pWriteParent);
sqlite3_finalize(pRtree->pDeleteParent);
+ sqlite3_finalize(pRtree->pWriteAux);
+ sqlite3_free(pRtree->zReadAuxSql);
sqlite3_free(pRtree);
}
}
@@ -166648,6 +171561,7 @@ static int rtreeClose(sqlite3_vtab_cursor *cur){
RtreeCursor *pCsr = (RtreeCursor *)cur;
assert( pRtree->nCursor>0 );
freeCursorConstraints(pCsr);
+ sqlite3_finalize(pCsr->pReadAux);
sqlite3_free(pCsr->aPoint);
for(ii=0; ii<RTREE_CACHE_SZ; ii++) nodeRelease(pRtree, pCsr->aNode[ii]);
sqlite3_free(pCsr);
@@ -167019,7 +171933,7 @@ static RtreeSearchPoint *rtreeSearchPointNew(
if( ii<RTREE_CACHE_SZ ){
assert( pCur->aNode[ii]==0 );
pCur->aNode[ii] = pCur->aNode[0];
- }else{
+ }else{
nodeRelease(RTREE_OF_CURSOR(pCur), pCur->aNode[0]);
}
pCur->aNode[0] = 0;
@@ -167190,6 +172104,10 @@ static int rtreeNext(sqlite3_vtab_cursor *pVtabCursor){
/* Move to the next entry that matches the configured constraints. */
RTREE_QUEUE_TRACE(pCsr, "POP-Nx:");
+ if( pCsr->bAuxValid ){
+ pCsr->bAuxValid = 0;
+ sqlite3_reset(pCsr->pReadAux);
+ }
rtreeSearchPointPop(pCsr);
rc = rtreeStepToLeaf(pCsr);
return rc;
@@ -167224,7 +172142,7 @@ static int rtreeColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
if( p==0 ) return SQLITE_OK;
if( i==0 ){
sqlite3_result_int64(ctx, nodeGetRowid(pRtree, pNode, p->iCell));
- }else{
+ }else if( i<=pRtree->nDim2 ){
nodeGetCoord(pRtree, pNode, p->iCell, i-1, &c);
#ifndef SQLITE_RTREE_INT_ONLY
if( pRtree->eCoordType==RTREE_COORD_REAL32 ){
@@ -167235,7 +172153,27 @@ static int rtreeColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
assert( pRtree->eCoordType==RTREE_COORD_INT32 );
sqlite3_result_int(ctx, c.i);
}
- }
+ }else{
+ if( !pCsr->bAuxValid ){
+ if( pCsr->pReadAux==0 ){
+ rc = sqlite3_prepare_v3(pRtree->db, pRtree->zReadAuxSql, -1, 0,
+ &pCsr->pReadAux, 0);
+ if( rc ) return rc;
+ }
+ sqlite3_bind_int64(pCsr->pReadAux, 1,
+ nodeGetRowid(pRtree, pNode, p->iCell));
+ rc = sqlite3_step(pCsr->pReadAux);
+ if( rc==SQLITE_ROW ){
+ pCsr->bAuxValid = 1;
+ }else{
+ sqlite3_reset(pCsr->pReadAux);
+ if( rc==SQLITE_DONE ) rc = SQLITE_OK;
+ return rc;
+ }
+ }
+ sqlite3_result_value(ctx,
+ sqlite3_column_value(pCsr->pReadAux, i - pRtree->nDim2 + 1));
+ }
return SQLITE_OK;
}
@@ -167313,14 +172251,17 @@ static int rtreeFilter(
int ii;
int rc = SQLITE_OK;
int iCell = 0;
+ sqlite3_stmt *pStmt;
rtreeReference(pRtree);
/* Reset the cursor to the same state as rtreeOpen() leaves it in. */
freeCursorConstraints(pCsr);
sqlite3_free(pCsr->aPoint);
+ pStmt = pCsr->pReadAux;
memset(pCsr, 0, sizeof(RtreeCursor));
pCsr->base.pVtab = (sqlite3_vtab*)pRtree;
+ pCsr->pReadAux = pStmt;
pCsr->iStrategy = idxNum;
if( idxNum==1 ){
@@ -167483,10 +172424,14 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
*/
pIdxInfo->estimatedCost = 30.0;
pIdxInfo->estimatedRows = 1;
+ pIdxInfo->idxFlags = SQLITE_INDEX_SCAN_UNIQUE;
return SQLITE_OK;
}
- if( p->usable && (p->iColumn>0 || p->op==SQLITE_INDEX_CONSTRAINT_MATCH) ){
+ if( p->usable
+ && ((p->iColumn>0 && p->iColumn<=pRtree->nDim2)
+ || p->op==SQLITE_INDEX_CONSTRAINT_MATCH)
+ ){
u8 op;
switch( p->op ){
case SQLITE_INDEX_CONSTRAINT_EQ: op = RTREE_EQ; break;
@@ -167653,7 +172598,7 @@ static int ChooseLeaf(
){
int rc;
int ii;
- RtreeNode *pNode;
+ RtreeNode *pNode = 0;
rc = nodeAcquire(pRtree, 1, 0, &pNode);
for(ii=0; rc==SQLITE_OK && ii<(pRtree->iDepth-iHeight); ii++){
@@ -168059,7 +173004,7 @@ static int SplitNode(
}else{
pLeft = pNode;
pRight = nodeNew(pRtree, pLeft->pParent);
- nodeReference(pLeft);
+ pLeft->nRef++;
}
if( !pLeft || !pRight ){
@@ -168528,7 +173473,7 @@ static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){
*/
if( rc==SQLITE_OK && pRtree->iDepth>0 && NCELL(pRoot)==1 ){
int rc2;
- RtreeNode *pChild;
+ RtreeNode *pChild = 0;
i64 iChild = nodeGetRowid(pRtree, pRoot, 0);
rc = nodeAcquire(pRtree, iChild, pRoot, &pChild);
if( rc==SQLITE_OK ){
@@ -168549,6 +173494,7 @@ static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){
rc = reinsertNodeContent(pRtree, pLeaf);
}
pRtree->pDeleted = pLeaf->pNext;
+ pRtree->nNodeRef--;
sqlite3_free(pLeaf);
}
@@ -168645,7 +173591,7 @@ static int rtreeConstraintError(Rtree *pRtree, int iCol){
static int rtreeUpdate(
sqlite3_vtab *pVtab,
int nData,
- sqlite3_value **azData,
+ sqlite3_value **aData,
sqlite_int64 *pRowid
){
Rtree *pRtree = (Rtree *)pVtab;
@@ -168653,6 +173599,12 @@ static int rtreeUpdate(
RtreeCell cell; /* New cell to insert if nData>1 */
int bHaveRowid = 0; /* Set to 1 after new rowid is determined */
+ if( pRtree->nNodeRef ){
+ /* Unable to write to the btree while another cursor is reading from it,
+ ** since the write might do a rebalance which would disrupt the read
+ ** cursor. */
+ return SQLITE_LOCKED_VTAB;
+ }
rtreeReference(pRtree);
assert(nData>=1);
@@ -168671,8 +173623,10 @@ static int rtreeUpdate(
*/
if( nData>1 ){
int ii;
+ int nn = nData - 4;
- /* Populate the cell.aCoord[] array. The first coordinate is azData[3].
+ if( nn > pRtree->nDim2 ) nn = pRtree->nDim2;
+ /* Populate the cell.aCoord[] array. The first coordinate is aData[3].
**
** NB: nData can only be less than nDim*2+3 if the rtree is mis-declared
** with "column" that are interpreted as table constraints.
@@ -168680,13 +173634,12 @@ static int rtreeUpdate(
** This problem was discovered after years of use, so we silently ignore
** these kinds of misdeclared tables to avoid breaking any legacy.
*/
- assert( nData<=(pRtree->nDim2 + 3) );
#ifndef SQLITE_RTREE_INT_ONLY
if( pRtree->eCoordType==RTREE_COORD_REAL32 ){
- for(ii=0; ii<nData-4; ii+=2){
- cell.aCoord[ii].f = rtreeValueDown(azData[ii+3]);
- cell.aCoord[ii+1].f = rtreeValueUp(azData[ii+4]);
+ for(ii=0; ii<nn; ii+=2){
+ cell.aCoord[ii].f = rtreeValueDown(aData[ii+3]);
+ cell.aCoord[ii+1].f = rtreeValueUp(aData[ii+4]);
if( cell.aCoord[ii].f>cell.aCoord[ii+1].f ){
rc = rtreeConstraintError(pRtree, ii+1);
goto constraint;
@@ -168695,9 +173648,9 @@ static int rtreeUpdate(
}else
#endif
{
- for(ii=0; ii<nData-4; ii+=2){
- cell.aCoord[ii].i = sqlite3_value_int(azData[ii+3]);
- cell.aCoord[ii+1].i = sqlite3_value_int(azData[ii+4]);
+ for(ii=0; ii<nn; ii+=2){
+ cell.aCoord[ii].i = sqlite3_value_int(aData[ii+3]);
+ cell.aCoord[ii+1].i = sqlite3_value_int(aData[ii+4]);
if( cell.aCoord[ii].i>cell.aCoord[ii+1].i ){
rc = rtreeConstraintError(pRtree, ii+1);
goto constraint;
@@ -168707,10 +173660,10 @@ static int rtreeUpdate(
/* If a rowid value was supplied, check if it is already present in
** the table. If so, the constraint has failed. */
- if( sqlite3_value_type(azData[2])!=SQLITE_NULL ){
- cell.iRowid = sqlite3_value_int64(azData[2]);
- if( sqlite3_value_type(azData[0])==SQLITE_NULL
- || sqlite3_value_int64(azData[0])!=cell.iRowid
+ if( sqlite3_value_type(aData[2])!=SQLITE_NULL ){
+ cell.iRowid = sqlite3_value_int64(aData[2]);
+ if( sqlite3_value_type(aData[0])==SQLITE_NULL
+ || sqlite3_value_int64(aData[0])!=cell.iRowid
){
int steprc;
sqlite3_bind_int64(pRtree->pReadRowid, 1, cell.iRowid);
@@ -168729,16 +173682,16 @@ static int rtreeUpdate(
}
}
- /* If azData[0] is not an SQL NULL value, it is the rowid of a
+ /* If aData[0] is not an SQL NULL value, it is the rowid of a
** record to delete from the r-tree table. The following block does
** just that.
*/
- if( sqlite3_value_type(azData[0])!=SQLITE_NULL ){
- rc = rtreeDeleteRowid(pRtree, sqlite3_value_int64(azData[0]));
+ if( sqlite3_value_type(aData[0])!=SQLITE_NULL ){
+ rc = rtreeDeleteRowid(pRtree, sqlite3_value_int64(aData[0]));
}
- /* If the azData[] array contains more than one element, elements
- ** (azData[2]..azData[argc-1]) contain a new record to insert into
+ /* If the aData[] array contains more than one element, elements
+ ** (aData[2]..aData[argc-1]) contain a new record to insert into
** the r-tree structure.
*/
if( rc==SQLITE_OK && nData>1 ){
@@ -168763,6 +173716,16 @@ static int rtreeUpdate(
rc = rc2;
}
}
+ if( pRtree->nAux ){
+ sqlite3_stmt *pUp = pRtree->pWriteAux;
+ int jj;
+ sqlite3_bind_int64(pUp, 1, *pRowid);
+ for(jj=0; jj<pRtree->nAux; jj++){
+ sqlite3_bind_value(pUp, jj+2, aData[pRtree->nDim2+3+jj]);
+ }
+ sqlite3_step(pUp);
+ rc = sqlite3_reset(pUp);
+ }
}
constraint:
@@ -168919,18 +173882,18 @@ static int rtreeSqlInit(
#define N_STATEMENT 8
static const char *azSql[N_STATEMENT] = {
/* Write the xxx_node table */
- "INSERT OR REPLACE INTO '%q'.'%q_node' VALUES(:1, :2)",
- "DELETE FROM '%q'.'%q_node' WHERE nodeno = :1",
+ "INSERT OR REPLACE INTO '%q'.'%q_node' VALUES(?1, ?2)",
+ "DELETE FROM '%q'.'%q_node' WHERE nodeno = ?1",
/* Read and write the xxx_rowid table */
- "SELECT nodeno FROM '%q'.'%q_rowid' WHERE rowid = :1",
- "INSERT OR REPLACE INTO '%q'.'%q_rowid' VALUES(:1, :2)",
- "DELETE FROM '%q'.'%q_rowid' WHERE rowid = :1",
+ "SELECT nodeno FROM '%q'.'%q_rowid' WHERE rowid = ?1",
+ "INSERT OR REPLACE INTO '%q'.'%q_rowid' VALUES(?1, ?2)",
+ "DELETE FROM '%q'.'%q_rowid' WHERE rowid = ?1",
/* Read and write the xxx_parent table */
- "SELECT parentnode FROM '%q'.'%q_parent' WHERE nodeno = :1",
- "INSERT OR REPLACE INTO '%q'.'%q_parent' VALUES(:1, :2)",
- "DELETE FROM '%q'.'%q_parent' WHERE nodeno = :1"
+ "SELECT parentnode FROM '%q'.'%q_parent' WHERE nodeno = ?1",
+ "INSERT OR REPLACE INTO '%q'.'%q_parent' VALUES(?1, ?2)",
+ "DELETE FROM '%q'.'%q_parent' WHERE nodeno = ?1"
};
sqlite3_stmt **appStmt[N_STATEMENT];
int i;
@@ -168938,14 +173901,25 @@ static int rtreeSqlInit(
pRtree->db = db;
if( isCreate ){
- char *zCreate = sqlite3_mprintf(
-"CREATE TABLE \"%w\".\"%w_node\"(nodeno INTEGER PRIMARY KEY, data BLOB);"
-"CREATE TABLE \"%w\".\"%w_rowid\"(rowid INTEGER PRIMARY KEY, nodeno INTEGER);"
-"CREATE TABLE \"%w\".\"%w_parent\"(nodeno INTEGER PRIMARY KEY,"
- " parentnode INTEGER);"
-"INSERT INTO '%q'.'%q_node' VALUES(1, zeroblob(%d))",
- zDb, zPrefix, zDb, zPrefix, zDb, zPrefix, zDb, zPrefix, pRtree->iNodeSize
- );
+ char *zCreate;
+ sqlite3_str *p = sqlite3_str_new(db);
+ int ii;
+ sqlite3_str_appendf(p,
+ "CREATE TABLE \"%w\".\"%w_rowid\"(rowid INTEGER PRIMARY KEY,nodeno",
+ zDb, zPrefix);
+ for(ii=0; ii<pRtree->nAux; ii++){
+ sqlite3_str_appendf(p,",a%d",ii);
+ }
+ sqlite3_str_appendf(p,
+ ");CREATE TABLE \"%w\".\"%w_node\"(nodeno INTEGER PRIMARY KEY,data);",
+ zDb, zPrefix);
+ sqlite3_str_appendf(p,
+ "CREATE TABLE \"%w\".\"%w_parent\"(nodeno INTEGER PRIMARY KEY,parentnode);",
+ zDb, zPrefix);
+ sqlite3_str_appendf(p,
+ "INSERT INTO \"%w\".\"%w_node\"VALUES(1,zeroblob(%d))",
+ zDb, zPrefix, pRtree->iNodeSize);
+ zCreate = sqlite3_str_finish(p);
if( !zCreate ){
return SQLITE_NOMEM;
}
@@ -168967,7 +173941,17 @@ static int rtreeSqlInit(
rc = rtreeQueryStat1(db, pRtree);
for(i=0; i<N_STATEMENT && rc==SQLITE_OK; i++){
- char *zSql = sqlite3_mprintf(azSql[i], zDb, zPrefix);
+ char *zSql;
+ const char *zFormat;
+ if( i!=3 || pRtree->nAux==0 ){
+ zFormat = azSql[i];
+ }else {
+ /* An UPSERT is very slightly slower than REPLACE, but it is needed
+ ** if there are auxiliary columns */
+ zFormat = "INSERT INTO\"%w\".\"%w_rowid\"(rowid,nodeno)VALUES(?1,?2)"
+ "ON CONFLICT(rowid)DO UPDATE SET nodeno=excluded.nodeno";
+ }
+ zSql = sqlite3_mprintf(zFormat, zDb, zPrefix);
if( zSql ){
rc = sqlite3_prepare_v3(db, zSql, -1, SQLITE_PREPARE_PERSISTENT,
appStmt[i], 0);
@@ -168976,6 +173960,32 @@ static int rtreeSqlInit(
}
sqlite3_free(zSql);
}
+ if( pRtree->nAux ){
+ pRtree->zReadAuxSql = sqlite3_mprintf(
+ "SELECT * FROM \"%w\".\"%w_rowid\" WHERE rowid=?1",
+ zDb, zPrefix);
+ if( pRtree->zReadAuxSql==0 ){
+ rc = SQLITE_NOMEM;
+ }else{
+ sqlite3_str *p = sqlite3_str_new(db);
+ int ii;
+ char *zSql;
+ sqlite3_str_appendf(p, "UPDATE \"%w\".\"%w_rowid\"SET ", zDb, zPrefix);
+ for(ii=0; ii<pRtree->nAux; ii++){
+ if( ii ) sqlite3_str_append(p, ",", 1);
+ sqlite3_str_appendf(p,"a%d=?%d",ii,ii+2);
+ }
+ sqlite3_str_appendf(p, " WHERE rowid=?1");
+ zSql = sqlite3_str_finish(p);
+ if( zSql==0 ){
+ rc = SQLITE_NOMEM;
+ }else{
+ rc = sqlite3_prepare_v3(db, zSql, -1, SQLITE_PREPARE_PERSISTENT,
+ &pRtree->pWriteAux, 0);
+ sqlite3_free(zSql);
+ }
+ }
+ }
return rc;
}
@@ -169078,17 +174088,22 @@ static int rtreeInit(
int nDb; /* Length of string argv[1] */
int nName; /* Length of string argv[2] */
int eCoordType = (pAux ? RTREE_COORD_INT32 : RTREE_COORD_REAL32);
+ sqlite3_str *pSql;
+ char *zSql;
+ int ii = 4;
+ int iErr;
const char *aErrMsg[] = {
0, /* 0 */
"Wrong number of columns for an rtree table", /* 1 */
"Too few columns for an rtree table", /* 2 */
- "Too many columns for an rtree table" /* 3 */
+ "Too many columns for an rtree table", /* 3 */
+ "Auxiliary rtree columns must be last" /* 4 */
};
- int iErr = (argc<6) ? 2 : argc>(RTREE_MAX_DIMENSIONS*2+4) ? 3 : argc%2;
- if( aErrMsg[iErr] ){
- *pzErr = sqlite3_mprintf("%s", aErrMsg[iErr]);
+ assert( RTREE_MAX_AUX_COLUMN<256 ); /* Aux columns counted by a u8 */
+ if( argc>RTREE_MAX_AUX_COLUMN+3 ){
+ *pzErr = sqlite3_mprintf("%s", aErrMsg[3]);
return SQLITE_ERROR;
}
@@ -169106,53 +174121,73 @@ static int rtreeInit(
pRtree->base.pModule = &rtreeModule;
pRtree->zDb = (char *)&pRtree[1];
pRtree->zName = &pRtree->zDb[nDb+1];
- pRtree->nDim = (u8)((argc-4)/2);
- pRtree->nDim2 = pRtree->nDim*2;
- pRtree->nBytesPerCell = 8 + pRtree->nDim2*4;
pRtree->eCoordType = (u8)eCoordType;
memcpy(pRtree->zDb, argv[1], nDb);
memcpy(pRtree->zName, argv[2], nName);
- /* Figure out the node size to use. */
- rc = getNodeSize(db, pRtree, isCreate, pzErr);
/* Create/Connect to the underlying relational database schema. If
** that is successful, call sqlite3_declare_vtab() to configure
** the r-tree table schema.
*/
- if( rc==SQLITE_OK ){
- if( (rc = rtreeSqlInit(pRtree, db, argv[1], argv[2], isCreate)) ){
- *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
+ pSql = sqlite3_str_new(db);
+ sqlite3_str_appendf(pSql, "CREATE TABLE x(%s", argv[3]);
+ for(ii=4; ii<argc; ii++){
+ if( argv[ii][0]=='+' ){
+ pRtree->nAux++;
+ sqlite3_str_appendf(pSql, ",%s", argv[ii]+1);
+ }else if( pRtree->nAux>0 ){
+ break;
}else{
- char *zSql = sqlite3_mprintf("CREATE TABLE x(%s", argv[3]);
- char *zTmp;
- int ii;
- for(ii=4; zSql && ii<argc; ii++){
- zTmp = zSql;
- zSql = sqlite3_mprintf("%s, %s", zTmp, argv[ii]);
- sqlite3_free(zTmp);
- }
- if( zSql ){
- zTmp = zSql;
- zSql = sqlite3_mprintf("%s);", zTmp);
- sqlite3_free(zTmp);
- }
- if( !zSql ){
- rc = SQLITE_NOMEM;
- }else if( SQLITE_OK!=(rc = sqlite3_declare_vtab(db, zSql)) ){
- *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
- }
- sqlite3_free(zSql);
+ pRtree->nDim2++;
+ sqlite3_str_appendf(pSql, ",%s", argv[ii]);
}
}
+ sqlite3_str_appendf(pSql, ");");
+ zSql = sqlite3_str_finish(pSql);
+ if( !zSql ){
+ rc = SQLITE_NOMEM;
+ }else if( ii<argc ){
+ *pzErr = sqlite3_mprintf("%s", aErrMsg[4]);
+ rc = SQLITE_ERROR;
+ }else if( SQLITE_OK!=(rc = sqlite3_declare_vtab(db, zSql)) ){
+ *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
+ }
+ sqlite3_free(zSql);
+ if( rc ) goto rtreeInit_fail;
+ pRtree->nDim = pRtree->nDim2/2;
+ if( pRtree->nDim<1 ){
+ iErr = 2;
+ }else if( pRtree->nDim2>RTREE_MAX_DIMENSIONS*2 ){
+ iErr = 3;
+ }else if( pRtree->nDim2 % 2 ){
+ iErr = 1;
+ }else{
+ iErr = 0;
+ }
+ if( iErr ){
+ *pzErr = sqlite3_mprintf("%s", aErrMsg[iErr]);
+ goto rtreeInit_fail;
+ }
+ pRtree->nBytesPerCell = 8 + pRtree->nDim2*4;
- if( rc==SQLITE_OK ){
- *ppVtab = (sqlite3_vtab *)pRtree;
- }else{
- assert( *ppVtab==0 );
- assert( pRtree->nBusy==1 );
- rtreeRelease(pRtree);
+ /* Figure out the node size to use. */
+ rc = getNodeSize(db, pRtree, isCreate, pzErr);
+ if( rc ) goto rtreeInit_fail;
+ rc = rtreeSqlInit(pRtree, db, argv[1], argv[2], isCreate);
+ if( rc ){
+ *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
+ goto rtreeInit_fail;
}
+
+ *ppVtab = (sqlite3_vtab *)pRtree;
+ return SQLITE_OK;
+
+rtreeInit_fail:
+ if( rc==SQLITE_OK ) rc = SQLITE_ERROR;
+ assert( *ppVtab==0 );
+ assert( pRtree->nBusy==1 );
+ rtreeRelease(pRtree);
return rc;
}
@@ -169241,6 +174276,474 @@ static void rtreedepth(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){
}
/*
+** Context object passed between the various routines that make up the
+** implementation of integrity-check function rtreecheck().
+*/
+typedef struct RtreeCheck RtreeCheck;
+struct RtreeCheck {
+ sqlite3 *db; /* Database handle */
+ const char *zDb; /* Database containing rtree table */
+ const char *zTab; /* Name of rtree table */
+ int bInt; /* True for rtree_i32 table */
+ int nDim; /* Number of dimensions for this rtree tbl */
+ sqlite3_stmt *pGetNode; /* Statement used to retrieve nodes */
+ sqlite3_stmt *aCheckMapping[2]; /* Statements to query %_parent/%_rowid */
+ int nLeaf; /* Number of leaf cells in table */
+ int nNonLeaf; /* Number of non-leaf cells in table */
+ int rc; /* Return code */
+ char *zReport; /* Message to report */
+ int nErr; /* Number of lines in zReport */
+};
+
+#define RTREE_CHECK_MAX_ERROR 100
+
+/*
+** Reset SQL statement pStmt. If the sqlite3_reset() call returns an error,
+** and RtreeCheck.rc==SQLITE_OK, set RtreeCheck.rc to the error code.
+*/
+static void rtreeCheckReset(RtreeCheck *pCheck, sqlite3_stmt *pStmt){
+ int rc = sqlite3_reset(pStmt);
+ if( pCheck->rc==SQLITE_OK ) pCheck->rc = rc;
+}
+
+/*
+** The second and subsequent arguments to this function are a format string
+** and printf style arguments. This function formats the string and attempts
+** to compile it as an SQL statement.
+**
+** If successful, a pointer to the new SQL statement is returned. Otherwise,
+** NULL is returned and an error code left in RtreeCheck.rc.
+*/
+static sqlite3_stmt *rtreeCheckPrepare(
+ RtreeCheck *pCheck, /* RtreeCheck object */
+ const char *zFmt, ... /* Format string and trailing args */
+){
+ va_list ap;
+ char *z;
+ sqlite3_stmt *pRet = 0;
+
+ va_start(ap, zFmt);
+ z = sqlite3_vmprintf(zFmt, ap);
+
+ if( pCheck->rc==SQLITE_OK ){
+ if( z==0 ){
+ pCheck->rc = SQLITE_NOMEM;
+ }else{
+ pCheck->rc = sqlite3_prepare_v2(pCheck->db, z, -1, &pRet, 0);
+ }
+ }
+
+ sqlite3_free(z);
+ va_end(ap);
+ return pRet;
+}
+
+/*
+** The second and subsequent arguments to this function are a printf()
+** style format string and arguments. This function formats the string and
+** appends it to the report being accumuated in pCheck.
+*/
+static void rtreeCheckAppendMsg(RtreeCheck *pCheck, const char *zFmt, ...){
+ va_list ap;
+ va_start(ap, zFmt);
+ if( pCheck->rc==SQLITE_OK && pCheck->nErr<RTREE_CHECK_MAX_ERROR ){
+ char *z = sqlite3_vmprintf(zFmt, ap);
+ if( z==0 ){
+ pCheck->rc = SQLITE_NOMEM;
+ }else{
+ pCheck->zReport = sqlite3_mprintf("%z%s%z",
+ pCheck->zReport, (pCheck->zReport ? "\n" : ""), z
+ );
+ if( pCheck->zReport==0 ){
+ pCheck->rc = SQLITE_NOMEM;
+ }
+ }
+ pCheck->nErr++;
+ }
+ va_end(ap);
+}
+
+/*
+** This function is a no-op if there is already an error code stored
+** in the RtreeCheck object indicated by the first argument. NULL is
+** returned in this case.
+**
+** Otherwise, the contents of rtree table node iNode are loaded from
+** the database and copied into a buffer obtained from sqlite3_malloc().
+** If no error occurs, a pointer to the buffer is returned and (*pnNode)
+** is set to the size of the buffer in bytes.
+**
+** Or, if an error does occur, NULL is returned and an error code left
+** in the RtreeCheck object. The final value of *pnNode is undefined in
+** this case.
+*/
+static u8 *rtreeCheckGetNode(RtreeCheck *pCheck, i64 iNode, int *pnNode){
+ u8 *pRet = 0; /* Return value */
+
+ assert( pCheck->rc==SQLITE_OK );
+ if( pCheck->pGetNode==0 ){
+ pCheck->pGetNode = rtreeCheckPrepare(pCheck,
+ "SELECT data FROM %Q.'%q_node' WHERE nodeno=?",
+ pCheck->zDb, pCheck->zTab
+ );
+ }
+
+ if( pCheck->rc==SQLITE_OK ){
+ sqlite3_bind_int64(pCheck->pGetNode, 1, iNode);
+ if( sqlite3_step(pCheck->pGetNode)==SQLITE_ROW ){
+ int nNode = sqlite3_column_bytes(pCheck->pGetNode, 0);
+ const u8 *pNode = (const u8*)sqlite3_column_blob(pCheck->pGetNode, 0);
+ pRet = sqlite3_malloc(nNode);
+ if( pRet==0 ){
+ pCheck->rc = SQLITE_NOMEM;
+ }else{
+ memcpy(pRet, pNode, nNode);
+ *pnNode = nNode;
+ }
+ }
+ rtreeCheckReset(pCheck, pCheck->pGetNode);
+ if( pCheck->rc==SQLITE_OK && pRet==0 ){
+ rtreeCheckAppendMsg(pCheck, "Node %lld missing from database", iNode);
+ }
+ }
+
+ return pRet;
+}
+
+/*
+** This function is used to check that the %_parent (if bLeaf==0) or %_rowid
+** (if bLeaf==1) table contains a specified entry. The schemas of the
+** two tables are:
+**
+** CREATE TABLE %_parent(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)
+** CREATE TABLE %_rowid(rowid INTEGER PRIMARY KEY, nodeno INTEGER, ...)
+**
+** In both cases, this function checks that there exists an entry with
+** IPK value iKey and the second column set to iVal.
+**
+*/
+static void rtreeCheckMapping(
+ RtreeCheck *pCheck, /* RtreeCheck object */
+ int bLeaf, /* True for a leaf cell, false for interior */
+ i64 iKey, /* Key for mapping */
+ i64 iVal /* Expected value for mapping */
+){
+ int rc;
+ sqlite3_stmt *pStmt;
+ const char *azSql[2] = {
+ "SELECT parentnode FROM %Q.'%q_parent' WHERE nodeno=?1",
+ "SELECT nodeno FROM %Q.'%q_rowid' WHERE rowid=?1"
+ };
+
+ assert( bLeaf==0 || bLeaf==1 );
+ if( pCheck->aCheckMapping[bLeaf]==0 ){
+ pCheck->aCheckMapping[bLeaf] = rtreeCheckPrepare(pCheck,
+ azSql[bLeaf], pCheck->zDb, pCheck->zTab
+ );
+ }
+ if( pCheck->rc!=SQLITE_OK ) return;
+
+ pStmt = pCheck->aCheckMapping[bLeaf];
+ sqlite3_bind_int64(pStmt, 1, iKey);
+ rc = sqlite3_step(pStmt);
+ if( rc==SQLITE_DONE ){
+ rtreeCheckAppendMsg(pCheck, "Mapping (%lld -> %lld) missing from %s table",
+ iKey, iVal, (bLeaf ? "%_rowid" : "%_parent")
+ );
+ }else if( rc==SQLITE_ROW ){
+ i64 ii = sqlite3_column_int64(pStmt, 0);
+ if( ii!=iVal ){
+ rtreeCheckAppendMsg(pCheck,
+ "Found (%lld -> %lld) in %s table, expected (%lld -> %lld)",
+ iKey, ii, (bLeaf ? "%_rowid" : "%_parent"), iKey, iVal
+ );
+ }
+ }
+ rtreeCheckReset(pCheck, pStmt);
+}
+
+/*
+** Argument pCell points to an array of coordinates stored on an rtree page.
+** This function checks that the coordinates are internally consistent (no
+** x1>x2 conditions) and adds an error message to the RtreeCheck object
+** if they are not.
+**
+** Additionally, if pParent is not NULL, then it is assumed to point to
+** the array of coordinates on the parent page that bound the page
+** containing pCell. In this case it is also verified that the two
+** sets of coordinates are mutually consistent and an error message added
+** to the RtreeCheck object if they are not.
+*/
+static void rtreeCheckCellCoord(
+ RtreeCheck *pCheck,
+ i64 iNode, /* Node id to use in error messages */
+ int iCell, /* Cell number to use in error messages */
+ u8 *pCell, /* Pointer to cell coordinates */
+ u8 *pParent /* Pointer to parent coordinates */
+){
+ RtreeCoord c1, c2;
+ RtreeCoord p1, p2;
+ int i;
+
+ for(i=0; i<pCheck->nDim; i++){
+ readCoord(&pCell[4*2*i], &c1);
+ readCoord(&pCell[4*(2*i + 1)], &c2);
+
+ /* printf("%e, %e\n", c1.u.f, c2.u.f); */
+ if( pCheck->bInt ? c1.i>c2.i : c1.f>c2.f ){
+ rtreeCheckAppendMsg(pCheck,
+ "Dimension %d of cell %d on node %lld is corrupt", i, iCell, iNode
+ );
+ }
+
+ if( pParent ){
+ readCoord(&pParent[4*2*i], &p1);
+ readCoord(&pParent[4*(2*i + 1)], &p2);
+
+ if( (pCheck->bInt ? c1.i<p1.i : c1.f<p1.f)
+ || (pCheck->bInt ? c2.i>p2.i : c2.f>p2.f)
+ ){
+ rtreeCheckAppendMsg(pCheck,
+ "Dimension %d of cell %d on node %lld is corrupt relative to parent"
+ , i, iCell, iNode
+ );
+ }
+ }
+ }
+}
+
+/*
+** Run rtreecheck() checks on node iNode, which is at depth iDepth within
+** the r-tree structure. Argument aParent points to the array of coordinates
+** that bound node iNode on the parent node.
+**
+** If any problems are discovered, an error message is appended to the
+** report accumulated in the RtreeCheck object.
+*/
+static void rtreeCheckNode(
+ RtreeCheck *pCheck,
+ int iDepth, /* Depth of iNode (0==leaf) */
+ u8 *aParent, /* Buffer containing parent coords */
+ i64 iNode /* Node to check */
+){
+ u8 *aNode = 0;
+ int nNode = 0;
+
+ assert( iNode==1 || aParent!=0 );
+ assert( pCheck->nDim>0 );
+
+ aNode = rtreeCheckGetNode(pCheck, iNode, &nNode);
+ if( aNode ){
+ if( nNode<4 ){
+ rtreeCheckAppendMsg(pCheck,
+ "Node %lld is too small (%d bytes)", iNode, nNode
+ );
+ }else{
+ int nCell; /* Number of cells on page */
+ int i; /* Used to iterate through cells */
+ if( aParent==0 ){
+ iDepth = readInt16(aNode);
+ if( iDepth>RTREE_MAX_DEPTH ){
+ rtreeCheckAppendMsg(pCheck, "Rtree depth out of range (%d)", iDepth);
+ sqlite3_free(aNode);
+ return;
+ }
+ }
+ nCell = readInt16(&aNode[2]);
+ if( (4 + nCell*(8 + pCheck->nDim*2*4))>nNode ){
+ rtreeCheckAppendMsg(pCheck,
+ "Node %lld is too small for cell count of %d (%d bytes)",
+ iNode, nCell, nNode
+ );
+ }else{
+ for(i=0; i<nCell; i++){
+ u8 *pCell = &aNode[4 + i*(8 + pCheck->nDim*2*4)];
+ i64 iVal = readInt64(pCell);
+ rtreeCheckCellCoord(pCheck, iNode, i, &pCell[8], aParent);
+
+ if( iDepth>0 ){
+ rtreeCheckMapping(pCheck, 0, iVal, iNode);
+ rtreeCheckNode(pCheck, iDepth-1, &pCell[8], iVal);
+ pCheck->nNonLeaf++;
+ }else{
+ rtreeCheckMapping(pCheck, 1, iVal, iNode);
+ pCheck->nLeaf++;
+ }
+ }
+ }
+ }
+ sqlite3_free(aNode);
+ }
+}
+
+/*
+** The second argument to this function must be either "_rowid" or
+** "_parent". This function checks that the number of entries in the
+** %_rowid or %_parent table is exactly nExpect. If not, it adds
+** an error message to the report in the RtreeCheck object indicated
+** by the first argument.
+*/
+static void rtreeCheckCount(RtreeCheck *pCheck, const char *zTbl, i64 nExpect){
+ if( pCheck->rc==SQLITE_OK ){
+ sqlite3_stmt *pCount;
+ pCount = rtreeCheckPrepare(pCheck, "SELECT count(*) FROM %Q.'%q%s'",
+ pCheck->zDb, pCheck->zTab, zTbl
+ );
+ if( pCount ){
+ if( sqlite3_step(pCount)==SQLITE_ROW ){
+ i64 nActual = sqlite3_column_int64(pCount, 0);
+ if( nActual!=nExpect ){
+ rtreeCheckAppendMsg(pCheck, "Wrong number of entries in %%%s table"
+ " - expected %lld, actual %lld" , zTbl, nExpect, nActual
+ );
+ }
+ }
+ pCheck->rc = sqlite3_finalize(pCount);
+ }
+ }
+}
+
+/*
+** This function does the bulk of the work for the rtree integrity-check.
+** It is called by rtreecheck(), which is the SQL function implementation.
+*/
+static int rtreeCheckTable(
+ sqlite3 *db, /* Database handle to access db through */
+ const char *zDb, /* Name of db ("main", "temp" etc.) */
+ const char *zTab, /* Name of rtree table to check */
+ char **pzReport /* OUT: sqlite3_malloc'd report text */
+){
+ RtreeCheck check; /* Common context for various routines */
+ sqlite3_stmt *pStmt = 0; /* Used to find column count of rtree table */
+ int bEnd = 0; /* True if transaction should be closed */
+ int nAux = 0; /* Number of extra columns. */
+
+ /* Initialize the context object */
+ memset(&check, 0, sizeof(check));
+ check.db = db;
+ check.zDb = zDb;
+ check.zTab = zTab;
+
+ /* If there is not already an open transaction, open one now. This is
+ ** to ensure that the queries run as part of this integrity-check operate
+ ** on a consistent snapshot. */
+ if( sqlite3_get_autocommit(db) ){
+ check.rc = sqlite3_exec(db, "BEGIN", 0, 0, 0);
+ bEnd = 1;
+ }
+
+ /* Find the number of auxiliary columns */
+ if( check.rc==SQLITE_OK ){
+ pStmt = rtreeCheckPrepare(&check, "SELECT * FROM %Q.'%q_rowid'", zDb, zTab);
+ if( pStmt ){
+ nAux = sqlite3_column_count(pStmt) - 2;
+ sqlite3_finalize(pStmt);
+ }
+ check.rc = SQLITE_OK;
+ }
+
+ /* Find number of dimensions in the rtree table. */
+ pStmt = rtreeCheckPrepare(&check, "SELECT * FROM %Q.%Q", zDb, zTab);
+ if( pStmt ){
+ int rc;
+ check.nDim = (sqlite3_column_count(pStmt) - 1 - nAux) / 2;
+ if( check.nDim<1 ){
+ rtreeCheckAppendMsg(&check, "Schema corrupt or not an rtree");
+ }else if( SQLITE_ROW==sqlite3_step(pStmt) ){
+ check.bInt = (sqlite3_column_type(pStmt, 1)==SQLITE_INTEGER);
+ }
+ rc = sqlite3_finalize(pStmt);
+ if( rc!=SQLITE_CORRUPT ) check.rc = rc;
+ }
+
+ /* Do the actual integrity-check */
+ if( check.nDim>=1 ){
+ if( check.rc==SQLITE_OK ){
+ rtreeCheckNode(&check, 0, 0, 1);
+ }
+ rtreeCheckCount(&check, "_rowid", check.nLeaf);
+ rtreeCheckCount(&check, "_parent", check.nNonLeaf);
+ }
+
+ /* Finalize SQL statements used by the integrity-check */
+ sqlite3_finalize(check.pGetNode);
+ sqlite3_finalize(check.aCheckMapping[0]);
+ sqlite3_finalize(check.aCheckMapping[1]);
+
+ /* If one was opened, close the transaction */
+ if( bEnd ){
+ int rc = sqlite3_exec(db, "END", 0, 0, 0);
+ if( check.rc==SQLITE_OK ) check.rc = rc;
+ }
+ *pzReport = check.zReport;
+ return check.rc;
+}
+
+/*
+** Usage:
+**
+** rtreecheck(<rtree-table>);
+** rtreecheck(<database>, <rtree-table>);
+**
+** Invoking this SQL function runs an integrity-check on the named rtree
+** table. The integrity-check verifies the following:
+**
+** 1. For each cell in the r-tree structure (%_node table), that:
+**
+** a) for each dimension, (coord1 <= coord2).
+**
+** b) unless the cell is on the root node, that the cell is bounded
+** by the parent cell on the parent node.
+**
+** c) for leaf nodes, that there is an entry in the %_rowid
+** table corresponding to the cell's rowid value that
+** points to the correct node.
+**
+** d) for cells on non-leaf nodes, that there is an entry in the
+** %_parent table mapping from the cell's child node to the
+** node that it resides on.
+**
+** 2. That there are the same number of entries in the %_rowid table
+** as there are leaf cells in the r-tree structure, and that there
+** is a leaf cell that corresponds to each entry in the %_rowid table.
+**
+** 3. That there are the same number of entries in the %_parent table
+** as there are non-leaf cells in the r-tree structure, and that
+** there is a non-leaf cell that corresponds to each entry in the
+** %_parent table.
+*/
+static void rtreecheck(
+ sqlite3_context *ctx,
+ int nArg,
+ sqlite3_value **apArg
+){
+ if( nArg!=1 && nArg!=2 ){
+ sqlite3_result_error(ctx,
+ "wrong number of arguments to function rtreecheck()", -1
+ );
+ }else{
+ int rc;
+ char *zReport = 0;
+ const char *zDb = (const char*)sqlite3_value_text(apArg[0]);
+ const char *zTab;
+ if( nArg==1 ){
+ zTab = zDb;
+ zDb = "main";
+ }else{
+ zTab = (const char*)sqlite3_value_text(apArg[1]);
+ }
+ rc = rtreeCheckTable(sqlite3_context_db_handle(ctx), zDb, zTab, &zReport);
+ if( rc==SQLITE_OK ){
+ sqlite3_result_text(ctx, zReport ? zReport : "ok", -1, SQLITE_TRANSIENT);
+ }else{
+ sqlite3_result_error_code(ctx, rc);
+ }
+ sqlite3_free(zReport);
+ }
+}
+
+
+/*
** Register the r-tree module with database handle db. This creates the
** virtual table module "rtree" and the debugging/analysis scalar
** function "rtreenode".
@@ -169254,6 +174757,9 @@ SQLITE_PRIVATE int sqlite3RtreeInit(sqlite3 *db){
rc = sqlite3_create_function(db, "rtreedepth", 1, utf8, 0,rtreedepth, 0, 0);
}
if( rc==SQLITE_OK ){
+ rc = sqlite3_create_function(db, "rtreecheck", -1, utf8, 0,rtreecheck, 0,0);
+ }
+ if( rc==SQLITE_OK ){
#ifdef SQLITE_RTREE_INT_ONLY
void *c = (void *)RTREE_COORD_INT32;
#else
@@ -169439,7 +174945,9 @@ SQLITE_API int sqlite3_rtree_init(
** provide case-independent matching.
*/
-#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU)
+#if !defined(SQLITE_CORE) \
+ || defined(SQLITE_ENABLE_ICU) \
+ || defined(SQLITE_ENABLE_ICU_COLLATIONS)
/* Include ICU headers */
#include <unicode/utypes.h>
@@ -169457,6 +174965,26 @@ SQLITE_API int sqlite3_rtree_init(
#endif
/*
+** This function is called when an ICU function called from within
+** the implementation of an SQL scalar function returns an error.
+**
+** The scalar function context passed as the first argument is
+** loaded with an error message based on the following two args.
+*/
+static void icuFunctionError(
+ sqlite3_context *pCtx, /* SQLite scalar function context */
+ const char *zName, /* Name of ICU function that failed */
+ UErrorCode e /* Error code returned by ICU function */
+){
+ char zBuf[128];
+ sqlite3_snprintf(128, zBuf, "ICU error: %s(): %s", zName, u_errorName(e));
+ zBuf[127] = '\0';
+ sqlite3_result_error(pCtx, zBuf, -1);
+}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU)
+
+/*
** Maximum length (in bytes) of the pattern in a LIKE or GLOB
** operator.
*/
@@ -169636,24 +175164,6 @@ static void icuLikeFunc(
}
/*
-** This function is called when an ICU function called from within
-** the implementation of an SQL scalar function returns an error.
-**
-** The scalar function context passed as the first argument is
-** loaded with an error message based on the following two args.
-*/
-static void icuFunctionError(
- sqlite3_context *pCtx, /* SQLite scalar function context */
- const char *zName, /* Name of ICU function that failed */
- UErrorCode e /* Error code returned by ICU function */
-){
- char zBuf[128];
- sqlite3_snprintf(128, zBuf, "ICU error: %s(): %s", zName, u_errorName(e));
- zBuf[127] = '\0';
- sqlite3_result_error(pCtx, zBuf, -1);
-}
-
-/*
** Function to delete compiled regexp objects. Registered as
** a destructor function with sqlite3_set_auxdata().
*/
@@ -169818,6 +175328,8 @@ static void icuCaseFunc16(sqlite3_context *p, int nArg, sqlite3_value **apArg){
assert( 0 ); /* Unreachable */
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) */
+
/*
** Collation sequence destructor function. The pCtx argument points to
** a UCollator structure previously allocated using ucol_open().
@@ -169912,6 +175424,7 @@ SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db){
void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
} scalars[] = {
{"icu_load_collation", 2, SQLITE_UTF8, 1, icuLoadCollation},
+#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU)
{"regexp", 2, SQLITE_ANY|SQLITE_DETERMINISTIC, 0, icuRegexpFunc},
{"lower", 1, SQLITE_UTF16|SQLITE_DETERMINISTIC, 0, icuCaseFunc16},
{"lower", 2, SQLITE_UTF16|SQLITE_DETERMINISTIC, 0, icuCaseFunc16},
@@ -169923,10 +175436,10 @@ SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db){
{"upper", 2, SQLITE_UTF8|SQLITE_DETERMINISTIC, 1, icuCaseFunc16},
{"like", 2, SQLITE_UTF8|SQLITE_DETERMINISTIC, 0, icuLikeFunc},
{"like", 3, SQLITE_UTF8|SQLITE_DETERMINISTIC, 0, icuLikeFunc},
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) */
};
int rc = SQLITE_OK;
int i;
-
for(i=0; rc==SQLITE_OK && i<(int)(sizeof(scalars)/sizeof(scalars[0])); i++){
const struct IcuScalar *p = &scalars[i];
@@ -170983,6 +176496,10 @@ SQLITE_API void sqlite3rbu_destroy_vfs(const char *zName);
**
** RBU_STATE_OALSZ:
** Valid if STAGE==1. The size in bytes of the *-oal file.
+**
+** RBU_STATE_DATATBL:
+** Only valid if STAGE==1. The RBU database name of the table
+** currently being read.
*/
#define RBU_STATE_STAGE 1
#define RBU_STATE_TBL 2
@@ -170993,6 +176510,7 @@ SQLITE_API void sqlite3rbu_destroy_vfs(const char *zName);
#define RBU_STATE_COOKIE 7
#define RBU_STATE_OALSZ 8
#define RBU_STATE_PHASEONESTEP 9
+#define RBU_STATE_DATATBL 10
#define RBU_STAGE_OAL 1
#define RBU_STAGE_MOVE 2
@@ -171035,6 +176553,7 @@ typedef sqlite3_int64 i64;
struct RbuState {
int eStage;
char *zTbl;
+ char *zDataTbl;
char *zIdx;
i64 iWalCksum;
int nRow;
@@ -172636,7 +178155,7 @@ static void rbuCreateImposterTable2(sqlite3rbu *p, RbuObjIter *pIter){
int iCid = sqlite3_column_int(pXInfo, 1);
int bDesc = sqlite3_column_int(pXInfo, 3);
const char *zCollate = (const char*)sqlite3_column_text(pXInfo, 4);
- zCols = rbuMPrintf(p, "%z%sc%d %s COLLATE %s", zCols, zComma,
+ zCols = rbuMPrintf(p, "%z%sc%d %s COLLATE %Q", zCols, zComma,
iCid, pIter->azTblType[iCid], zCollate
);
zPk = rbuMPrintf(p, "%z%sc%d%s", zPk, zComma, iCid, bDesc?" DESC":"");
@@ -172697,7 +178216,7 @@ static void rbuCreateImposterTable(sqlite3rbu *p, RbuObjIter *pIter){
** "PRIMARY KEY" to the imposter table column declaration. */
zPk = "PRIMARY KEY ";
}
- zSql = rbuMPrintf(p, "%z%s\"%w\" %s %sCOLLATE %s%s",
+ zSql = rbuMPrintf(p, "%z%s\"%w\" %s %sCOLLATE %Q%s",
zSql, zComma, zCol, pIter->azTblType[iCol], zPk, zColl,
(pIter->abNotNull[iCol] ? " NOT NULL" : "")
);
@@ -173098,6 +178617,7 @@ static sqlite3 *rbuOpenDbhandle(
static void rbuFreeState(RbuState *p){
if( p ){
sqlite3_free(p->zTbl);
+ sqlite3_free(p->zDataTbl);
sqlite3_free(p->zIdx);
sqlite3_free(p);
}
@@ -173168,6 +178688,10 @@ static RbuState *rbuLoadState(sqlite3rbu *p){
pRet->nPhaseOneStep = sqlite3_column_int64(pStmt, 1);
break;
+ case RBU_STATE_DATATBL:
+ pRet->zDataTbl = rbuStrndup((char*)sqlite3_column_text(pStmt, 1), &rc);
+ break;
+
default:
rc = SQLITE_CORRUPT;
break;
@@ -173942,7 +179466,8 @@ static void rbuSaveState(sqlite3rbu *p, int eStage){
"(%d, %lld), "
"(%d, %lld), "
"(%d, %lld), "
- "(%d, %lld) ",
+ "(%d, %lld), "
+ "(%d, %Q) ",
p->zStateDb,
RBU_STATE_STAGE, eStage,
RBU_STATE_TBL, p->objiter.zTbl,
@@ -173952,7 +179477,8 @@ static void rbuSaveState(sqlite3rbu *p, int eStage){
RBU_STATE_CKPT, p->iWalCksum,
RBU_STATE_COOKIE, (i64)pFd->iCookie,
RBU_STATE_OALSZ, p->iOalSz,
- RBU_STATE_PHASEONESTEP, p->nPhaseOneStep
+ RBU_STATE_PHASEONESTEP, p->nPhaseOneStep,
+ RBU_STATE_DATATBL, p->objiter.zDataTbl
)
);
assert( pInsert==0 || rc==SQLITE_OK );
@@ -174208,7 +179734,8 @@ static void rbuSetupOal(sqlite3rbu *p, RbuState *pState){
while( rc==SQLITE_OK && pIter->zTbl && (pIter->bCleanup
|| rbuStrCompare(pIter->zIdx, pState->zIdx)
- || rbuStrCompare(pIter->zTbl, pState->zTbl)
+ || (pState->zDataTbl==0 && rbuStrCompare(pIter->zTbl, pState->zTbl))
+ || (pState->zDataTbl && rbuStrCompare(pIter->zDataTbl, pState->zDataTbl))
)){
rc = rbuObjIterNext(p, pIter);
}
@@ -176131,7 +181658,7 @@ static void statSizeAndOffset(StatCursor *pCsr){
*/
fd = sqlite3PagerFile(pPager);
x[0] = pCsr->iPageno;
- if( fd->pMethods!=0 && sqlite3OsFileControl(fd, 230440, &x)==SQLITE_OK ){
+ if( sqlite3OsFileControl(fd, 230440, &x)==SQLITE_OK ){
pCsr->iOffset = x[0];
pCsr->szPage = (int)x[1];
}
@@ -176457,17 +181984,24 @@ struct DbpageCursor {
sqlite3_vtab_cursor base; /* Base class. Must be first */
int pgno; /* Current page number */
int mxPgno; /* Last page to visit on this scan */
+ Pager *pPager; /* Pager being read/written */
+ DbPage *pPage1; /* Page 1 of the database */
+ int iDb; /* Index of database to analyze */
+ int szPage; /* Size of each page in bytes */
};
struct DbpageTable {
sqlite3_vtab base; /* Base class. Must be first */
sqlite3 *db; /* The database */
- Pager *pPager; /* Pager being read/written */
- int iDb; /* Index of database to analyze */
- int szPage; /* Size of each page in bytes */
- int nPage; /* Number of pages in the file */
};
+/* Columns */
+#define DBPAGE_COLUMN_PGNO 0
+#define DBPAGE_COLUMN_DATA 1
+#define DBPAGE_COLUMN_SCHEMA 2
+
+
+
/*
** Connect to or create a dbpagevfs virtual table.
*/
@@ -176480,19 +182014,7 @@ static int dbpageConnect(
){
DbpageTable *pTab = 0;
int rc = SQLITE_OK;
- int iDb;
- if( argc>=4 ){
- Token nm;
- sqlite3TokenInit(&nm, (char*)argv[3]);
- iDb = sqlite3FindDb(db, &nm);
- if( iDb<0 ){
- *pzErr = sqlite3_mprintf("no such schema: %s", argv[3]);
- return SQLITE_ERROR;
- }
- }else{
- iDb = 0;
- }
rc = sqlite3_declare_vtab(db,
"CREATE TABLE x(pgno INTEGER PRIMARY KEY, data BLOB, schema HIDDEN)");
if( rc==SQLITE_OK ){
@@ -176502,11 +182024,8 @@ static int dbpageConnect(
assert( rc==SQLITE_OK || pTab==0 );
if( rc==SQLITE_OK ){
- Btree *pBt = db->aDb[iDb].pBt;
memset(pTab, 0, sizeof(DbpageTable));
pTab->db = db;
- pTab->iDb = iDb;
- pTab->pPager = pBt ? sqlite3BtreePager(pBt) : 0;
}
*ppVtab = (sqlite3_vtab*)pTab;
@@ -176524,24 +182043,55 @@ static int dbpageDisconnect(sqlite3_vtab *pVtab){
/*
** idxNum:
**
-** 0 full table scan
-** 1 pgno=?1
+** 0 schema=main, full table scan
+** 1 schema=main, pgno=?1
+** 2 schema=?1, full table scan
+** 3 schema=?1, pgno=?2
*/
static int dbpageBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
int i;
- pIdxInfo->estimatedCost = 1.0e6; /* Initial cost estimate */
+ int iPlan = 0;
+
+ /* If there is a schema= constraint, it must be honored. Report a
+ ** ridiculously large estimated cost if the schema= constraint is
+ ** unavailable
+ */
+ for(i=0; i<pIdxInfo->nConstraint; i++){
+ struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[i];
+ if( p->iColumn!=DBPAGE_COLUMN_SCHEMA ) continue;
+ if( p->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
+ if( !p->usable ){
+ /* No solution. Use the default SQLITE_BIG_DBL cost */
+ pIdxInfo->estimatedRows = 0x7fffffff;
+ return SQLITE_OK;
+ }
+ iPlan = 2;
+ pIdxInfo->aConstraintUsage[i].argvIndex = 1;
+ pIdxInfo->aConstraintUsage[i].omit = 1;
+ break;
+ }
+
+ /* If we reach this point, it means that either there is no schema=
+ ** constraint (in which case we use the "main" schema) or else the
+ ** schema constraint was accepted. Lower the estimated cost accordingly
+ */
+ pIdxInfo->estimatedCost = 1.0e6;
+
+ /* Check for constraints against pgno */
for(i=0; i<pIdxInfo->nConstraint; i++){
struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[i];
if( p->usable && p->iColumn<=0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ ){
pIdxInfo->estimatedRows = 1;
pIdxInfo->idxFlags = SQLITE_INDEX_SCAN_UNIQUE;
pIdxInfo->estimatedCost = 1.0;
- pIdxInfo->idxNum = 1;
- pIdxInfo->aConstraintUsage[i].argvIndex = 1;
+ pIdxInfo->aConstraintUsage[i].argvIndex = iPlan ? 2 : 1;
pIdxInfo->aConstraintUsage[i].omit = 1;
+ iPlan |= 1;
break;
}
}
+ pIdxInfo->idxNum = iPlan;
+
if( pIdxInfo->nOrderBy>=1
&& pIdxInfo->aOrderBy[0].iColumn<=0
&& pIdxInfo->aOrderBy[0].desc==0
@@ -176575,6 +182125,7 @@ static int dbpageOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
*/
static int dbpageClose(sqlite3_vtab_cursor *pCursor){
DbpageCursor *pCsr = (DbpageCursor *)pCursor;
+ if( pCsr->pPage1 ) sqlite3PagerUnrefPageOne(pCsr->pPage1);
sqlite3_free(pCsr);
return SQLITE_OK;
}
@@ -176594,6 +182145,16 @@ static int dbpageEof(sqlite3_vtab_cursor *pCursor){
return pCsr->pgno > pCsr->mxPgno;
}
+/*
+** idxNum:
+**
+** 0 schema=main, full table scan
+** 1 schema=main, pgno=?1
+** 2 schema=?1, full table scan
+** 3 schema=?1, pgno=?2
+**
+** idxStr is not used
+*/
static int dbpageFilter(
sqlite3_vtab_cursor *pCursor,
int idxNum, const char *idxStr,
@@ -176601,23 +182162,42 @@ static int dbpageFilter(
){
DbpageCursor *pCsr = (DbpageCursor *)pCursor;
DbpageTable *pTab = (DbpageTable *)pCursor->pVtab;
- int rc = SQLITE_OK;
- Btree *pBt = pTab->db->aDb[pTab->iDb].pBt;
+ int rc;
+ sqlite3 *db = pTab->db;
+ Btree *pBt;
- pTab->szPage = sqlite3BtreeGetPageSize(pBt);
- pTab->nPage = sqlite3BtreeLastPage(pBt);
- if( idxNum==1 ){
- pCsr->pgno = sqlite3_value_int(argv[0]);
- if( pCsr->pgno<1 || pCsr->pgno>pTab->nPage ){
+ /* Default setting is no rows of result */
+ pCsr->pgno = 1;
+ pCsr->mxPgno = 0;
+
+ if( idxNum & 2 ){
+ const char *zSchema;
+ assert( argc>=1 );
+ zSchema = (const char*)sqlite3_value_text(argv[0]);
+ pCsr->iDb = sqlite3FindDbName(db, zSchema);
+ if( pCsr->iDb<0 ) return SQLITE_OK;
+ }else{
+ pCsr->iDb = 0;
+ }
+ pBt = db->aDb[pCsr->iDb].pBt;
+ if( pBt==0 ) return SQLITE_OK;
+ pCsr->pPager = sqlite3BtreePager(pBt);
+ pCsr->szPage = sqlite3BtreeGetPageSize(pBt);
+ pCsr->mxPgno = sqlite3BtreeLastPage(pBt);
+ if( idxNum & 1 ){
+ assert( argc>(idxNum>>1) );
+ pCsr->pgno = sqlite3_value_int(argv[idxNum>>1]);
+ if( pCsr->pgno<1 || pCsr->pgno>pCsr->mxPgno ){
pCsr->pgno = 1;
pCsr->mxPgno = 0;
}else{
pCsr->mxPgno = pCsr->pgno;
}
}else{
- pCsr->pgno = 1;
- pCsr->mxPgno = pTab->nPage;
+ assert( pCsr->pgno==1 );
}
+ if( pCsr->pPage1 ) sqlite3PagerUnrefPageOne(pCsr->pPage1);
+ rc = sqlite3PagerGet(pCsr->pPager, 1, &pCsr->pPage1, 0);
return rc;
}
@@ -176627,7 +182207,6 @@ static int dbpageColumn(
int i
){
DbpageCursor *pCsr = (DbpageCursor *)pCursor;
- DbpageTable *pTab = (DbpageTable *)pCursor->pVtab;
int rc = SQLITE_OK;
switch( i ){
case 0: { /* pgno */
@@ -176636,9 +182215,9 @@ static int dbpageColumn(
}
case 1: { /* data */
DbPage *pDbPage = 0;
- rc = sqlite3PagerGet(pTab->pPager, pCsr->pgno, (DbPage**)&pDbPage, 0);
+ rc = sqlite3PagerGet(pCsr->pPager, pCsr->pgno, (DbPage**)&pDbPage, 0);
if( rc==SQLITE_OK ){
- sqlite3_result_blob(ctx, sqlite3PagerGetData(pDbPage), pTab->szPage,
+ sqlite3_result_blob(ctx, sqlite3PagerGetData(pDbPage), pCsr->szPage,
SQLITE_TRANSIENT);
}
sqlite3PagerUnref(pDbPage);
@@ -176646,7 +182225,7 @@ static int dbpageColumn(
}
default: { /* schema */
sqlite3 *db = sqlite3_context_db_handle(ctx);
- sqlite3_result_text(ctx, db->aDb[pTab->iDb].zDbSName, -1, SQLITE_STATIC);
+ sqlite3_result_text(ctx, db->aDb[pCsr->iDb].zDbSName, -1, SQLITE_STATIC);
break;
}
}
@@ -176666,37 +182245,51 @@ static int dbpageUpdate(
sqlite_int64 *pRowid
){
DbpageTable *pTab = (DbpageTable *)pVtab;
- int pgno;
+ Pgno pgno;
DbPage *pDbPage = 0;
int rc = SQLITE_OK;
char *zErr = 0;
+ const char *zSchema;
+ int iDb;
+ Btree *pBt;
+ Pager *pPager;
+ int szPage;
if( argc==1 ){
zErr = "cannot delete";
goto update_fail;
}
pgno = sqlite3_value_int(argv[0]);
- if( pgno<1 || pgno>pTab->nPage ){
- zErr = "bad page number";
+ if( (Pgno)sqlite3_value_int(argv[1])!=pgno ){
+ zErr = "cannot insert";
goto update_fail;
}
- if( sqlite3_value_int(argv[1])!=pgno ){
- zErr = "cannot insert";
+ zSchema = (const char*)sqlite3_value_text(argv[4]);
+ iDb = zSchema ? sqlite3FindDbName(pTab->db, zSchema) : -1;
+ if( iDb<0 ){
+ zErr = "no such schema";
+ goto update_fail;
+ }
+ pBt = pTab->db->aDb[iDb].pBt;
+ if( pgno<1 || pBt==0 || pgno>(int)sqlite3BtreeLastPage(pBt) ){
+ zErr = "bad page number";
goto update_fail;
}
+ szPage = sqlite3BtreeGetPageSize(pBt);
if( sqlite3_value_type(argv[3])!=SQLITE_BLOB
- || sqlite3_value_bytes(argv[3])!=pTab->szPage
+ || sqlite3_value_bytes(argv[3])!=szPage
){
zErr = "bad page value";
goto update_fail;
}
- rc = sqlite3PagerGet(pTab->pPager, pgno, (DbPage**)&pDbPage, 0);
+ pPager = sqlite3BtreePager(pBt);
+ rc = sqlite3PagerGet(pPager, pgno, (DbPage**)&pDbPage, 0);
if( rc==SQLITE_OK ){
rc = sqlite3PagerWrite(pDbPage);
if( rc==SQLITE_OK ){
memcpy(sqlite3PagerGetData(pDbPage),
sqlite3_value_blob(argv[3]),
- pTab->szPage);
+ szPage);
}
}
sqlite3PagerUnref(pDbPage);
@@ -176708,6 +182301,22 @@ update_fail:
return SQLITE_ERROR;
}
+/* Since we do not know in advance which database files will be
+** written by the sqlite_dbpage virtual table, start a write transaction
+** on them all.
+*/
+static int dbpageBegin(sqlite3_vtab *pVtab){
+ DbpageTable *pTab = (DbpageTable *)pVtab;
+ sqlite3 *db = pTab->db;
+ int i;
+ for(i=0; i<db->nDb; i++){
+ Btree *pBt = db->aDb[i].pBt;
+ if( pBt ) sqlite3BtreeBeginTrans(pBt, 1);
+ }
+ return SQLITE_OK;
+}
+
+
/*
** Invoke this routine to register the "dbpage" virtual table module
*/
@@ -176727,7 +182336,7 @@ SQLITE_PRIVATE int sqlite3DbpageRegister(sqlite3 *db){
dbpageColumn, /* xColumn - read data */
dbpageRowid, /* xRowid - read data */
dbpageUpdate, /* xUpdate */
- 0, /* xBegin */
+ dbpageBegin, /* xBegin */
0, /* xSync */
0, /* xCommit */
0, /* xRollback */
@@ -176793,6 +182402,7 @@ struct sqlite3_session {
int rc; /* Non-zero if an error has occurred */
void *pFilterCtx; /* First argument to pass to xTableFilter */
int (*xTableFilter)(void *pCtx, const char *zTab);
+ sqlite3_value *pZeroBlob; /* Value containing X'' */
sqlite3_session *pNext; /* Next session object on same db. */
SessionTable *pTable; /* List of attached tables */
SessionHook hook; /* APIs to grab new and old data with */
@@ -176814,7 +182424,7 @@ struct SessionBuffer {
** sqlite3changeset_start_strm()).
*/
struct SessionInput {
- int bNoDiscard; /* If true, discard no data */
+ int bNoDiscard; /* If true, do not discard in InputBuffer() */
int iCurrent; /* Offset in aData[] of current change */
int iNext; /* Offset in aData[] of next change */
u8 *aData; /* Pointer to buffer containing changeset */
@@ -176860,6 +182470,7 @@ struct SessionTable {
SessionTable *pNext;
char *zName; /* Local name of table */
int nCol; /* Number of columns in table zName */
+ int bStat1; /* True if this is sqlite_stat1 */
const char **azCol; /* Column names */
u8 *abPK; /* Array of primary key flags */
int nEntry; /* Total number of entries in hash table */
@@ -176977,8 +182588,8 @@ struct SessionTable {
** statement.
**
** For a DELETE change, all fields within the record except those associated
-** with PRIMARY KEY columns are set to "undefined". The PRIMARY KEY fields
-** contain the values identifying the row to delete.
+** with PRIMARY KEY columns are omitted. The PRIMARY KEY fields contain the
+** values identifying the row to delete.
**
** For an UPDATE change, all fields except those associated with PRIMARY KEY
** columns and columns that are modified by the UPDATE are set to "undefined".
@@ -177243,6 +182854,7 @@ static int sessionPreupdateHash(
h = sessionHashAppendBlob(h, n, z);
}else{
assert( eType==SQLITE_NULL );
+ assert( pTab->bStat1==0 || i!=1 );
*pbNullPK = 1;
}
}
@@ -177260,7 +182872,7 @@ static int sessionPreupdateHash(
static int sessionSerialLen(u8 *a){
int e = *a;
int n;
- if( e==0 ) return 1;
+ if( e==0 || e==0xFF ) return 1;
if( e==SQLITE_NULL ) return 1;
if( e==SQLITE_INTEGER || e==SQLITE_FLOAT ) return 9;
return sessionVarintGet(&a[1], &n) + 1 + n;
@@ -177340,7 +182952,7 @@ static int sessionChangeEqual(
int n1 = sessionSerialLen(a1);
int n2 = sessionSerialLen(a2);
- if( pTab->abPK[iCol] && (n1!=n2 || memcmp(a1, a2, n1)) ){
+ if( n1!=n2 || memcmp(a1, a2, n1) ){
return 0;
}
a1 += n1;
@@ -177583,9 +183195,8 @@ static int sessionPreupdateEqual(
}else{
z = sqlite3_value_blob(pVal);
}
- if( memcmp(a, z, n) ) return 0;
+ if( n>0 && memcmp(a, z, n) ) return 0;
a += n;
- break;
}
}
}
@@ -177641,9 +183252,7 @@ static int sessionGrowHash(int bPatchset, SessionTable *pTab){
/*
** This function queries the database for the names of the columns of table
-** zThis, in schema zDb. It is expected that the table has nCol columns. If
-** not, SQLITE_SCHEMA is returned and none of the output variables are
-** populated.
+** zThis, in schema zDb.
**
** Otherwise, if they are not NULL, variable *pnCol is set to the number
** of columns in the database table and variable *pzTab is set to point to a
@@ -177664,9 +183273,7 @@ static int sessionGrowHash(int bPatchset, SessionTable *pTab){
** *pabPK = {1, 0, 0, 1}
**
** All returned buffers are part of the same single allocation, which must
-** be freed using sqlite3_free() by the caller. If pazCol was not NULL, then
-** pointer *pazCol should be freed to release all memory. Otherwise, pointer
-** *pabPK. It is illegal for both pazCol and pabPK to be NULL.
+** be freed using sqlite3_free() by the caller
*/
static int sessionTableInfo(
sqlite3 *db, /* Database connection */
@@ -177691,7 +183298,23 @@ static int sessionTableInfo(
assert( pazCol && pabPK );
nThis = sqlite3Strlen30(zThis);
- zPragma = sqlite3_mprintf("PRAGMA '%q'.table_info('%q')", zDb, zThis);
+ if( nThis==12 && 0==sqlite3_stricmp("sqlite_stat1", zThis) ){
+ rc = sqlite3_table_column_metadata(db, zDb, zThis, 0, 0, 0, 0, 0, 0);
+ if( rc==SQLITE_OK ){
+ /* For sqlite_stat1, pretend that (tbl,idx) is the PRIMARY KEY. */
+ zPragma = sqlite3_mprintf(
+ "SELECT 0, 'tbl', '', 0, '', 1 UNION ALL "
+ "SELECT 1, 'idx', '', 0, '', 2 UNION ALL "
+ "SELECT 2, 'stat', '', 0, '', 0"
+ );
+ }else if( rc==SQLITE_ERROR ){
+ zPragma = sqlite3_mprintf("");
+ }else{
+ return rc;
+ }
+ }else{
+ zPragma = sqlite3_mprintf("PRAGMA '%q'.table_info('%q')", zDb, zThis);
+ }
if( !zPragma ) return SQLITE_NOMEM;
rc = sqlite3_prepare_v2(db, zPragma, -1, &pStmt, 0);
@@ -177783,12 +183406,56 @@ static int sessionInitTable(sqlite3_session *pSession, SessionTable *pTab){
break;
}
}
+ if( 0==sqlite3_stricmp("sqlite_stat1", pTab->zName) ){
+ pTab->bStat1 = 1;
+ }
}
}
return (pSession->rc || pTab->abPK==0);
}
/*
+** Versions of the four methods in object SessionHook for use with the
+** sqlite_stat1 table. The purpose of this is to substitute a zero-length
+** blob each time a NULL value is read from the "idx" column of the
+** sqlite_stat1 table.
+*/
+typedef struct SessionStat1Ctx SessionStat1Ctx;
+struct SessionStat1Ctx {
+ SessionHook hook;
+ sqlite3_session *pSession;
+};
+static int sessionStat1Old(void *pCtx, int iCol, sqlite3_value **ppVal){
+ SessionStat1Ctx *p = (SessionStat1Ctx*)pCtx;
+ sqlite3_value *pVal = 0;
+ int rc = p->hook.xOld(p->hook.pCtx, iCol, &pVal);
+ if( rc==SQLITE_OK && iCol==1 && sqlite3_value_type(pVal)==SQLITE_NULL ){
+ pVal = p->pSession->pZeroBlob;
+ }
+ *ppVal = pVal;
+ return rc;
+}
+static int sessionStat1New(void *pCtx, int iCol, sqlite3_value **ppVal){
+ SessionStat1Ctx *p = (SessionStat1Ctx*)pCtx;
+ sqlite3_value *pVal = 0;
+ int rc = p->hook.xNew(p->hook.pCtx, iCol, &pVal);
+ if( rc==SQLITE_OK && iCol==1 && sqlite3_value_type(pVal)==SQLITE_NULL ){
+ pVal = p->pSession->pZeroBlob;
+ }
+ *ppVal = pVal;
+ return rc;
+}
+static int sessionStat1Count(void *pCtx){
+ SessionStat1Ctx *p = (SessionStat1Ctx*)pCtx;
+ return p->hook.xCount(p->hook.pCtx);
+}
+static int sessionStat1Depth(void *pCtx){
+ SessionStat1Ctx *p = (SessionStat1Ctx*)pCtx;
+ return p->hook.xDepth(p->hook.pCtx);
+}
+
+
+/*
** This function is only called from with a pre-update-hook reporting a
** change on table pTab (attached to session pSession). The type of change
** (UPDATE, INSERT, DELETE) is specified by the first argument.
@@ -177804,6 +183471,7 @@ static void sessionPreupdateOneChange(
int iHash;
int bNull = 0;
int rc = SQLITE_OK;
+ SessionStat1Ctx stat1 = {0};
if( pSession->rc ) return;
@@ -177823,6 +183491,25 @@ static void sessionPreupdateOneChange(
return;
}
+ if( pTab->bStat1 ){
+ stat1.hook = pSession->hook;
+ stat1.pSession = pSession;
+ pSession->hook.pCtx = (void*)&stat1;
+ pSession->hook.xNew = sessionStat1New;
+ pSession->hook.xOld = sessionStat1Old;
+ pSession->hook.xCount = sessionStat1Count;
+ pSession->hook.xDepth = sessionStat1Depth;
+ if( pSession->pZeroBlob==0 ){
+ sqlite3_value *p = sqlite3ValueNew(0);
+ if( p==0 ){
+ rc = SQLITE_NOMEM;
+ goto error_out;
+ }
+ sqlite3ValueSetStr(p, 0, "", 0, SQLITE_STATIC);
+ pSession->pZeroBlob = p;
+ }
+ }
+
/* Calculate the hash-key for this change. If the primary key of the row
** includes a NULL value, exit early. Such changes are ignored by the
** session module. */
@@ -177912,6 +183599,9 @@ static void sessionPreupdateOneChange(
/* If an error has occurred, mark the session object as failed. */
error_out:
+ if( pTab->bStat1 ){
+ pSession->hook = stat1.hook;
+ }
if( rc!=SQLITE_OK ){
pSession->rc = rc;
}
@@ -178248,7 +183938,6 @@ SQLITE_API int sqlite3session_diff(
if( abPK[i] ) bHasPk = 1;
}
}
-
}
sqlite3_free((char*)azCol);
if( bMismatch ){
@@ -178374,6 +184063,7 @@ SQLITE_API void sqlite3session_delete(sqlite3_session *pSession){
}
}
sqlite3_mutex_leave(sqlite3_db_mutex(db));
+ sqlite3ValueFree(pSession->pZeroBlob);
/* Delete all attached table objects. And the contents of their
** associated hash-tables. */
@@ -178841,28 +184531,42 @@ static int sessionSelectStmt(
sqlite3_stmt **ppStmt /* OUT: Prepared SELECT statement */
){
int rc = SQLITE_OK;
- int i;
- const char *zSep = "";
- SessionBuffer buf = {0, 0, 0};
+ char *zSql = 0;
+ int nSql = -1;
- sessionAppendStr(&buf, "SELECT * FROM ", &rc);
- sessionAppendIdent(&buf, zDb, &rc);
- sessionAppendStr(&buf, ".", &rc);
- sessionAppendIdent(&buf, zTab, &rc);
- sessionAppendStr(&buf, " WHERE ", &rc);
- for(i=0; i<nCol; i++){
- if( abPK[i] ){
- sessionAppendStr(&buf, zSep, &rc);
- sessionAppendIdent(&buf, azCol[i], &rc);
- sessionAppendStr(&buf, " = ?", &rc);
- sessionAppendInteger(&buf, i+1, &rc);
- zSep = " AND ";
+ if( 0==sqlite3_stricmp("sqlite_stat1", zTab) ){
+ zSql = sqlite3_mprintf(
+ "SELECT tbl, ?2, stat FROM %Q.sqlite_stat1 WHERE tbl IS ?1 AND "
+ "idx IS (CASE WHEN ?2=X'' THEN NULL ELSE ?2 END)", zDb
+ );
+ if( zSql==0 ) rc = SQLITE_NOMEM;
+ }else{
+ int i;
+ const char *zSep = "";
+ SessionBuffer buf = {0, 0, 0};
+
+ sessionAppendStr(&buf, "SELECT * FROM ", &rc);
+ sessionAppendIdent(&buf, zDb, &rc);
+ sessionAppendStr(&buf, ".", &rc);
+ sessionAppendIdent(&buf, zTab, &rc);
+ sessionAppendStr(&buf, " WHERE ", &rc);
+ for(i=0; i<nCol; i++){
+ if( abPK[i] ){
+ sessionAppendStr(&buf, zSep, &rc);
+ sessionAppendIdent(&buf, azCol[i], &rc);
+ sessionAppendStr(&buf, " IS ?", &rc);
+ sessionAppendInteger(&buf, i+1, &rc);
+ zSep = " AND ";
+ }
}
+ zSql = (char*)buf.aBuf;
+ nSql = buf.nBuf;
}
+
if( rc==SQLITE_OK ){
- rc = sqlite3_prepare_v2(db, (char *)buf.aBuf, buf.nBuf, ppStmt, 0);
+ rc = sqlite3_prepare_v2(db, zSql, nSql, ppStmt, 0);
}
- sqlite3_free(buf.aBuf);
+ sqlite3_free(zSql);
return rc;
}
@@ -179245,7 +184949,7 @@ SQLITE_API int sqlite3changeset_start_strm(
** object and the buffer is full, discard some data to free up space.
*/
static void sessionDiscardData(SessionInput *pIn){
- if( pIn->bEof && pIn->xInput && pIn->iNext>=SESSIONS_STRM_CHUNK_SIZE ){
+ if( pIn->xInput && pIn->iNext>=SESSIONS_STRM_CHUNK_SIZE ){
int nMove = pIn->buf.nBuf - pIn->iNext;
assert( nMove>=0 );
if( nMove>0 ){
@@ -179373,13 +185077,16 @@ static int sessionReadRecord(
if( abPK && abPK[i]==0 ) continue;
rc = sessionInputBuffer(pIn, 9);
if( rc==SQLITE_OK ){
- eType = pIn->aData[pIn->iNext++];
- }
-
- assert( apOut[i]==0 );
- if( eType ){
- apOut[i] = sqlite3ValueNew(0);
- if( !apOut[i] ) rc = SQLITE_NOMEM;
+ if( pIn->iNext>=pIn->nData ){
+ rc = SQLITE_CORRUPT_BKPT;
+ }else{
+ eType = pIn->aData[pIn->iNext++];
+ assert( apOut[i]==0 );
+ if( eType ){
+ apOut[i] = sqlite3ValueNew(0);
+ if( !apOut[i] ) rc = SQLITE_NOMEM;
+ }
+ }
}
if( rc==SQLITE_OK ){
@@ -179389,10 +185096,14 @@ static int sessionReadRecord(
pIn->iNext += sessionVarintGet(aVal, &nByte);
rc = sessionInputBuffer(pIn, nByte);
if( rc==SQLITE_OK ){
- u8 enc = (eType==SQLITE_TEXT ? SQLITE_UTF8 : 0);
- rc = sessionValueSetStr(apOut[i],&pIn->aData[pIn->iNext],nByte,enc);
+ if( nByte<0 || nByte>pIn->nData-pIn->iNext ){
+ rc = SQLITE_CORRUPT_BKPT;
+ }else{
+ u8 enc = (eType==SQLITE_TEXT ? SQLITE_UTF8 : 0);
+ rc = sessionValueSetStr(apOut[i],&pIn->aData[pIn->iNext],nByte,enc);
+ pIn->iNext += nByte;
+ }
}
- pIn->iNext += nByte;
}
if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){
sqlite3_int64 v = sessionGetI64(aVal);
@@ -179432,8 +185143,19 @@ static int sessionChangesetBufferTblhdr(SessionInput *pIn, int *pnByte){
rc = sessionInputBuffer(pIn, 9);
if( rc==SQLITE_OK ){
nRead += sessionVarintGet(&pIn->aData[pIn->iNext + nRead], &nCol);
- rc = sessionInputBuffer(pIn, nRead+nCol+100);
- nRead += nCol;
+ /* The hard upper limit for the number of columns in an SQLite
+ ** database table is, according to sqliteLimit.h, 32676. So
+ ** consider any table-header that purports to have more than 65536
+ ** columns to be corrupt. This is convenient because otherwise,
+ ** if the (nCol>65536) condition below were omitted, a sufficiently
+ ** large value for nCol may cause nRead to wrap around and become
+ ** negative. Leading to a crash. */
+ if( nCol<0 || nCol>65536 ){
+ rc = SQLITE_CORRUPT_BKPT;
+ }else{
+ rc = sessionInputBuffer(pIn, nRead+nCol+100);
+ nRead += nCol;
+ }
}
while( rc==SQLITE_OK ){
@@ -179510,11 +185232,15 @@ static int sessionChangesetReadTblhdr(sqlite3_changeset_iter *p){
int nByte;
int nVarint;
nVarint = sessionVarintGet(&p->in.aData[p->in.iNext], &p->nCol);
- nCopy -= nVarint;
- p->in.iNext += nVarint;
- nByte = p->nCol * sizeof(sqlite3_value*) * 2 + nCopy;
- p->tblhdr.nBuf = 0;
- sessionBufferGrow(&p->tblhdr, nByte, &rc);
+ if( p->nCol>0 ){
+ nCopy -= nVarint;
+ p->in.iNext += nVarint;
+ nByte = p->nCol * sizeof(sqlite3_value*) * 2 + nCopy;
+ p->tblhdr.nBuf = 0;
+ sessionBufferGrow(&p->tblhdr, nByte, &rc);
+ }else{
+ rc = SQLITE_CORRUPT_BKPT;
+ }
}
if( rc==SQLITE_OK ){
@@ -179549,7 +185275,8 @@ static int sessionChangesetReadTblhdr(sqlite3_changeset_iter *p){
static int sessionChangesetNext(
sqlite3_changeset_iter *p, /* Changeset iterator */
u8 **paRec, /* If non-NULL, store record pointer here */
- int *pnRec /* If non-NULL, store size of record here */
+ int *pnRec, /* If non-NULL, store size of record here */
+ int *pbNew /* If non-NULL, true if new table */
){
int i;
u8 op;
@@ -179584,6 +185311,7 @@ static int sessionChangesetNext(
op = p->in.aData[p->in.iNext++];
while( op=='T' || op=='P' ){
+ if( pbNew ) *pbNew = 1;
p->bPatchset = (op=='P');
if( sessionChangesetReadTblhdr(p) ) return p->rc;
if( (p->rc = sessionInputBuffer(&p->in, 2)) ) return p->rc;
@@ -179592,6 +185320,13 @@ static int sessionChangesetNext(
op = p->in.aData[p->in.iNext++];
}
+ if( p->zTab==0 ){
+ /* The first record in the changeset is not a table header. Must be a
+ ** corrupt changeset. */
+ assert( p->in.iNext==1 );
+ return (p->rc = SQLITE_CORRUPT_BKPT);
+ }
+
p->op = op;
p->bIndirect = p->in.aData[p->in.iNext++];
if( p->op!=SQLITE_UPDATE && p->op!=SQLITE_DELETE && p->op!=SQLITE_INSERT ){
@@ -179634,9 +185369,9 @@ static int sessionChangesetNext(
** new.* to old.*, to accommodate the code that reads these arrays. */
for(i=0; i<p->nCol; i++){
assert( p->apValue[i]==0 );
- assert( p->abPK[i]==0 || p->apValue[i+p->nCol] );
if( p->abPK[i] ){
p->apValue[i] = p->apValue[i+p->nCol];
+ if( p->apValue[i]==0 ) return (p->rc = SQLITE_CORRUPT_BKPT);
p->apValue[i+p->nCol] = 0;
}
}
@@ -179655,7 +185390,7 @@ static int sessionChangesetNext(
** callback by changeset_apply().
*/
SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *p){
- return sessionChangesetNext(p, 0, 0);
+ return sessionChangesetNext(p, 0, 0, 0);
}
/*
@@ -180031,9 +185766,11 @@ struct SessionApplyCtx {
int nCol; /* Size of azCol[] and abPK[] arrays */
const char **azCol; /* Array of column names */
u8 *abPK; /* Boolean array - true if column is in PK */
-
+ int bStat1; /* True if table is sqlite_stat1 */
int bDeferConstraints; /* True to defer constraints */
SessionBuffer constraints; /* Deferred constraints are stored here */
+ SessionBuffer rebase; /* Rebase information (if any) here */
+ int bRebaseStarted; /* If table header is already in rebase */
};
/*
@@ -180201,6 +185938,7 @@ static int sessionUpdateRow(
return rc;
}
+
/*
** Formulate and prepare an SQL statement to query table zTab by primary
** key. Assuming the following table structure:
@@ -180262,6 +186000,46 @@ static int sessionInsertRow(
return rc;
}
+static int sessionPrepare(sqlite3 *db, sqlite3_stmt **pp, const char *zSql){
+ return sqlite3_prepare_v2(db, zSql, -1, pp, 0);
+}
+
+/*
+** Prepare statements for applying changes to the sqlite_stat1 table.
+** These are similar to those created by sessionSelectRow(),
+** sessionInsertRow(), sessionUpdateRow() and sessionDeleteRow() for
+** other tables.
+*/
+static int sessionStat1Sql(sqlite3 *db, SessionApplyCtx *p){
+ int rc = sessionSelectRow(db, "sqlite_stat1", p);
+ if( rc==SQLITE_OK ){
+ rc = sessionPrepare(db, &p->pInsert,
+ "INSERT INTO main.sqlite_stat1 VALUES(?1, "
+ "CASE WHEN length(?2)=0 AND typeof(?2)='blob' THEN NULL ELSE ?2 END, "
+ "?3)"
+ );
+ }
+ if( rc==SQLITE_OK ){
+ rc = sessionPrepare(db, &p->pUpdate,
+ "UPDATE main.sqlite_stat1 SET "
+ "tbl = CASE WHEN ?2 THEN ?3 ELSE tbl END, "
+ "idx = CASE WHEN ?5 THEN ?6 ELSE idx END, "
+ "stat = CASE WHEN ?8 THEN ?9 ELSE stat END "
+ "WHERE tbl=?1 AND idx IS "
+ "CASE WHEN length(?4)=0 AND typeof(?4)='blob' THEN NULL ELSE ?4 END "
+ "AND (?10 OR ?8=0 OR stat IS ?7)"
+ );
+ }
+ if( rc==SQLITE_OK ){
+ rc = sessionPrepare(db, &p->pDelete,
+ "DELETE FROM main.sqlite_stat1 WHERE tbl=?1 AND idx IS "
+ "CASE WHEN length(?2)=0 AND typeof(?2)='blob' THEN NULL ELSE ?2 END "
+ "AND (?4 OR stat IS ?3)"
+ );
+ }
+ return rc;
+}
+
/*
** A wrapper around sqlite3_bind_value() that detects an extra problem.
** See comments in the body of this function for details.
@@ -180319,7 +186097,13 @@ static int sessionBindRow(
if( !abPK || abPK[i] ){
sqlite3_value *pVal;
(void)xValue(pIter, i, &pVal);
- rc = sessionBindValue(pStmt, i+1, pVal);
+ if( pVal==0 ){
+ /* The value in the changeset was "undefined". This indicates a
+ ** corrupt changeset blob. */
+ rc = SQLITE_CORRUPT_BKPT;
+ }else{
+ rc = sessionBindValue(pStmt, i+1, pVal);
+ }
}
}
return rc;
@@ -180331,7 +186115,7 @@ static int sessionBindRow(
** iterator pIter points to to the SELECT and attempts to seek to the table
** entry. If a row is found, the SELECT statement left pointing at the row
** and SQLITE_ROW is returned. Otherwise, if no row is found and no error
-** has occurred, the statement is reset and SQLITE_OK is returned. If an
+** has occured, the statement is reset and SQLITE_OK is returned. If an
** error occurs, the statement is reset and an SQLite error code is returned.
**
** If this function returns SQLITE_ROW, the caller must eventually reset()
@@ -180368,6 +186152,54 @@ static int sessionSeekToRow(
}
/*
+** This function is called from within sqlite3changset_apply_v2() when
+** a conflict is encountered and resolved using conflict resolution
+** mode eType (either SQLITE_CHANGESET_OMIT or SQLITE_CHANGESET_REPLACE)..
+** It adds a conflict resolution record to the buffer in
+** SessionApplyCtx.rebase, which will eventually be returned to the caller
+** of apply_v2() as the "rebase" buffer.
+**
+** Return SQLITE_OK if successful, or an SQLite error code otherwise.
+*/
+static int sessionRebaseAdd(
+ SessionApplyCtx *p, /* Apply context */
+ int eType, /* Conflict resolution (OMIT or REPLACE) */
+ sqlite3_changeset_iter *pIter /* Iterator pointing at current change */
+){
+ int rc = SQLITE_OK;
+ int i;
+ int eOp = pIter->op;
+ if( p->bRebaseStarted==0 ){
+ /* Append a table-header to the rebase buffer */
+ const char *zTab = pIter->zTab;
+ sessionAppendByte(&p->rebase, 'T', &rc);
+ sessionAppendVarint(&p->rebase, p->nCol, &rc);
+ sessionAppendBlob(&p->rebase, p->abPK, p->nCol, &rc);
+ sessionAppendBlob(&p->rebase, (u8*)zTab, (int)strlen(zTab)+1, &rc);
+ p->bRebaseStarted = 1;
+ }
+
+ assert( eType==SQLITE_CHANGESET_REPLACE||eType==SQLITE_CHANGESET_OMIT );
+ assert( eOp==SQLITE_DELETE || eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE );
+
+ sessionAppendByte(&p->rebase,
+ (eOp==SQLITE_DELETE ? SQLITE_DELETE : SQLITE_INSERT), &rc
+ );
+ sessionAppendByte(&p->rebase, (eType==SQLITE_CHANGESET_REPLACE), &rc);
+ for(i=0; i<p->nCol; i++){
+ sqlite3_value *pVal = 0;
+ if( eOp==SQLITE_DELETE || (eOp==SQLITE_UPDATE && p->abPK[i]) ){
+ sqlite3changeset_old(pIter, i, &pVal);
+ }else{
+ sqlite3changeset_new(pIter, i, &pVal);
+ }
+ sessionAppendValue(&p->rebase, pVal, &rc);
+ }
+
+ return rc;
+}
+
+/*
** Invoke the conflict handler for the change that the changeset iterator
** currently points to.
**
@@ -180442,7 +186274,7 @@ static int sessionConflictHandler(
u8 *aBlob = &pIter->in.aData[pIter->in.iCurrent];
int nBlob = pIter->in.iNext - pIter->in.iCurrent;
sessionAppendBlob(&p->constraints, aBlob, nBlob, &rc);
- res = SQLITE_CHANGESET_OMIT;
+ return SQLITE_OK;
}else{
/* No other row with the new.* primary key. */
res = xConflict(pCtx, eType+1, pIter);
@@ -180468,6 +186300,9 @@ static int sessionConflictHandler(
rc = SQLITE_MISUSE;
break;
}
+ if( rc==SQLITE_OK ){
+ rc = sessionRebaseAdd(p, res, pIter);
+ }
}
return rc;
@@ -180592,11 +186427,25 @@ static int sessionApplyOneOp(
}else{
assert( op==SQLITE_INSERT );
- rc = sessionBindRow(pIter, sqlite3changeset_new, nCol, 0, p->pInsert);
- if( rc!=SQLITE_OK ) return rc;
+ if( p->bStat1 ){
+ /* Check if there is a conflicting row. For sqlite_stat1, this needs
+ ** to be done using a SELECT, as there is no PRIMARY KEY in the
+ ** database schema to throw an exception if a duplicate is inserted. */
+ rc = sessionSeekToRow(p->db, pIter, p->abPK, p->pSelect);
+ if( rc==SQLITE_ROW ){
+ rc = SQLITE_CONSTRAINT;
+ sqlite3_reset(p->pSelect);
+ }
+ }
+
+ if( rc==SQLITE_OK ){
+ rc = sessionBindRow(pIter, sqlite3changeset_new, nCol, 0, p->pInsert);
+ if( rc!=SQLITE_OK ) return rc;
+
+ sqlite3_step(p->pInsert);
+ rc = sqlite3_reset(p->pInsert);
+ }
- sqlite3_step(p->pInsert);
- rc = sqlite3_reset(p->pInsert);
if( (rc&0xff)==SQLITE_CONSTRAINT ){
rc = sessionConflictHandler(
SQLITE_CHANGESET_CONFLICT, p, pIter, xConflict, pCtx, pbReplace
@@ -180629,42 +186478,42 @@ static int sessionApplyOneWithRetry(
int rc;
rc = sessionApplyOneOp(pIter, pApply, xConflict, pCtx, &bReplace, &bRetry);
- assert( rc==SQLITE_OK || (bRetry==0 && bReplace==0) );
-
- /* If the bRetry flag is set, the change has not been applied due to an
- ** SQLITE_CHANGESET_DATA problem (i.e. this is an UPDATE or DELETE and
- ** a row with the correct PK is present in the db, but one or more other
- ** fields do not contain the expected values) and the conflict handler
- ** returned SQLITE_CHANGESET_REPLACE. In this case retry the operation,
- ** but pass NULL as the final argument so that sessionApplyOneOp() ignores
- ** the SQLITE_CHANGESET_DATA problem. */
- if( bRetry ){
- assert( pIter->op==SQLITE_UPDATE || pIter->op==SQLITE_DELETE );
- rc = sessionApplyOneOp(pIter, pApply, xConflict, pCtx, 0, 0);
- }
-
- /* If the bReplace flag is set, the change is an INSERT that has not
- ** been performed because the database already contains a row with the
- ** specified primary key and the conflict handler returned
- ** SQLITE_CHANGESET_REPLACE. In this case remove the conflicting row
- ** before reattempting the INSERT. */
- else if( bReplace ){
- assert( pIter->op==SQLITE_INSERT );
- rc = sqlite3_exec(db, "SAVEPOINT replace_op", 0, 0, 0);
- if( rc==SQLITE_OK ){
- rc = sessionBindRow(pIter,
- sqlite3changeset_new, pApply->nCol, pApply->abPK, pApply->pDelete);
- sqlite3_bind_int(pApply->pDelete, pApply->nCol+1, 1);
- }
- if( rc==SQLITE_OK ){
- sqlite3_step(pApply->pDelete);
- rc = sqlite3_reset(pApply->pDelete);
- }
- if( rc==SQLITE_OK ){
+ if( rc==SQLITE_OK ){
+ /* If the bRetry flag is set, the change has not been applied due to an
+ ** SQLITE_CHANGESET_DATA problem (i.e. this is an UPDATE or DELETE and
+ ** a row with the correct PK is present in the db, but one or more other
+ ** fields do not contain the expected values) and the conflict handler
+ ** returned SQLITE_CHANGESET_REPLACE. In this case retry the operation,
+ ** but pass NULL as the final argument so that sessionApplyOneOp() ignores
+ ** the SQLITE_CHANGESET_DATA problem. */
+ if( bRetry ){
+ assert( pIter->op==SQLITE_UPDATE || pIter->op==SQLITE_DELETE );
rc = sessionApplyOneOp(pIter, pApply, xConflict, pCtx, 0, 0);
}
- if( rc==SQLITE_OK ){
- rc = sqlite3_exec(db, "RELEASE replace_op", 0, 0, 0);
+
+ /* If the bReplace flag is set, the change is an INSERT that has not
+ ** been performed because the database already contains a row with the
+ ** specified primary key and the conflict handler returned
+ ** SQLITE_CHANGESET_REPLACE. In this case remove the conflicting row
+ ** before reattempting the INSERT. */
+ else if( bReplace ){
+ assert( pIter->op==SQLITE_INSERT );
+ rc = sqlite3_exec(db, "SAVEPOINT replace_op", 0, 0, 0);
+ if( rc==SQLITE_OK ){
+ rc = sessionBindRow(pIter,
+ sqlite3changeset_new, pApply->nCol, pApply->abPK, pApply->pDelete);
+ sqlite3_bind_int(pApply->pDelete, pApply->nCol+1, 1);
+ }
+ if( rc==SQLITE_OK ){
+ sqlite3_step(pApply->pDelete);
+ rc = sqlite3_reset(pApply->pDelete);
+ }
+ if( rc==SQLITE_OK ){
+ rc = sessionApplyOneOp(pIter, pApply, xConflict, pCtx, 0, 0);
+ }
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_exec(db, "RELEASE replace_op", 0, 0, 0);
+ }
}
}
@@ -180740,10 +186589,12 @@ static int sessionChangesetApply(
int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */
sqlite3_changeset_iter *p /* Handle describing change and conflict */
),
- void *pCtx /* First argument passed to xConflict */
+ void *pCtx, /* First argument passed to xConflict */
+ void **ppRebase, int *pnRebase, /* OUT: Rebase information */
+ int flags /* SESSION_APPLY_XXX flags */
){
int schemaMismatch = 0;
- int rc; /* Return code */
+ int rc = SQLITE_OK; /* Return code */
const char *zTab = 0; /* Name of current table */
int nTab = 0; /* Result of sqlite3Strlen30(zTab) */
SessionApplyCtx sApply; /* changeset_apply() context object */
@@ -180754,7 +186605,9 @@ static int sessionChangesetApply(
pIter->in.bNoDiscard = 1;
memset(&sApply, 0, sizeof(sApply));
sqlite3_mutex_enter(sqlite3_db_mutex(db));
- rc = sqlite3_exec(db, "SAVEPOINT changeset_apply", 0, 0, 0);
+ if( (flags & SQLITE_CHANGESETAPPLY_NOSAVEPOINT)==0 ){
+ rc = sqlite3_exec(db, "SAVEPOINT changeset_apply", 0, 0, 0);
+ }
if( rc==SQLITE_OK ){
rc = sqlite3_exec(db, "PRAGMA defer_foreign_keys = 1", 0, 0, 0);
}
@@ -180778,9 +186631,18 @@ static int sessionChangesetApply(
sqlite3_finalize(sApply.pUpdate);
sqlite3_finalize(sApply.pInsert);
sqlite3_finalize(sApply.pSelect);
- memset(&sApply, 0, sizeof(sApply));
sApply.db = db;
+ sApply.pDelete = 0;
+ sApply.pUpdate = 0;
+ sApply.pInsert = 0;
+ sApply.pSelect = 0;
+ sApply.nCol = 0;
+ sApply.azCol = 0;
+ sApply.abPK = 0;
+ sApply.bStat1 = 0;
sApply.bDeferConstraints = 1;
+ sApply.bRebaseStarted = 0;
+ memset(&sApply.constraints, 0, sizeof(SessionBuffer));
/* If an xFilter() callback was specified, invoke it now. If the
** xFilter callback returns zero, skip this table. If it returns
@@ -180829,12 +186691,20 @@ static int sessionChangesetApply(
}
else{
sApply.nCol = nCol;
- if((rc = sessionSelectRow(db, zTab, &sApply))
- || (rc = sessionUpdateRow(db, zTab, &sApply))
- || (rc = sessionDeleteRow(db, zTab, &sApply))
- || (rc = sessionInsertRow(db, zTab, &sApply))
- ){
- break;
+ if( 0==sqlite3_stricmp(zTab, "sqlite_stat1") ){
+ if( (rc = sessionStat1Sql(db, &sApply) ) ){
+ break;
+ }
+ sApply.bStat1 = 1;
+ }else{
+ if((rc = sessionSelectRow(db, zTab, &sApply))
+ || (rc = sessionUpdateRow(db, zTab, &sApply))
+ || (rc = sessionDeleteRow(db, zTab, &sApply))
+ || (rc = sessionInsertRow(db, zTab, &sApply))
+ ){
+ break;
+ }
+ sApply.bStat1 = 0;
}
}
nTab = sqlite3Strlen30(zTab);
@@ -180875,24 +186745,63 @@ static int sessionChangesetApply(
}
sqlite3_exec(db, "PRAGMA defer_foreign_keys = 0", 0, 0, 0);
- if( rc==SQLITE_OK ){
- rc = sqlite3_exec(db, "RELEASE changeset_apply", 0, 0, 0);
- }else{
- sqlite3_exec(db, "ROLLBACK TO changeset_apply", 0, 0, 0);
- sqlite3_exec(db, "RELEASE changeset_apply", 0, 0, 0);
+ if( (flags & SQLITE_CHANGESETAPPLY_NOSAVEPOINT)==0 ){
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_exec(db, "RELEASE changeset_apply", 0, 0, 0);
+ }else{
+ sqlite3_exec(db, "ROLLBACK TO changeset_apply", 0, 0, 0);
+ sqlite3_exec(db, "RELEASE changeset_apply", 0, 0, 0);
+ }
}
+ if( rc==SQLITE_OK && bPatchset==0 && ppRebase && pnRebase ){
+ *ppRebase = (void*)sApply.rebase.aBuf;
+ *pnRebase = sApply.rebase.nBuf;
+ sApply.rebase.aBuf = 0;
+ }
sqlite3_finalize(sApply.pInsert);
sqlite3_finalize(sApply.pDelete);
sqlite3_finalize(sApply.pUpdate);
sqlite3_finalize(sApply.pSelect);
sqlite3_free((char*)sApply.azCol); /* cast works around VC++ bug */
sqlite3_free((char*)sApply.constraints.aBuf);
+ sqlite3_free((char*)sApply.rebase.aBuf);
sqlite3_mutex_leave(sqlite3_db_mutex(db));
return rc;
}
/*
+** Apply the changeset passed via pChangeset/nChangeset to the main
+** database attached to handle "db".
+*/
+SQLITE_API int sqlite3changeset_apply_v2(
+ sqlite3 *db, /* Apply change to "main" db of this handle */
+ int nChangeset, /* Size of changeset in bytes */
+ void *pChangeset, /* Changeset blob */
+ int(*xFilter)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ const char *zTab /* Table name */
+ ),
+ int(*xConflict)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */
+ sqlite3_changeset_iter *p /* Handle describing change and conflict */
+ ),
+ void *pCtx, /* First argument passed to xConflict */
+ void **ppRebase, int *pnRebase,
+ int flags
+){
+ sqlite3_changeset_iter *pIter; /* Iterator to skip through changeset */
+ int rc = sqlite3changeset_start(&pIter, nChangeset, pChangeset);
+ if( rc==SQLITE_OK ){
+ rc = sessionChangesetApply(
+ db, pIter, xFilter, xConflict, pCtx, ppRebase, pnRebase, flags
+ );
+ }
+ return rc;
+}
+
+/*
** Apply the changeset passed via pChangeset/nChangeset to the main database
** attached to handle "db". Invoke the supplied conflict handler callback
** to resolve any conflicts encountered while applying the change.
@@ -180912,12 +186821,9 @@ SQLITE_API int sqlite3changeset_apply(
),
void *pCtx /* First argument passed to xConflict */
){
- sqlite3_changeset_iter *pIter; /* Iterator to skip through changeset */
- int rc = sqlite3changeset_start(&pIter, nChangeset, pChangeset);
- if( rc==SQLITE_OK ){
- rc = sessionChangesetApply(db, pIter, xFilter, xConflict, pCtx);
- }
- return rc;
+ return sqlite3changeset_apply_v2(
+ db, nChangeset, pChangeset, xFilter, xConflict, pCtx, 0, 0, 0
+ );
}
/*
@@ -180925,7 +186831,7 @@ SQLITE_API int sqlite3changeset_apply(
** attached to handle "db". Invoke the supplied conflict handler callback
** to resolve any conflicts encountered while applying the change.
*/
-SQLITE_API int sqlite3changeset_apply_strm(
+SQLITE_API int sqlite3changeset_apply_v2_strm(
sqlite3 *db, /* Apply change to "main" db of this handle */
int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */
void *pIn, /* First arg for xInput */
@@ -180938,15 +186844,38 @@ SQLITE_API int sqlite3changeset_apply_strm(
int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */
sqlite3_changeset_iter *p /* Handle describing change and conflict */
),
- void *pCtx /* First argument passed to xConflict */
+ void *pCtx, /* First argument passed to xConflict */
+ void **ppRebase, int *pnRebase,
+ int flags
){
sqlite3_changeset_iter *pIter; /* Iterator to skip through changeset */
int rc = sqlite3changeset_start_strm(&pIter, xInput, pIn);
if( rc==SQLITE_OK ){
- rc = sessionChangesetApply(db, pIter, xFilter, xConflict, pCtx);
+ rc = sessionChangesetApply(
+ db, pIter, xFilter, xConflict, pCtx, ppRebase, pnRebase, flags
+ );
}
return rc;
}
+SQLITE_API int sqlite3changeset_apply_strm(
+ sqlite3 *db, /* Apply change to "main" db of this handle */
+ int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */
+ void *pIn, /* First arg for xInput */
+ int(*xFilter)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ const char *zTab /* Table name */
+ ),
+ int(*xConflict)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */
+ sqlite3_changeset_iter *p /* Handle describing change and conflict */
+ ),
+ void *pCtx /* First argument passed to xConflict */
+){
+ return sqlite3changeset_apply_v2_strm(
+ db, xInput, pIn, xFilter, xConflict, pCtx, 0, 0, 0
+ );
+}
/*
** sqlite3_changegroup handle.
@@ -180964,6 +186893,7 @@ struct sqlite3_changegroup {
*/
static int sessionChangeMerge(
SessionTable *pTab, /* Table structure */
+ int bRebase, /* True for a rebase hash-table */
int bPatchset, /* True for patchsets */
SessionChange *pExist, /* Existing change */
int op2, /* Second change operation */
@@ -180973,6 +186903,7 @@ static int sessionChangeMerge(
SessionChange **ppNew /* OUT: Merged change */
){
SessionChange *pNew = 0;
+ int rc = SQLITE_OK;
if( !pExist ){
pNew = (SessionChange *)sqlite3_malloc(sizeof(SessionChange) + nRec);
@@ -180982,9 +186913,66 @@ static int sessionChangeMerge(
memset(pNew, 0, sizeof(SessionChange));
pNew->op = op2;
pNew->bIndirect = bIndirect;
- pNew->nRecord = nRec;
pNew->aRecord = (u8*)&pNew[1];
- memcpy(pNew->aRecord, aRec, nRec);
+ if( bIndirect==0 || bRebase==0 ){
+ pNew->nRecord = nRec;
+ memcpy(pNew->aRecord, aRec, nRec);
+ }else{
+ int i;
+ u8 *pIn = aRec;
+ u8 *pOut = pNew->aRecord;
+ for(i=0; i<pTab->nCol; i++){
+ int nIn = sessionSerialLen(pIn);
+ if( *pIn==0 ){
+ *pOut++ = 0;
+ }else if( pTab->abPK[i]==0 ){
+ *pOut++ = 0xFF;
+ }else{
+ memcpy(pOut, pIn, nIn);
+ pOut += nIn;
+ }
+ pIn += nIn;
+ }
+ pNew->nRecord = pOut - pNew->aRecord;
+ }
+ }else if( bRebase ){
+ if( pExist->op==SQLITE_DELETE && pExist->bIndirect ){
+ *ppNew = pExist;
+ }else{
+ int nByte = nRec + pExist->nRecord + sizeof(SessionChange);
+ pNew = (SessionChange*)sqlite3_malloc(nByte);
+ if( pNew==0 ){
+ rc = SQLITE_NOMEM;
+ }else{
+ int i;
+ u8 *a1 = pExist->aRecord;
+ u8 *a2 = aRec;
+ u8 *pOut;
+
+ memset(pNew, 0, nByte);
+ pNew->bIndirect = bIndirect || pExist->bIndirect;
+ pNew->op = op2;
+ pOut = pNew->aRecord = (u8*)&pNew[1];
+
+ for(i=0; i<pTab->nCol; i++){
+ int n1 = sessionSerialLen(a1);
+ int n2 = sessionSerialLen(a2);
+ if( *a1==0xFF || (pTab->abPK[i]==0 && bIndirect) ){
+ *pOut++ = 0xFF;
+ }else if( *a2==0 ){
+ memcpy(pOut, a1, n1);
+ pOut += n1;
+ }else{
+ memcpy(pOut, a2, n2);
+ pOut += n2;
+ }
+ a1 += n1;
+ a2 += n2;
+ }
+ pNew->nRecord = pOut - pNew->aRecord;
+ }
+ sqlite3_free(pExist);
+ }
}else{
int op1 = pExist->op;
@@ -181078,7 +187066,7 @@ static int sessionChangeMerge(
}
*ppNew = pNew;
- return SQLITE_OK;
+ return rc;
}
/*
@@ -181087,15 +187075,15 @@ static int sessionChangeMerge(
*/
static int sessionChangesetToHash(
sqlite3_changeset_iter *pIter, /* Iterator to read from */
- sqlite3_changegroup *pGrp /* Changegroup object to add changeset to */
+ sqlite3_changegroup *pGrp, /* Changegroup object to add changeset to */
+ int bRebase /* True if hash table is for rebasing */
){
u8 *aRec;
int nRec;
int rc = SQLITE_OK;
SessionTable *pTab = 0;
-
- while( SQLITE_ROW==sessionChangesetNext(pIter, &aRec, &nRec) ){
+ while( SQLITE_ROW==sessionChangesetNext(pIter, &aRec, &nRec, 0) ){
const char *zNew;
int nCol;
int op;
@@ -181175,7 +187163,7 @@ static int sessionChangesetToHash(
}
}
- rc = sessionChangeMerge(pTab,
+ rc = sessionChangeMerge(pTab, bRebase,
pIter->bPatchset, pExist, op, bIndirect, aRec, nRec, &pChange
);
if( rc ) break;
@@ -181283,7 +187271,7 @@ SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup *pGrp, int nData, void
rc = sqlite3changeset_start(&pIter, nData, pData);
if( rc==SQLITE_OK ){
- rc = sessionChangesetToHash(pIter, pGrp);
+ rc = sessionChangesetToHash(pIter, pGrp, 0);
}
sqlite3changeset_finalize(pIter);
return rc;
@@ -181314,7 +187302,7 @@ SQLITE_API int sqlite3changegroup_add_strm(
rc = sqlite3changeset_start_strm(&pIter, xInput, pIn);
if( rc==SQLITE_OK ){
- rc = sessionChangesetToHash(pIter, pGrp);
+ rc = sessionChangesetToHash(pIter, pGrp, 0);
}
sqlite3changeset_finalize(pIter);
return rc;
@@ -181399,6 +187387,349 @@ SQLITE_API int sqlite3changeset_concat_strm(
return rc;
}
+/*
+** Changeset rebaser handle.
+*/
+struct sqlite3_rebaser {
+ sqlite3_changegroup grp; /* Hash table */
+};
+
+/*
+** Buffers a1 and a2 must both contain a sessions module record nCol
+** fields in size. This function appends an nCol sessions module
+** record to buffer pBuf that is a copy of a1, except that for
+** each field that is undefined in a1[], swap in the field from a2[].
+*/
+static void sessionAppendRecordMerge(
+ SessionBuffer *pBuf, /* Buffer to append to */
+ int nCol, /* Number of columns in each record */
+ u8 *a1, int n1, /* Record 1 */
+ u8 *a2, int n2, /* Record 2 */
+ int *pRc /* IN/OUT: error code */
+){
+ sessionBufferGrow(pBuf, n1+n2, pRc);
+ if( *pRc==SQLITE_OK ){
+ int i;
+ u8 *pOut = &pBuf->aBuf[pBuf->nBuf];
+ for(i=0; i<nCol; i++){
+ int nn1 = sessionSerialLen(a1);
+ int nn2 = sessionSerialLen(a2);
+ if( *a1==0 || *a1==0xFF ){
+ memcpy(pOut, a2, nn2);
+ pOut += nn2;
+ }else{
+ memcpy(pOut, a1, nn1);
+ pOut += nn1;
+ }
+ a1 += nn1;
+ a2 += nn2;
+ }
+
+ pBuf->nBuf = pOut-pBuf->aBuf;
+ assert( pBuf->nBuf<=pBuf->nAlloc );
+ }
+}
+
+/*
+** This function is called when rebasing a local UPDATE change against one
+** or more remote UPDATE changes. The aRec/nRec buffer contains the current
+** old.* and new.* records for the change. The rebase buffer (a single
+** record) is in aChange/nChange. The rebased change is appended to buffer
+** pBuf.
+**
+** Rebasing the UPDATE involves:
+**
+** * Removing any changes to fields for which the corresponding field
+** in the rebase buffer is set to "replaced" (type 0xFF). If this
+** means the UPDATE change updates no fields, nothing is appended
+** to the output buffer.
+**
+** * For each field modified by the local change for which the
+** corresponding field in the rebase buffer is not "undefined" (0x00)
+** or "replaced" (0xFF), the old.* value is replaced by the value
+** in the rebase buffer.
+*/
+static void sessionAppendPartialUpdate(
+ SessionBuffer *pBuf, /* Append record here */
+ sqlite3_changeset_iter *pIter, /* Iterator pointed at local change */
+ u8 *aRec, int nRec, /* Local change */
+ u8 *aChange, int nChange, /* Record to rebase against */
+ int *pRc /* IN/OUT: Return Code */
+){
+ sessionBufferGrow(pBuf, 2+nRec+nChange, pRc);
+ if( *pRc==SQLITE_OK ){
+ int bData = 0;
+ u8 *pOut = &pBuf->aBuf[pBuf->nBuf];
+ int i;
+ u8 *a1 = aRec;
+ u8 *a2 = aChange;
+
+ *pOut++ = SQLITE_UPDATE;
+ *pOut++ = pIter->bIndirect;
+ for(i=0; i<pIter->nCol; i++){
+ int n1 = sessionSerialLen(a1);
+ int n2 = sessionSerialLen(a2);
+ if( pIter->abPK[i] || a2[0]==0 ){
+ if( !pIter->abPK[i] ) bData = 1;
+ memcpy(pOut, a1, n1);
+ pOut += n1;
+ }else if( a2[0]!=0xFF ){
+ bData = 1;
+ memcpy(pOut, a2, n2);
+ pOut += n2;
+ }else{
+ *pOut++ = '\0';
+ }
+ a1 += n1;
+ a2 += n2;
+ }
+ if( bData ){
+ a2 = aChange;
+ for(i=0; i<pIter->nCol; i++){
+ int n1 = sessionSerialLen(a1);
+ int n2 = sessionSerialLen(a2);
+ if( pIter->abPK[i] || a2[0]!=0xFF ){
+ memcpy(pOut, a1, n1);
+ pOut += n1;
+ }else{
+ *pOut++ = '\0';
+ }
+ a1 += n1;
+ a2 += n2;
+ }
+ pBuf->nBuf = (pOut - pBuf->aBuf);
+ }
+ }
+}
+
+/*
+** pIter is configured to iterate through a changeset. This function rebases
+** that changeset according to the current configuration of the rebaser
+** object passed as the first argument. If no error occurs and argument xOutput
+** is not NULL, then the changeset is returned to the caller by invoking
+** xOutput zero or more times and SQLITE_OK returned. Or, if xOutput is NULL,
+** then (*ppOut) is set to point to a buffer containing the rebased changeset
+** before this function returns. In this case (*pnOut) is set to the size of
+** the buffer in bytes. It is the responsibility of the caller to eventually
+** free the (*ppOut) buffer using sqlite3_free().
+**
+** If an error occurs, an SQLite error code is returned. If ppOut and
+** pnOut are not NULL, then the two output parameters are set to 0 before
+** returning.
+*/
+static int sessionRebase(
+ sqlite3_rebaser *p, /* Rebaser hash table */
+ sqlite3_changeset_iter *pIter, /* Input data */
+ int (*xOutput)(void *pOut, const void *pData, int nData),
+ void *pOut, /* Context for xOutput callback */
+ int *pnOut, /* OUT: Number of bytes in output changeset */
+ void **ppOut /* OUT: Inverse of pChangeset */
+){
+ int rc = SQLITE_OK;
+ u8 *aRec = 0;
+ int nRec = 0;
+ int bNew = 0;
+ SessionTable *pTab = 0;
+ SessionBuffer sOut = {0,0,0};
+
+ while( SQLITE_ROW==sessionChangesetNext(pIter, &aRec, &nRec, &bNew) ){
+ SessionChange *pChange = 0;
+ int bDone = 0;
+
+ if( bNew ){
+ const char *zTab = pIter->zTab;
+ for(pTab=p->grp.pList; pTab; pTab=pTab->pNext){
+ if( 0==sqlite3_stricmp(pTab->zName, zTab) ) break;
+ }
+ bNew = 0;
+
+ /* A patchset may not be rebased */
+ if( pIter->bPatchset ){
+ rc = SQLITE_ERROR;
+ }
+
+ /* Append a table header to the output for this new table */
+ sessionAppendByte(&sOut, pIter->bPatchset ? 'P' : 'T', &rc);
+ sessionAppendVarint(&sOut, pIter->nCol, &rc);
+ sessionAppendBlob(&sOut, pIter->abPK, pIter->nCol, &rc);
+ sessionAppendBlob(&sOut,(u8*)pIter->zTab,(int)strlen(pIter->zTab)+1,&rc);
+ }
+
+ if( pTab && rc==SQLITE_OK ){
+ int iHash = sessionChangeHash(pTab, 0, aRec, pTab->nChange);
+
+ for(pChange=pTab->apChange[iHash]; pChange; pChange=pChange->pNext){
+ if( sessionChangeEqual(pTab, 0, aRec, 0, pChange->aRecord) ){
+ break;
+ }
+ }
+ }
+
+ if( pChange ){
+ assert( pChange->op==SQLITE_DELETE || pChange->op==SQLITE_INSERT );
+ switch( pIter->op ){
+ case SQLITE_INSERT:
+ if( pChange->op==SQLITE_INSERT ){
+ bDone = 1;
+ if( pChange->bIndirect==0 ){
+ sessionAppendByte(&sOut, SQLITE_UPDATE, &rc);
+ sessionAppendByte(&sOut, pIter->bIndirect, &rc);
+ sessionAppendBlob(&sOut, pChange->aRecord, pChange->nRecord, &rc);
+ sessionAppendBlob(&sOut, aRec, nRec, &rc);
+ }
+ }
+ break;
+
+ case SQLITE_UPDATE:
+ bDone = 1;
+ if( pChange->op==SQLITE_DELETE ){
+ if( pChange->bIndirect==0 ){
+ u8 *pCsr = aRec;
+ sessionSkipRecord(&pCsr, pIter->nCol);
+ sessionAppendByte(&sOut, SQLITE_INSERT, &rc);
+ sessionAppendByte(&sOut, pIter->bIndirect, &rc);
+ sessionAppendRecordMerge(&sOut, pIter->nCol,
+ pCsr, nRec-(pCsr-aRec),
+ pChange->aRecord, pChange->nRecord, &rc
+ );
+ }
+ }else{
+ sessionAppendPartialUpdate(&sOut, pIter,
+ aRec, nRec, pChange->aRecord, pChange->nRecord, &rc
+ );
+ }
+ break;
+
+ default:
+ assert( pIter->op==SQLITE_DELETE );
+ bDone = 1;
+ if( pChange->op==SQLITE_INSERT ){
+ sessionAppendByte(&sOut, SQLITE_DELETE, &rc);
+ sessionAppendByte(&sOut, pIter->bIndirect, &rc);
+ sessionAppendRecordMerge(&sOut, pIter->nCol,
+ pChange->aRecord, pChange->nRecord, aRec, nRec, &rc
+ );
+ }
+ break;
+ }
+ }
+
+ if( bDone==0 ){
+ sessionAppendByte(&sOut, pIter->op, &rc);
+ sessionAppendByte(&sOut, pIter->bIndirect, &rc);
+ sessionAppendBlob(&sOut, aRec, nRec, &rc);
+ }
+ if( rc==SQLITE_OK && xOutput && sOut.nBuf>SESSIONS_STRM_CHUNK_SIZE ){
+ rc = xOutput(pOut, sOut.aBuf, sOut.nBuf);
+ sOut.nBuf = 0;
+ }
+ if( rc ) break;
+ }
+
+ if( rc!=SQLITE_OK ){
+ sqlite3_free(sOut.aBuf);
+ memset(&sOut, 0, sizeof(sOut));
+ }
+
+ if( rc==SQLITE_OK ){
+ if( xOutput ){
+ if( sOut.nBuf>0 ){
+ rc = xOutput(pOut, sOut.aBuf, sOut.nBuf);
+ }
+ }else{
+ *ppOut = (void*)sOut.aBuf;
+ *pnOut = sOut.nBuf;
+ sOut.aBuf = 0;
+ }
+ }
+ sqlite3_free(sOut.aBuf);
+ return rc;
+}
+
+/*
+** Create a new rebaser object.
+*/
+SQLITE_API int sqlite3rebaser_create(sqlite3_rebaser **ppNew){
+ int rc = SQLITE_OK;
+ sqlite3_rebaser *pNew;
+
+ pNew = sqlite3_malloc(sizeof(sqlite3_rebaser));
+ if( pNew==0 ){
+ rc = SQLITE_NOMEM;
+ }else{
+ memset(pNew, 0, sizeof(sqlite3_rebaser));
+ }
+ *ppNew = pNew;
+ return rc;
+}
+
+/*
+** Call this one or more times to configure a rebaser.
+*/
+SQLITE_API int sqlite3rebaser_configure(
+ sqlite3_rebaser *p,
+ int nRebase, const void *pRebase
+){
+ sqlite3_changeset_iter *pIter = 0; /* Iterator opened on pData/nData */
+ int rc; /* Return code */
+ rc = sqlite3changeset_start(&pIter, nRebase, (void*)pRebase);
+ if( rc==SQLITE_OK ){
+ rc = sessionChangesetToHash(pIter, &p->grp, 1);
+ }
+ sqlite3changeset_finalize(pIter);
+ return rc;
+}
+
+/*
+** Rebase a changeset according to current rebaser configuration
+*/
+SQLITE_API int sqlite3rebaser_rebase(
+ sqlite3_rebaser *p,
+ int nIn, const void *pIn,
+ int *pnOut, void **ppOut
+){
+ sqlite3_changeset_iter *pIter = 0; /* Iterator to skip through input */
+ int rc = sqlite3changeset_start(&pIter, nIn, (void*)pIn);
+
+ if( rc==SQLITE_OK ){
+ rc = sessionRebase(p, pIter, 0, 0, pnOut, ppOut);
+ sqlite3changeset_finalize(pIter);
+ }
+
+ return rc;
+}
+
+/*
+** Rebase a changeset according to current rebaser configuration
+*/
+SQLITE_API int sqlite3rebaser_rebase_strm(
+ sqlite3_rebaser *p,
+ int (*xInput)(void *pIn, void *pData, int *pnData),
+ void *pIn,
+ int (*xOutput)(void *pOut, const void *pData, int nData),
+ void *pOut
+){
+ sqlite3_changeset_iter *pIter = 0; /* Iterator to skip through input */
+ int rc = sqlite3changeset_start_strm(&pIter, xInput, pIn);
+
+ if( rc==SQLITE_OK ){
+ rc = sessionRebase(p, pIter, xOutput, pOut, 0, 0);
+ sqlite3changeset_finalize(pIter);
+ }
+
+ return rc;
+}
+
+/*
+** Destroy a rebaser object
+*/
+SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p){
+ if( p ){
+ sessionDeleteTable(p->grp.pList);
+ sqlite3_free(p);
+ }
+}
+
#endif /* SQLITE_ENABLE_SESSION && SQLITE_ENABLE_PREUPDATE_HOOK */
/************** End of sqlite3session.c **************************************/
@@ -183523,7 +189854,7 @@ static int jsonEachColumn(
}
if( p->eType==JSON_ARRAY ){
jsonPrintf(30, &x, "[%d]", p->iRowid);
- }else{
+ }else if( p->eType==JSON_OBJECT ){
jsonPrintf(pThis->n, &x, ".%.*s", pThis->n-2, pThis->u.zJContent+1);
}
}
@@ -185148,6 +191479,8 @@ static Fts5ExprPhrase *sqlite3Fts5ParseTerm(
int bPrefix
);
+static void sqlite3Fts5ParseSetCaret(Fts5ExprPhrase*);
+
static Fts5ExprNearset *sqlite3Fts5ParseNearset(
Fts5Parse*,
Fts5ExprNearset*,
@@ -185228,9 +191561,10 @@ static int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic);
#define FTS5_STRING 9
#define FTS5_LP 10
#define FTS5_RP 11
-#define FTS5_COMMA 12
-#define FTS5_PLUS 13
-#define FTS5_STAR 14
+#define FTS5_CARET 12
+#define FTS5_COMMA 13
+#define FTS5_PLUS 14
+#define FTS5_STAR 15
/*
** 2000-05-29
@@ -185325,27 +191659,30 @@ static int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic);
** zero the stack is dynamically sized using realloc()
** sqlite3Fts5ParserARG_SDECL A static variable declaration for the %extra_argument
** sqlite3Fts5ParserARG_PDECL A parameter declaration for the %extra_argument
+** sqlite3Fts5ParserARG_PARAM Code to pass %extra_argument as a subroutine parameter
** sqlite3Fts5ParserARG_STORE Code to store %extra_argument into fts5yypParser
** sqlite3Fts5ParserARG_FETCH Code to extract %extra_argument from fts5yypParser
+** sqlite3Fts5ParserCTX_* As sqlite3Fts5ParserARG_ except for %extra_context
** fts5YYERRORSYMBOL is the code number of the error symbol. If not
** defined, then do no error processing.
** fts5YYNSTATE the combined number of states.
** fts5YYNRULE the number of rules in the grammar
+** fts5YYNFTS5TOKEN Number of terminal symbols
** fts5YY_MAX_SHIFT Maximum value for shift actions
** fts5YY_MIN_SHIFTREDUCE Minimum value for shift-reduce actions
** fts5YY_MAX_SHIFTREDUCE Maximum value for shift-reduce actions
-** fts5YY_MIN_REDUCE Minimum value for reduce actions
-** fts5YY_MAX_REDUCE Maximum value for reduce actions
** fts5YY_ERROR_ACTION The fts5yy_action[] code for syntax error
** fts5YY_ACCEPT_ACTION The fts5yy_action[] code for accept
** fts5YY_NO_ACTION The fts5yy_action[] code for no-op
+** fts5YY_MIN_REDUCE Minimum value for reduce actions
+** fts5YY_MAX_REDUCE Maximum value for reduce actions
*/
#ifndef INTERFACE
# define INTERFACE 1
#endif
/************* Begin control #defines *****************************************/
#define fts5YYCODETYPE unsigned char
-#define fts5YYNOCODE 28
+#define fts5YYNOCODE 27
#define fts5YYACTIONTYPE unsigned char
#define sqlite3Fts5ParserFTS5TOKENTYPE Fts5Token
typedef union {
@@ -185362,18 +191699,25 @@ typedef union {
#endif
#define sqlite3Fts5ParserARG_SDECL Fts5Parse *pParse;
#define sqlite3Fts5ParserARG_PDECL ,Fts5Parse *pParse
-#define sqlite3Fts5ParserARG_FETCH Fts5Parse *pParse = fts5yypParser->pParse
-#define sqlite3Fts5ParserARG_STORE fts5yypParser->pParse = pParse
-#define fts5YYNSTATE 33
-#define fts5YYNRULE 27
-#define fts5YY_MAX_SHIFT 32
-#define fts5YY_MIN_SHIFTREDUCE 50
-#define fts5YY_MAX_SHIFTREDUCE 76
-#define fts5YY_MIN_REDUCE 77
-#define fts5YY_MAX_REDUCE 103
-#define fts5YY_ERROR_ACTION 104
-#define fts5YY_ACCEPT_ACTION 105
-#define fts5YY_NO_ACTION 106
+#define sqlite3Fts5ParserARG_PARAM ,pParse
+#define sqlite3Fts5ParserARG_FETCH Fts5Parse *pParse=fts5yypParser->pParse;
+#define sqlite3Fts5ParserARG_STORE fts5yypParser->pParse=pParse;
+#define sqlite3Fts5ParserCTX_SDECL
+#define sqlite3Fts5ParserCTX_PDECL
+#define sqlite3Fts5ParserCTX_PARAM
+#define sqlite3Fts5ParserCTX_FETCH
+#define sqlite3Fts5ParserCTX_STORE
+#define fts5YYNSTATE 35
+#define fts5YYNRULE 28
+#define fts5YYNFTS5TOKEN 16
+#define fts5YY_MAX_SHIFT 34
+#define fts5YY_MIN_SHIFTREDUCE 52
+#define fts5YY_MAX_SHIFTREDUCE 79
+#define fts5YY_ERROR_ACTION 80
+#define fts5YY_ACCEPT_ACTION 81
+#define fts5YY_NO_ACTION 82
+#define fts5YY_MIN_REDUCE 83
+#define fts5YY_MAX_REDUCE 110
/************* End control #defines *******************************************/
/* Define the fts5yytestcase() macro to be a no-op if is not already defined
@@ -185403,9 +191747,6 @@ typedef union {
** N between fts5YY_MIN_SHIFTREDUCE Shift to an arbitrary state then
** and fts5YY_MAX_SHIFTREDUCE reduce by rule N-fts5YY_MIN_SHIFTREDUCE.
**
-** N between fts5YY_MIN_REDUCE Reduce by rule N-fts5YY_MIN_REDUCE
-** and fts5YY_MAX_REDUCE
-**
** N == fts5YY_ERROR_ACTION A syntax error has occurred.
**
** N == fts5YY_ACCEPT_ACTION The parser accepts its input.
@@ -185413,25 +191754,22 @@ typedef union {
** N == fts5YY_NO_ACTION No such action. Denotes unused
** slots in the fts5yy_action[] table.
**
+** N between fts5YY_MIN_REDUCE Reduce by rule N-fts5YY_MIN_REDUCE
+** and fts5YY_MAX_REDUCE
+**
** The action table is constructed as a single large table named fts5yy_action[].
** Given state S and lookahead X, the action is computed as either:
**
** (A) N = fts5yy_action[ fts5yy_shift_ofst[S] + X ]
** (B) N = fts5yy_default[S]
**
-** The (A) formula is preferred. The B formula is used instead if:
-** (1) The fts5yy_shift_ofst[S]+X value is out of range, or
-** (2) fts5yy_lookahead[fts5yy_shift_ofst[S]+X] is not equal to X, or
-** (3) fts5yy_shift_ofst[S] equal fts5YY_SHIFT_USE_DFLT.
-** (Implementation note: fts5YY_SHIFT_USE_DFLT is chosen so that
-** fts5YY_SHIFT_USE_DFLT+X will be out of range for all possible lookaheads X.
-** Hence only tests (1) and (2) need to be evaluated.)
+** The (A) formula is preferred. The B formula is used instead if
+** fts5yy_lookahead[fts5yy_shift_ofst[S]+X] is not equal to X.
**
** The formulas above are for computing the action when the lookahead is
** a terminal symbol. If the lookahead is a non-terminal (as occurs after
** a reduce action) then the fts5yy_reduce_ofst[] array is used in place of
-** the fts5yy_shift_ofst[] array and fts5YY_REDUCE_USE_DFLT is used in place of
-** fts5YY_SHIFT_USE_DFLT.
+** the fts5yy_shift_ofst[] array.
**
** The following are the tables generated in this section:
**
@@ -185445,54 +191783,56 @@ typedef union {
** fts5yy_default[] Default action for each state.
**
*********** Begin parsing tables **********************************************/
-#define fts5YY_ACTTAB_COUNT (98)
+#define fts5YY_ACTTAB_COUNT (105)
static const fts5YYACTIONTYPE fts5yy_action[] = {
- /* 0 */ 105, 19, 90, 6, 26, 93, 92, 24, 24, 17,
- /* 10 */ 90, 6, 26, 16, 92, 54, 24, 18, 90, 6,
- /* 20 */ 26, 10, 92, 12, 24, 75, 86, 90, 6, 26,
- /* 30 */ 13, 92, 75, 24, 20, 90, 6, 26, 101, 92,
- /* 40 */ 56, 24, 27, 90, 6, 26, 100, 92, 21, 24,
- /* 50 */ 23, 15, 30, 11, 1, 91, 22, 25, 9, 92,
- /* 60 */ 7, 24, 3, 4, 5, 3, 4, 5, 3, 77,
- /* 70 */ 4, 5, 3, 61, 23, 15, 60, 11, 80, 12,
- /* 80 */ 2, 13, 68, 10, 29, 52, 55, 75, 31, 32,
- /* 90 */ 8, 28, 5, 3, 51, 55, 72, 14,
+ /* 0 */ 81, 20, 96, 6, 28, 99, 98, 26, 26, 18,
+ /* 10 */ 96, 6, 28, 17, 98, 56, 26, 19, 96, 6,
+ /* 20 */ 28, 14, 98, 14, 26, 31, 92, 96, 6, 28,
+ /* 30 */ 108, 98, 25, 26, 21, 96, 6, 28, 78, 98,
+ /* 40 */ 58, 26, 29, 96, 6, 28, 107, 98, 22, 26,
+ /* 50 */ 24, 16, 12, 11, 1, 13, 13, 24, 16, 23,
+ /* 60 */ 11, 33, 34, 13, 97, 8, 27, 32, 98, 7,
+ /* 70 */ 26, 3, 4, 5, 3, 4, 5, 3, 83, 4,
+ /* 80 */ 5, 3, 63, 5, 3, 62, 12, 2, 86, 13,
+ /* 90 */ 9, 30, 10, 10, 54, 57, 75, 78, 78, 53,
+ /* 100 */ 57, 15, 82, 82, 71,
};
static const fts5YYCODETYPE fts5yy_lookahead[] = {
/* 0 */ 16, 17, 18, 19, 20, 22, 22, 24, 24, 17,
/* 10 */ 18, 19, 20, 7, 22, 9, 24, 17, 18, 19,
- /* 20 */ 20, 10, 22, 9, 24, 14, 17, 18, 19, 20,
- /* 30 */ 9, 22, 14, 24, 17, 18, 19, 20, 26, 22,
+ /* 20 */ 20, 9, 22, 9, 24, 13, 17, 18, 19, 20,
+ /* 30 */ 26, 22, 24, 24, 17, 18, 19, 20, 15, 22,
/* 40 */ 9, 24, 17, 18, 19, 20, 26, 22, 21, 24,
- /* 50 */ 6, 7, 13, 9, 10, 18, 21, 20, 5, 22,
- /* 60 */ 5, 24, 3, 1, 2, 3, 1, 2, 3, 0,
- /* 70 */ 1, 2, 3, 11, 6, 7, 11, 9, 5, 9,
- /* 80 */ 10, 9, 11, 10, 12, 8, 9, 14, 24, 25,
- /* 90 */ 23, 24, 2, 3, 8, 9, 9, 9,
+ /* 50 */ 6, 7, 9, 9, 10, 12, 12, 6, 7, 21,
+ /* 60 */ 9, 24, 25, 12, 18, 5, 20, 14, 22, 5,
+ /* 70 */ 24, 3, 1, 2, 3, 1, 2, 3, 0, 1,
+ /* 80 */ 2, 3, 11, 2, 3, 11, 9, 10, 5, 12,
+ /* 90 */ 23, 24, 10, 10, 8, 9, 9, 15, 15, 8,
+ /* 100 */ 9, 9, 27, 27, 11, 27, 27, 27, 27, 27,
+ /* 110 */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ /* 120 */ 27,
};
-#define fts5YY_SHIFT_USE_DFLT (98)
-#define fts5YY_SHIFT_COUNT (32)
+#define fts5YY_SHIFT_COUNT (34)
#define fts5YY_SHIFT_MIN (0)
-#define fts5YY_SHIFT_MAX (90)
+#define fts5YY_SHIFT_MAX (93)
static const unsigned char fts5yy_shift_ofst[] = {
- /* 0 */ 44, 44, 44, 44, 44, 44, 68, 70, 72, 14,
- /* 10 */ 21, 73, 11, 18, 18, 31, 31, 62, 65, 69,
- /* 20 */ 90, 77, 86, 6, 39, 53, 55, 59, 39, 87,
- /* 30 */ 88, 39, 71,
+ /* 0 */ 44, 44, 44, 44, 44, 44, 51, 77, 43, 12,
+ /* 10 */ 14, 83, 82, 14, 23, 23, 31, 31, 71, 74,
+ /* 20 */ 78, 81, 86, 91, 6, 53, 53, 60, 64, 68,
+ /* 30 */ 53, 87, 92, 53, 93,
};
-#define fts5YY_REDUCE_USE_DFLT (-18)
-#define fts5YY_REDUCE_COUNT (16)
+#define fts5YY_REDUCE_COUNT (17)
#define fts5YY_REDUCE_MIN (-17)
#define fts5YY_REDUCE_MAX (67)
static const signed char fts5yy_reduce_ofst[] = {
- /* 0 */ -16, -8, 0, 9, 17, 25, 37, -17, 64, -17,
- /* 10 */ 67, 12, 12, 12, 20, 27, 35,
+ /* 0 */ -16, -8, 0, 9, 17, 25, 46, -17, -17, 37,
+ /* 10 */ 67, 4, 4, 8, 4, 20, 27, 38,
};
static const fts5YYACTIONTYPE fts5yy_default[] = {
- /* 0 */ 104, 104, 104, 104, 104, 104, 89, 104, 98, 104,
- /* 10 */ 104, 103, 103, 103, 103, 104, 104, 104, 104, 104,
- /* 20 */ 85, 104, 104, 104, 94, 104, 104, 84, 96, 104,
- /* 30 */ 104, 97, 104,
+ /* 0 */ 80, 80, 80, 80, 80, 80, 95, 80, 80, 105,
+ /* 10 */ 80, 110, 110, 80, 110, 110, 80, 80, 80, 80,
+ /* 20 */ 80, 91, 80, 80, 80, 101, 100, 80, 80, 90,
+ /* 30 */ 103, 80, 80, 104, 80,
};
/********** End of lemon-generated parsing tables *****************************/
@@ -185551,6 +191891,7 @@ struct fts5yyParser {
int fts5yyerrcnt; /* Shifts left before out of the error */
#endif
sqlite3Fts5ParserARG_SDECL /* A place to hold %extra_argument */
+ sqlite3Fts5ParserCTX_SDECL /* A place to hold %extra_context */
#if fts5YYSTACKDEPTH<=0
int fts5yystksz; /* Current side of the stack */
fts5yyStackEntry *fts5yystack; /* The parser's stack */
@@ -185594,19 +191935,39 @@ static void sqlite3Fts5ParserTrace(FILE *TraceFILE, char *zTracePrompt){
}
#endif /* NDEBUG */
-#ifndef NDEBUG
+#if defined(fts5YYCOVERAGE) || !defined(NDEBUG)
/* For tracing shifts, the names of all terminals and nonterminals
** are required. The following table supplies these names */
static const char *const fts5yyTokenName[] = {
- "$", "OR", "AND", "NOT",
- "TERM", "COLON", "MINUS", "LCP",
- "RCP", "STRING", "LP", "RP",
- "COMMA", "PLUS", "STAR", "error",
- "input", "expr", "cnearset", "exprlist",
- "colset", "colsetlist", "nearset", "nearphrases",
- "phrase", "neardist_opt", "star_opt",
+ /* 0 */ "$",
+ /* 1 */ "OR",
+ /* 2 */ "AND",
+ /* 3 */ "NOT",
+ /* 4 */ "TERM",
+ /* 5 */ "COLON",
+ /* 6 */ "MINUS",
+ /* 7 */ "LCP",
+ /* 8 */ "RCP",
+ /* 9 */ "STRING",
+ /* 10 */ "LP",
+ /* 11 */ "RP",
+ /* 12 */ "CARET",
+ /* 13 */ "COMMA",
+ /* 14 */ "PLUS",
+ /* 15 */ "STAR",
+ /* 16 */ "input",
+ /* 17 */ "expr",
+ /* 18 */ "cnearset",
+ /* 19 */ "exprlist",
+ /* 20 */ "colset",
+ /* 21 */ "colsetlist",
+ /* 22 */ "nearset",
+ /* 23 */ "nearphrases",
+ /* 24 */ "phrase",
+ /* 25 */ "neardist_opt",
+ /* 26 */ "star_opt",
};
-#endif /* NDEBUG */
+#endif /* defined(fts5YYCOVERAGE) || !defined(NDEBUG) */
#ifndef NDEBUG
/* For tracing reduce actions, the names of all rules are required.
@@ -185630,15 +191991,16 @@ static const char *const fts5yyRuleName[] = {
/* 15 */ "cnearset ::= nearset",
/* 16 */ "cnearset ::= colset COLON nearset",
/* 17 */ "nearset ::= phrase",
- /* 18 */ "nearset ::= STRING LP nearphrases neardist_opt RP",
- /* 19 */ "nearphrases ::= phrase",
- /* 20 */ "nearphrases ::= nearphrases phrase",
- /* 21 */ "neardist_opt ::=",
- /* 22 */ "neardist_opt ::= COMMA STRING",
- /* 23 */ "phrase ::= phrase PLUS STRING star_opt",
- /* 24 */ "phrase ::= STRING star_opt",
- /* 25 */ "star_opt ::= STAR",
- /* 26 */ "star_opt ::=",
+ /* 18 */ "nearset ::= CARET phrase",
+ /* 19 */ "nearset ::= STRING LP nearphrases neardist_opt RP",
+ /* 20 */ "nearphrases ::= phrase",
+ /* 21 */ "nearphrases ::= nearphrases phrase",
+ /* 22 */ "neardist_opt ::=",
+ /* 23 */ "neardist_opt ::= COMMA STRING",
+ /* 24 */ "phrase ::= phrase PLUS STRING star_opt",
+ /* 25 */ "phrase ::= STRING star_opt",
+ /* 26 */ "star_opt ::= STAR",
+ /* 27 */ "star_opt ::=",
};
#endif /* NDEBUG */
@@ -185687,28 +192049,29 @@ static int fts5yyGrowStack(fts5yyParser *p){
/* Initialize a new parser that has already been allocated.
*/
-static void sqlite3Fts5ParserInit(void *fts5yypParser){
- fts5yyParser *pParser = (fts5yyParser*)fts5yypParser;
+static void sqlite3Fts5ParserInit(void *fts5yypRawParser sqlite3Fts5ParserCTX_PDECL){
+ fts5yyParser *fts5yypParser = (fts5yyParser*)fts5yypRawParser;
+ sqlite3Fts5ParserCTX_STORE
#ifdef fts5YYTRACKMAXSTACKDEPTH
- pParser->fts5yyhwm = 0;
+ fts5yypParser->fts5yyhwm = 0;
#endif
#if fts5YYSTACKDEPTH<=0
- pParser->fts5yytos = NULL;
- pParser->fts5yystack = NULL;
- pParser->fts5yystksz = 0;
- if( fts5yyGrowStack(pParser) ){
- pParser->fts5yystack = &pParser->fts5yystk0;
- pParser->fts5yystksz = 1;
+ fts5yypParser->fts5yytos = NULL;
+ fts5yypParser->fts5yystack = NULL;
+ fts5yypParser->fts5yystksz = 0;
+ if( fts5yyGrowStack(fts5yypParser) ){
+ fts5yypParser->fts5yystack = &fts5yypParser->fts5yystk0;
+ fts5yypParser->fts5yystksz = 1;
}
#endif
#ifndef fts5YYNOERRORRECOVERY
- pParser->fts5yyerrcnt = -1;
+ fts5yypParser->fts5yyerrcnt = -1;
#endif
- pParser->fts5yytos = pParser->fts5yystack;
- pParser->fts5yystack[0].stateno = 0;
- pParser->fts5yystack[0].major = 0;
+ fts5yypParser->fts5yytos = fts5yypParser->fts5yystack;
+ fts5yypParser->fts5yystack[0].stateno = 0;
+ fts5yypParser->fts5yystack[0].major = 0;
#if fts5YYSTACKDEPTH>0
- pParser->fts5yystackEnd = &pParser->fts5yystack[fts5YYSTACKDEPTH-1];
+ fts5yypParser->fts5yystackEnd = &fts5yypParser->fts5yystack[fts5YYSTACKDEPTH-1];
#endif
}
@@ -185725,11 +192088,14 @@ static void sqlite3Fts5ParserInit(void *fts5yypParser){
** A pointer to a parser. This pointer is used in subsequent calls
** to sqlite3Fts5Parser and sqlite3Fts5ParserFree.
*/
-static void *sqlite3Fts5ParserAlloc(void *(*mallocProc)(fts5YYMALLOCARGTYPE)){
- fts5yyParser *pParser;
- pParser = (fts5yyParser*)(*mallocProc)( (fts5YYMALLOCARGTYPE)sizeof(fts5yyParser) );
- if( pParser ) sqlite3Fts5ParserInit(pParser);
- return pParser;
+static void *sqlite3Fts5ParserAlloc(void *(*mallocProc)(fts5YYMALLOCARGTYPE) sqlite3Fts5ParserCTX_PDECL){
+ fts5yyParser *fts5yypParser;
+ fts5yypParser = (fts5yyParser*)(*mallocProc)( (fts5YYMALLOCARGTYPE)sizeof(fts5yyParser) );
+ if( fts5yypParser ){
+ sqlite3Fts5ParserCTX_STORE
+ sqlite3Fts5ParserInit(fts5yypParser sqlite3Fts5ParserCTX_PARAM);
+ }
+ return (void*)fts5yypParser;
}
#endif /* sqlite3Fts5Parser_ENGINEALWAYSONSTACK */
@@ -185746,7 +192112,8 @@ static void fts5yy_destructor(
fts5YYCODETYPE fts5yymajor, /* Type code for object to destroy */
fts5YYMINORTYPE *fts5yypminor /* The object to be destroyed */
){
- sqlite3Fts5ParserARG_FETCH;
+ sqlite3Fts5ParserARG_FETCH
+ sqlite3Fts5ParserCTX_FETCH
switch( fts5yymajor ){
/* Here is inserted the actions which take place when a
** terminal or non-terminal is destroyed. This can happen
@@ -185856,24 +192223,66 @@ static int sqlite3Fts5ParserStackPeak(void *p){
}
#endif
+/* This array of booleans keeps track of the parser statement
+** coverage. The element fts5yycoverage[X][Y] is set when the parser
+** is in state X and has a lookahead token Y. In a well-tested
+** systems, every element of this matrix should end up being set.
+*/
+#if defined(fts5YYCOVERAGE)
+static unsigned char fts5yycoverage[fts5YYNSTATE][fts5YYNFTS5TOKEN];
+#endif
+
+/*
+** Write into out a description of every state/lookahead combination that
+**
+** (1) has not been used by the parser, and
+** (2) is not a syntax error.
+**
+** Return the number of missed state/lookahead combinations.
+*/
+#if defined(fts5YYCOVERAGE)
+static int sqlite3Fts5ParserCoverage(FILE *out){
+ int stateno, iLookAhead, i;
+ int nMissed = 0;
+ for(stateno=0; stateno<fts5YYNSTATE; stateno++){
+ i = fts5yy_shift_ofst[stateno];
+ for(iLookAhead=0; iLookAhead<fts5YYNFTS5TOKEN; iLookAhead++){
+ if( fts5yy_lookahead[i+iLookAhead]!=iLookAhead ) continue;
+ if( fts5yycoverage[stateno][iLookAhead]==0 ) nMissed++;
+ if( out ){
+ fprintf(out,"State %d lookahead %s %s\n", stateno,
+ fts5yyTokenName[iLookAhead],
+ fts5yycoverage[stateno][iLookAhead] ? "ok" : "missed");
+ }
+ }
+ }
+ return nMissed;
+}
+#endif
+
/*
** Find the appropriate action for a parser given the terminal
** look-ahead token iLookAhead.
*/
-static unsigned int fts5yy_find_shift_action(
- fts5yyParser *pParser, /* The parser */
- fts5YYCODETYPE iLookAhead /* The look-ahead token */
+static fts5YYACTIONTYPE fts5yy_find_shift_action(
+ fts5YYCODETYPE iLookAhead, /* The look-ahead token */
+ fts5YYACTIONTYPE stateno /* Current state number */
){
int i;
- int stateno = pParser->fts5yytos->stateno;
-
- if( stateno>=fts5YY_MIN_REDUCE ) return stateno;
+
+ if( stateno>fts5YY_MAX_SHIFT ) return stateno;
assert( stateno <= fts5YY_SHIFT_COUNT );
+#if defined(fts5YYCOVERAGE)
+ fts5yycoverage[stateno][iLookAhead] = 1;
+#endif
do{
i = fts5yy_shift_ofst[stateno];
+ assert( i>=0 );
+ assert( i+fts5YYNFTS5TOKEN<=(int)sizeof(fts5yy_lookahead)/sizeof(fts5yy_lookahead[0]) );
assert( iLookAhead!=fts5YYNOCODE );
+ assert( iLookAhead < fts5YYNFTS5TOKEN );
i += iLookAhead;
- if( i<0 || i>=fts5YY_ACTTAB_COUNT || fts5yy_lookahead[i]!=iLookAhead ){
+ if( fts5yy_lookahead[i]!=iLookAhead ){
#ifdef fts5YYFALLBACK
fts5YYCODETYPE iFallback; /* Fallback token */
if( iLookAhead<sizeof(fts5yyFallback)/sizeof(fts5yyFallback[0])
@@ -185924,7 +192333,7 @@ static unsigned int fts5yy_find_shift_action(
** look-ahead token iLookAhead.
*/
static int fts5yy_find_reduce_action(
- int stateno, /* Current state number */
+ fts5YYACTIONTYPE stateno, /* Current state number */
fts5YYCODETYPE iLookAhead /* The look-ahead token */
){
int i;
@@ -185936,7 +192345,6 @@ static int fts5yy_find_reduce_action(
assert( stateno<=fts5YY_REDUCE_COUNT );
#endif
i = fts5yy_reduce_ofst[stateno];
- assert( i!=fts5YY_REDUCE_USE_DFLT );
assert( iLookAhead!=fts5YYNOCODE );
i += iLookAhead;
#ifdef fts5YYERRORSYMBOL
@@ -185954,7 +192362,8 @@ static int fts5yy_find_reduce_action(
** The following routine is called if the stack overflows.
*/
static void fts5yyStackOverflow(fts5yyParser *fts5yypParser){
- sqlite3Fts5ParserARG_FETCH;
+ sqlite3Fts5ParserARG_FETCH
+ sqlite3Fts5ParserCTX_FETCH
#ifndef NDEBUG
if( fts5yyTraceFILE ){
fprintf(fts5yyTraceFILE,"%sStack Overflow!\n",fts5yyTracePrompt);
@@ -185967,27 +192376,29 @@ static void fts5yyStackOverflow(fts5yyParser *fts5yypParser){
sqlite3Fts5ParseError(pParse, "fts5: parser stack overflow");
/******** End %stack_overflow code ********************************************/
- sqlite3Fts5ParserARG_STORE; /* Suppress warning about unused %extra_argument var */
+ sqlite3Fts5ParserARG_STORE /* Suppress warning about unused %extra_argument var */
+ sqlite3Fts5ParserCTX_STORE
}
/*
** Print tracing information for a SHIFT action
*/
#ifndef NDEBUG
-static void fts5yyTraceShift(fts5yyParser *fts5yypParser, int fts5yyNewState){
+static void fts5yyTraceShift(fts5yyParser *fts5yypParser, int fts5yyNewState, const char *zTag){
if( fts5yyTraceFILE ){
if( fts5yyNewState<fts5YYNSTATE ){
- fprintf(fts5yyTraceFILE,"%sShift '%s', go to state %d\n",
- fts5yyTracePrompt,fts5yyTokenName[fts5yypParser->fts5yytos->major],
+ fprintf(fts5yyTraceFILE,"%s%s '%s', go to state %d\n",
+ fts5yyTracePrompt, zTag, fts5yyTokenName[fts5yypParser->fts5yytos->major],
fts5yyNewState);
}else{
- fprintf(fts5yyTraceFILE,"%sShift '%s'\n",
- fts5yyTracePrompt,fts5yyTokenName[fts5yypParser->fts5yytos->major]);
+ fprintf(fts5yyTraceFILE,"%s%s '%s', pending reduce %d\n",
+ fts5yyTracePrompt, zTag, fts5yyTokenName[fts5yypParser->fts5yytos->major],
+ fts5yyNewState - fts5YY_MIN_REDUCE);
}
}
}
#else
-# define fts5yyTraceShift(X,Y)
+# define fts5yyTraceShift(X,Y,Z)
#endif
/*
@@ -185995,8 +192406,8 @@ static void fts5yyTraceShift(fts5yyParser *fts5yypParser, int fts5yyNewState){
*/
static void fts5yy_shift(
fts5yyParser *fts5yypParser, /* The parser to be shifted */
- int fts5yyNewState, /* The new state to shift in */
- int fts5yyMajor, /* The major token to shift in */
+ fts5YYACTIONTYPE fts5yyNewState, /* The new state to shift in */
+ fts5YYCODETYPE fts5yyMajor, /* The major token to shift in */
sqlite3Fts5ParserFTS5TOKENTYPE fts5yyMinor /* The minor token to shift in */
){
fts5yyStackEntry *fts5yytos;
@@ -186026,10 +192437,10 @@ static void fts5yy_shift(
fts5yyNewState += fts5YY_MIN_REDUCE - fts5YY_MIN_SHIFTREDUCE;
}
fts5yytos = fts5yypParser->fts5yytos;
- fts5yytos->stateno = (fts5YYACTIONTYPE)fts5yyNewState;
- fts5yytos->major = (fts5YYCODETYPE)fts5yyMajor;
+ fts5yytos->stateno = fts5yyNewState;
+ fts5yytos->major = fts5yyMajor;
fts5yytos->minor.fts5yy0 = fts5yyMinor;
- fts5yyTraceShift(fts5yypParser, fts5yyNewState);
+ fts5yyTraceShift(fts5yypParser, fts5yyNewState, "Shift");
}
/* The following table contains information about every rule that
@@ -186039,33 +192450,34 @@ static const struct {
fts5YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */
signed char nrhs; /* Negative of the number of RHS symbols in the rule */
} fts5yyRuleInfo[] = {
- { 16, -1 },
- { 20, -4 },
- { 20, -3 },
- { 20, -1 },
- { 20, -2 },
- { 21, -2 },
- { 21, -1 },
- { 17, -3 },
- { 17, -3 },
- { 17, -3 },
- { 17, -5 },
- { 17, -3 },
- { 17, -1 },
- { 19, -1 },
- { 19, -2 },
- { 18, -1 },
- { 18, -3 },
- { 22, -1 },
- { 22, -5 },
- { 23, -1 },
- { 23, -2 },
- { 25, 0 },
- { 25, -2 },
- { 24, -4 },
- { 24, -2 },
- { 26, -1 },
- { 26, 0 },
+ { 16, -1 }, /* (0) input ::= expr */
+ { 20, -4 }, /* (1) colset ::= MINUS LCP colsetlist RCP */
+ { 20, -3 }, /* (2) colset ::= LCP colsetlist RCP */
+ { 20, -1 }, /* (3) colset ::= STRING */
+ { 20, -2 }, /* (4) colset ::= MINUS STRING */
+ { 21, -2 }, /* (5) colsetlist ::= colsetlist STRING */
+ { 21, -1 }, /* (6) colsetlist ::= STRING */
+ { 17, -3 }, /* (7) expr ::= expr AND expr */
+ { 17, -3 }, /* (8) expr ::= expr OR expr */
+ { 17, -3 }, /* (9) expr ::= expr NOT expr */
+ { 17, -5 }, /* (10) expr ::= colset COLON LP expr RP */
+ { 17, -3 }, /* (11) expr ::= LP expr RP */
+ { 17, -1 }, /* (12) expr ::= exprlist */
+ { 19, -1 }, /* (13) exprlist ::= cnearset */
+ { 19, -2 }, /* (14) exprlist ::= exprlist cnearset */
+ { 18, -1 }, /* (15) cnearset ::= nearset */
+ { 18, -3 }, /* (16) cnearset ::= colset COLON nearset */
+ { 22, -1 }, /* (17) nearset ::= phrase */
+ { 22, -2 }, /* (18) nearset ::= CARET phrase */
+ { 22, -5 }, /* (19) nearset ::= STRING LP nearphrases neardist_opt RP */
+ { 23, -1 }, /* (20) nearphrases ::= phrase */
+ { 23, -2 }, /* (21) nearphrases ::= nearphrases phrase */
+ { 25, 0 }, /* (22) neardist_opt ::= */
+ { 25, -2 }, /* (23) neardist_opt ::= COMMA STRING */
+ { 24, -4 }, /* (24) phrase ::= phrase PLUS STRING star_opt */
+ { 24, -2 }, /* (25) phrase ::= STRING star_opt */
+ { 26, -1 }, /* (26) star_opt ::= STAR */
+ { 26, 0 }, /* (27) star_opt ::= */
};
static void fts5yy_accept(fts5yyParser*); /* Forward Declaration */
@@ -186073,22 +192485,39 @@ static void fts5yy_accept(fts5yyParser*); /* Forward Declaration */
/*
** Perform a reduce action and the shift that must immediately
** follow the reduce.
+**
+** The fts5yyLookahead and fts5yyLookaheadToken parameters provide reduce actions
+** access to the lookahead token (if any). The fts5yyLookahead will be fts5YYNOCODE
+** if the lookahead token has already been consumed. As this procedure is
+** only called from one place, optimizing compilers will in-line it, which
+** means that the extra parameters have no performance impact.
*/
-static void fts5yy_reduce(
+static fts5YYACTIONTYPE fts5yy_reduce(
fts5yyParser *fts5yypParser, /* The parser */
- unsigned int fts5yyruleno /* Number of the rule by which to reduce */
+ unsigned int fts5yyruleno, /* Number of the rule by which to reduce */
+ int fts5yyLookahead, /* Lookahead token, or fts5YYNOCODE if none */
+ sqlite3Fts5ParserFTS5TOKENTYPE fts5yyLookaheadToken /* Value of the lookahead token */
+ sqlite3Fts5ParserCTX_PDECL /* %extra_context */
){
int fts5yygoto; /* The next state */
int fts5yyact; /* The next action */
fts5yyStackEntry *fts5yymsp; /* The top of the parser's stack */
int fts5yysize; /* Amount to pop the stack */
- sqlite3Fts5ParserARG_FETCH;
+ sqlite3Fts5ParserARG_FETCH
+ (void)fts5yyLookahead;
+ (void)fts5yyLookaheadToken;
fts5yymsp = fts5yypParser->fts5yytos;
#ifndef NDEBUG
if( fts5yyTraceFILE && fts5yyruleno<(int)(sizeof(fts5yyRuleName)/sizeof(fts5yyRuleName[0])) ){
fts5yysize = fts5yyRuleInfo[fts5yyruleno].nrhs;
- fprintf(fts5yyTraceFILE, "%sReduce [%s], go to state %d.\n", fts5yyTracePrompt,
- fts5yyRuleName[fts5yyruleno], fts5yymsp[fts5yysize].stateno);
+ if( fts5yysize ){
+ fprintf(fts5yyTraceFILE, "%sReduce %d [%s], go to state %d.\n",
+ fts5yyTracePrompt,
+ fts5yyruleno, fts5yyRuleName[fts5yyruleno], fts5yymsp[fts5yysize].stateno);
+ }else{
+ fprintf(fts5yyTraceFILE, "%sReduce %d [%s].\n",
+ fts5yyTracePrompt, fts5yyruleno, fts5yyRuleName[fts5yyruleno]);
+ }
}
#endif /* NDEBUG */
@@ -186105,13 +192534,19 @@ static void fts5yy_reduce(
#if fts5YYSTACKDEPTH>0
if( fts5yypParser->fts5yytos>=fts5yypParser->fts5yystackEnd ){
fts5yyStackOverflow(fts5yypParser);
- return;
+ /* The call to fts5yyStackOverflow() above pops the stack until it is
+ ** empty, causing the main parser loop to exit. So the return value
+ ** is never used and does not matter. */
+ return 0;
}
#else
if( fts5yypParser->fts5yytos>=&fts5yypParser->fts5yystack[fts5yypParser->fts5yystksz-1] ){
if( fts5yyGrowStack(fts5yypParser) ){
fts5yyStackOverflow(fts5yypParser);
- return;
+ /* The call to fts5yyStackOverflow() above pops the stack until it is
+ ** empty, causing the main parser loop to exit. So the return value
+ ** is never used and does not matter. */
+ return 0;
}
fts5yymsp = fts5yypParser->fts5yytos;
}
@@ -186219,7 +192654,13 @@ static void fts5yy_reduce(
{ fts5yylhsminor.fts5yy46 = sqlite3Fts5ParseNearset(pParse, 0, fts5yymsp[0].minor.fts5yy53); }
fts5yymsp[0].minor.fts5yy46 = fts5yylhsminor.fts5yy46;
break;
- case 18: /* nearset ::= STRING LP nearphrases neardist_opt RP */
+ case 18: /* nearset ::= CARET phrase */
+{
+ sqlite3Fts5ParseSetCaret(fts5yymsp[0].minor.fts5yy53);
+ fts5yymsp[-1].minor.fts5yy46 = sqlite3Fts5ParseNearset(pParse, 0, fts5yymsp[0].minor.fts5yy53);
+}
+ break;
+ case 19: /* nearset ::= STRING LP nearphrases neardist_opt RP */
{
sqlite3Fts5ParseNear(pParse, &fts5yymsp[-4].minor.fts5yy0);
sqlite3Fts5ParseSetDistance(pParse, fts5yymsp[-2].minor.fts5yy46, &fts5yymsp[-1].minor.fts5yy0);
@@ -186227,40 +192668,40 @@ static void fts5yy_reduce(
}
fts5yymsp[-4].minor.fts5yy46 = fts5yylhsminor.fts5yy46;
break;
- case 19: /* nearphrases ::= phrase */
+ case 20: /* nearphrases ::= phrase */
{
fts5yylhsminor.fts5yy46 = sqlite3Fts5ParseNearset(pParse, 0, fts5yymsp[0].minor.fts5yy53);
}
fts5yymsp[0].minor.fts5yy46 = fts5yylhsminor.fts5yy46;
break;
- case 20: /* nearphrases ::= nearphrases phrase */
+ case 21: /* nearphrases ::= nearphrases phrase */
{
fts5yylhsminor.fts5yy46 = sqlite3Fts5ParseNearset(pParse, fts5yymsp[-1].minor.fts5yy46, fts5yymsp[0].minor.fts5yy53);
}
fts5yymsp[-1].minor.fts5yy46 = fts5yylhsminor.fts5yy46;
break;
- case 21: /* neardist_opt ::= */
+ case 22: /* neardist_opt ::= */
{ fts5yymsp[1].minor.fts5yy0.p = 0; fts5yymsp[1].minor.fts5yy0.n = 0; }
break;
- case 22: /* neardist_opt ::= COMMA STRING */
+ case 23: /* neardist_opt ::= COMMA STRING */
{ fts5yymsp[-1].minor.fts5yy0 = fts5yymsp[0].minor.fts5yy0; }
break;
- case 23: /* phrase ::= phrase PLUS STRING star_opt */
+ case 24: /* phrase ::= phrase PLUS STRING star_opt */
{
fts5yylhsminor.fts5yy53 = sqlite3Fts5ParseTerm(pParse, fts5yymsp[-3].minor.fts5yy53, &fts5yymsp[-1].minor.fts5yy0, fts5yymsp[0].minor.fts5yy4);
}
fts5yymsp[-3].minor.fts5yy53 = fts5yylhsminor.fts5yy53;
break;
- case 24: /* phrase ::= STRING star_opt */
+ case 25: /* phrase ::= STRING star_opt */
{
fts5yylhsminor.fts5yy53 = sqlite3Fts5ParseTerm(pParse, 0, &fts5yymsp[-1].minor.fts5yy0, fts5yymsp[0].minor.fts5yy4);
}
fts5yymsp[-1].minor.fts5yy53 = fts5yylhsminor.fts5yy53;
break;
- case 25: /* star_opt ::= STAR */
+ case 26: /* star_opt ::= STAR */
{ fts5yymsp[0].minor.fts5yy4 = 1; }
break;
- case 26: /* star_opt ::= */
+ case 27: /* star_opt ::= */
{ fts5yymsp[1].minor.fts5yy4 = 0; }
break;
default:
@@ -186279,16 +192720,12 @@ static void fts5yy_reduce(
/* It is not possible for a REDUCE to be followed by an error */
assert( fts5yyact!=fts5YY_ERROR_ACTION );
- if( fts5yyact==fts5YY_ACCEPT_ACTION ){
- fts5yypParser->fts5yytos += fts5yysize;
- fts5yy_accept(fts5yypParser);
- }else{
- fts5yymsp += fts5yysize+1;
- fts5yypParser->fts5yytos = fts5yymsp;
- fts5yymsp->stateno = (fts5YYACTIONTYPE)fts5yyact;
- fts5yymsp->major = (fts5YYCODETYPE)fts5yygoto;
- fts5yyTraceShift(fts5yypParser, fts5yyact);
- }
+ fts5yymsp += fts5yysize+1;
+ fts5yypParser->fts5yytos = fts5yymsp;
+ fts5yymsp->stateno = (fts5YYACTIONTYPE)fts5yyact;
+ fts5yymsp->major = (fts5YYCODETYPE)fts5yygoto;
+ fts5yyTraceShift(fts5yypParser, fts5yyact, "... then shift");
+ return fts5yyact;
}
/*
@@ -186298,7 +192735,8 @@ static void fts5yy_reduce(
static void fts5yy_parse_failed(
fts5yyParser *fts5yypParser /* The parser */
){
- sqlite3Fts5ParserARG_FETCH;
+ sqlite3Fts5ParserARG_FETCH
+ sqlite3Fts5ParserCTX_FETCH
#ifndef NDEBUG
if( fts5yyTraceFILE ){
fprintf(fts5yyTraceFILE,"%sFail!\n",fts5yyTracePrompt);
@@ -186309,7 +192747,8 @@ static void fts5yy_parse_failed(
** parser fails */
/************ Begin %parse_failure code ***************************************/
/************ End %parse_failure code *****************************************/
- sqlite3Fts5ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */
+ sqlite3Fts5ParserARG_STORE /* Suppress warning about unused %extra_argument variable */
+ sqlite3Fts5ParserCTX_STORE
}
#endif /* fts5YYNOERRORRECOVERY */
@@ -186321,7 +192760,8 @@ static void fts5yy_syntax_error(
int fts5yymajor, /* The major type of the error token */
sqlite3Fts5ParserFTS5TOKENTYPE fts5yyminor /* The minor type of the error token */
){
- sqlite3Fts5ParserARG_FETCH;
+ sqlite3Fts5ParserARG_FETCH
+ sqlite3Fts5ParserCTX_FETCH
#define FTS5TOKEN fts5yyminor
/************ Begin %syntax_error code ****************************************/
@@ -186330,7 +192770,8 @@ static void fts5yy_syntax_error(
pParse, "fts5: syntax error near \"%.*s\"",FTS5TOKEN.n,FTS5TOKEN.p
);
/************ End %syntax_error code ******************************************/
- sqlite3Fts5ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */
+ sqlite3Fts5ParserARG_STORE /* Suppress warning about unused %extra_argument variable */
+ sqlite3Fts5ParserCTX_STORE
}
/*
@@ -186339,7 +192780,8 @@ static void fts5yy_syntax_error(
static void fts5yy_accept(
fts5yyParser *fts5yypParser /* The parser */
){
- sqlite3Fts5ParserARG_FETCH;
+ sqlite3Fts5ParserARG_FETCH
+ sqlite3Fts5ParserCTX_FETCH
#ifndef NDEBUG
if( fts5yyTraceFILE ){
fprintf(fts5yyTraceFILE,"%sAccept!\n",fts5yyTracePrompt);
@@ -186353,7 +192795,8 @@ static void fts5yy_accept(
** parser accepts */
/*********** Begin %parse_accept code *****************************************/
/*********** End %parse_accept code *******************************************/
- sqlite3Fts5ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */
+ sqlite3Fts5ParserARG_STORE /* Suppress warning about unused %extra_argument variable */
+ sqlite3Fts5ParserCTX_STORE
}
/* The main parser program.
@@ -186382,38 +192825,51 @@ static void sqlite3Fts5Parser(
sqlite3Fts5ParserARG_PDECL /* Optional %extra_argument parameter */
){
fts5YYMINORTYPE fts5yyminorunion;
- unsigned int fts5yyact; /* The parser action. */
+ fts5YYACTIONTYPE fts5yyact; /* The parser action. */
#if !defined(fts5YYERRORSYMBOL) && !defined(fts5YYNOERRORRECOVERY)
int fts5yyendofinput; /* True if we are at the end of input */
#endif
#ifdef fts5YYERRORSYMBOL
int fts5yyerrorhit = 0; /* True if fts5yymajor has invoked an error */
#endif
- fts5yyParser *fts5yypParser; /* The parser */
+ fts5yyParser *fts5yypParser = (fts5yyParser*)fts5yyp; /* The parser */
+ sqlite3Fts5ParserCTX_FETCH
+ sqlite3Fts5ParserARG_STORE
- fts5yypParser = (fts5yyParser*)fts5yyp;
assert( fts5yypParser->fts5yytos!=0 );
#if !defined(fts5YYERRORSYMBOL) && !defined(fts5YYNOERRORRECOVERY)
fts5yyendofinput = (fts5yymajor==0);
#endif
- sqlite3Fts5ParserARG_STORE;
+ fts5yyact = fts5yypParser->fts5yytos->stateno;
#ifndef NDEBUG
if( fts5yyTraceFILE ){
- fprintf(fts5yyTraceFILE,"%sInput '%s'\n",fts5yyTracePrompt,fts5yyTokenName[fts5yymajor]);
+ if( fts5yyact < fts5YY_MIN_REDUCE ){
+ fprintf(fts5yyTraceFILE,"%sInput '%s' in state %d\n",
+ fts5yyTracePrompt,fts5yyTokenName[fts5yymajor],fts5yyact);
+ }else{
+ fprintf(fts5yyTraceFILE,"%sInput '%s' with pending reduce %d\n",
+ fts5yyTracePrompt,fts5yyTokenName[fts5yymajor],fts5yyact-fts5YY_MIN_REDUCE);
+ }
}
#endif
do{
- fts5yyact = fts5yy_find_shift_action(fts5yypParser,(fts5YYCODETYPE)fts5yymajor);
- if( fts5yyact <= fts5YY_MAX_SHIFTREDUCE ){
+ assert( fts5yyact==fts5yypParser->fts5yytos->stateno );
+ fts5yyact = fts5yy_find_shift_action(fts5yymajor,fts5yyact);
+ if( fts5yyact >= fts5YY_MIN_REDUCE ){
+ fts5yyact = fts5yy_reduce(fts5yypParser,fts5yyact-fts5YY_MIN_REDUCE,fts5yymajor,
+ fts5yyminor sqlite3Fts5ParserCTX_PARAM);
+ }else if( fts5yyact <= fts5YY_MAX_SHIFTREDUCE ){
fts5yy_shift(fts5yypParser,fts5yyact,fts5yymajor,fts5yyminor);
#ifndef fts5YYNOERRORRECOVERY
fts5yypParser->fts5yyerrcnt--;
#endif
- fts5yymajor = fts5YYNOCODE;
- }else if( fts5yyact <= fts5YY_MAX_REDUCE ){
- fts5yy_reduce(fts5yypParser,fts5yyact-fts5YY_MIN_REDUCE);
+ break;
+ }else if( fts5yyact==fts5YY_ACCEPT_ACTION ){
+ fts5yypParser->fts5yytos--;
+ fts5yy_accept(fts5yypParser);
+ return;
}else{
assert( fts5yyact == fts5YY_ERROR_ACTION );
fts5yyminorunion.fts5yy0 = fts5yyminor;
@@ -186480,6 +192936,8 @@ static void sqlite3Fts5Parser(
}
fts5yypParser->fts5yyerrcnt = 3;
fts5yyerrorhit = 1;
+ if( fts5yymajor==fts5YYNOCODE ) break;
+ fts5yyact = fts5yypParser->fts5yytos->stateno;
#elif defined(fts5YYNOERRORRECOVERY)
/* If the fts5YYNOERRORRECOVERY macro is defined, then do not attempt to
** do any kind of error recovery. Instead, simply invoke the syntax
@@ -186490,8 +192948,7 @@ static void sqlite3Fts5Parser(
*/
fts5yy_syntax_error(fts5yypParser,fts5yymajor, fts5yyminor);
fts5yy_destructor(fts5yypParser,(fts5YYCODETYPE)fts5yymajor,&fts5yyminorunion);
- fts5yymajor = fts5YYNOCODE;
-
+ break;
#else /* fts5YYERRORSYMBOL is not defined */
/* This is what we do if the grammar does not define ERROR:
**
@@ -186513,10 +192970,10 @@ static void sqlite3Fts5Parser(
fts5yypParser->fts5yyerrcnt = -1;
#endif
}
- fts5yymajor = fts5YYNOCODE;
+ break;
#endif
}
- }while( fts5yymajor!=fts5YYNOCODE && fts5yypParser->fts5yytos>fts5yypParser->fts5yystack );
+ }while( fts5yypParser->fts5yytos>fts5yypParser->fts5yystack );
#ifndef NDEBUG
if( fts5yyTraceFILE ){
fts5yyStackEntry *i;
@@ -186893,6 +193350,16 @@ static int fts5SnippetScore(
}
/*
+** Return the value in pVal interpreted as utf-8 text. Except, if pVal
+** contains a NULL value, return a pointer to a static string zero
+** bytes in length instead of a NULL pointer.
+*/
+static const char *fts5ValueToText(sqlite3_value *pVal){
+ const char *zRet = (const char*)sqlite3_value_text(pVal);
+ return zRet ? zRet : "";
+}
+
+/*
** Implementation of snippet() function.
*/
static void fts5SnippetFunction(
@@ -186927,9 +193394,9 @@ static void fts5SnippetFunction(
nCol = pApi->xColumnCount(pFts);
memset(&ctx, 0, sizeof(HighlightContext));
iCol = sqlite3_value_int(apVal[0]);
- ctx.zOpen = (const char*)sqlite3_value_text(apVal[1]);
- ctx.zClose = (const char*)sqlite3_value_text(apVal[2]);
- zEllips = (const char*)sqlite3_value_text(apVal[3]);
+ ctx.zOpen = fts5ValueToText(apVal[1]);
+ ctx.zClose = fts5ValueToText(apVal[2]);
+ zEllips = fts5ValueToText(apVal[3]);
nToken = sqlite3_value_int(apVal[4]);
iBestCol = (iCol>=0 ? iCol : 0);
@@ -188683,7 +195150,8 @@ struct Fts5ExprNode {
** or term prefix.
*/
struct Fts5ExprTerm {
- int bPrefix; /* True for a prefix term */
+ u8 bPrefix; /* True for a prefix term */
+ u8 bFirst; /* True if token must be first in column */
char *zTerm; /* nul-terminated term */
Fts5IndexIter *pIter; /* Iterator for this term */
Fts5ExprTerm *pSynonym; /* Pointer to first in list of synonyms */
@@ -188764,6 +195232,7 @@ static int fts5ExprGetToken(
case '+': tok = FTS5_PLUS; break;
case '*': tok = FTS5_STAR; break;
case '-': tok = FTS5_MINUS; break;
+ case '^': tok = FTS5_CARET; break;
case '\0': tok = FTS5_EOF; break;
case '"': {
@@ -189023,6 +195492,7 @@ static int fts5ExprPhraseIsMatch(
Fts5PoslistReader *aIter = aStatic;
int i;
int rc = SQLITE_OK;
+ int bFirst = pPhrase->aTerm[0].bFirst;
fts5BufferZero(&pPhrase->poslist);
@@ -189077,8 +195547,10 @@ static int fts5ExprPhraseIsMatch(
}while( bMatch==0 );
/* Append position iPos to the output */
- rc = sqlite3Fts5PoslistWriterAppend(&pPhrase->poslist, &writer, iPos);
- if( rc!=SQLITE_OK ) goto ismatch_out;
+ if( bFirst==0 || FTS5_POS2OFFSET(iPos)==0 ){
+ rc = sqlite3Fts5PoslistWriterAppend(&pPhrase->poslist, &writer, iPos);
+ if( rc!=SQLITE_OK ) goto ismatch_out;
+ }
for(i=0; i<pPhrase->nTerm; i++){
if( sqlite3Fts5PoslistReaderNext(&aIter[i]) ) goto ismatch_out;
@@ -189332,7 +195804,9 @@ static int fts5ExprNearTest(
** phrase is not a match, break out of the loop early. */
for(i=0; rc==SQLITE_OK && i<pNear->nPhrase; i++){
Fts5ExprPhrase *pPhrase = pNear->apPhrase[i];
- if( pPhrase->nTerm>1 || pPhrase->aTerm[0].pSynonym || pNear->pColset ){
+ if( pPhrase->nTerm>1 || pPhrase->aTerm[0].pSynonym
+ || pNear->pColset || pPhrase->aTerm[0].bFirst
+ ){
int bMatch = 0;
rc = fts5ExprPhraseIsMatch(pNode, pPhrase, &bMatch);
if( bMatch==0 ) break;
@@ -189513,6 +195987,7 @@ static int fts5ExprNodeTest_STRING(
assert( pNear->nPhrase>1
|| pNear->apPhrase[0]->nTerm>1
|| pNear->apPhrase[0]->aTerm[0].pSynonym
+ || pNear->apPhrase[0]->aTerm[0].bFirst
);
/* Initialize iLast, the "lastest" rowid any iterator points to. If the
@@ -190038,6 +196513,16 @@ static void fts5ExprPhraseFree(Fts5ExprPhrase *pPhrase){
}
/*
+** Set the "bFirst" flag on the first token of the phrase passed as the
+** only argument.
+*/
+static void sqlite3Fts5ParseSetCaret(Fts5ExprPhrase *pPhrase){
+ if( pPhrase && pPhrase->nTerm ){
+ pPhrase->aTerm[0].bFirst = 1;
+ }
+}
+
+/*
** If argument pNear is NULL, then a new Fts5ExprNearset object is allocated
** and populated with pPhrase. Or, if pNear is not NULL, phrase pPhrase is
** appended to it and the results returned.
@@ -190254,7 +196739,7 @@ static Fts5ExprPhrase *sqlite3Fts5ParseTerm(
** no token characters at all. (e.g ... MATCH '""'). */
sCtx.pPhrase = sqlite3Fts5MallocZero(&pParse->rc, sizeof(Fts5ExprPhrase));
}else if( sCtx.pPhrase->nTerm ){
- sCtx.pPhrase->aTerm[sCtx.pPhrase->nTerm-1].bPrefix = bPrefix;
+ sCtx.pPhrase->aTerm[sCtx.pPhrase->nTerm-1].bPrefix = (u8)bPrefix;
}
pParse->apPhrase[pParse->nPhrase-1] = sCtx.pPhrase;
}
@@ -190315,6 +196800,7 @@ static int sqlite3Fts5ExprClonePhrase(
}
if( rc==SQLITE_OK ){
sCtx.pPhrase->aTerm[i].bPrefix = pOrig->aTerm[i].bPrefix;
+ sCtx.pPhrase->aTerm[i].bFirst = pOrig->aTerm[i].bFirst;
}
}
}else{
@@ -190333,7 +196819,10 @@ static int sqlite3Fts5ExprClonePhrase(
pNew->pRoot->pNear->nPhrase = 1;
sCtx.pPhrase->pNode = pNew->pRoot;
- if( pOrig->nTerm==1 && pOrig->aTerm[0].pSynonym==0 ){
+ if( pOrig->nTerm==1
+ && pOrig->aTerm[0].pSynonym==0
+ && pOrig->aTerm[0].bFirst==0
+ ){
pNew->pRoot->eType = FTS5_TERM;
pNew->pRoot->xNext = fts5ExprNodeNext_TERM;
}else{
@@ -190607,6 +197096,7 @@ static void fts5ExprAssignXNext(Fts5ExprNode *pNode){
Fts5ExprNearset *pNear = pNode->pNear;
if( pNear->nPhrase==1 && pNear->apPhrase[0]->nTerm==1
&& pNear->apPhrase[0]->aTerm[0].pSynonym==0
+ && pNear->apPhrase[0]->aTerm[0].bFirst==0
){
pNode->eType = FTS5_TERM;
pNode->xNext = fts5ExprNodeNext_TERM;
@@ -190693,20 +197183,23 @@ static Fts5ExprNode *sqlite3Fts5ParseNode(
}
}
- if( pParse->pConfig->eDetail!=FTS5_DETAIL_FULL
- && (pNear->nPhrase!=1 || pNear->apPhrase[0]->nTerm>1)
- ){
- assert( pParse->rc==SQLITE_OK );
- pParse->rc = SQLITE_ERROR;
- assert( pParse->zErr==0 );
- pParse->zErr = sqlite3_mprintf(
- "fts5: %s queries are not supported (detail!=full)",
- pNear->nPhrase==1 ? "phrase": "NEAR"
- );
- sqlite3_free(pRet);
- pRet = 0;
+ if( pParse->pConfig->eDetail!=FTS5_DETAIL_FULL ){
+ Fts5ExprPhrase *pPhrase = pNear->apPhrase[0];
+ if( pNear->nPhrase!=1
+ || pPhrase->nTerm>1
+ || (pPhrase->nTerm>0 && pPhrase->aTerm[0].bFirst)
+ ){
+ assert( pParse->rc==SQLITE_OK );
+ pParse->rc = SQLITE_ERROR;
+ assert( pParse->zErr==0 );
+ pParse->zErr = sqlite3_mprintf(
+ "fts5: %s queries are not supported (detail!=full)",
+ pNear->nPhrase==1 ? "phrase": "NEAR"
+ );
+ sqlite3_free(pRet);
+ pRet = 0;
+ }
}
-
}else{
fts5ExprAddChildren(pRet, pLeft);
fts5ExprAddChildren(pRet, pRight);
@@ -192709,6 +199202,7 @@ static void fts5DataWrite(Fts5Index *p, i64 iRowid, const u8 *pData, int nData){
sqlite3_bind_blob(p->pWriter, 2, pData, nData, SQLITE_STATIC);
sqlite3_step(p->pWriter);
p->rc = sqlite3_reset(p->pWriter);
+ sqlite3_bind_null(p->pWriter, 2);
}
/*
@@ -194337,6 +200831,7 @@ static void fts5SegIterSeekInit(
bDlidx = (val & 0x0001);
}
p->rc = sqlite3_reset(pIdxSelect);
+ sqlite3_bind_null(pIdxSelect, 2);
if( iPg<pSeg->pgnoFirst ){
iPg = pSeg->pgnoFirst;
@@ -195549,6 +202044,7 @@ static int fts5AllocateSegid(Fts5Index *p, Fts5Structure *pStruct){
sqlite3_bind_blob(pIdxSelect, 2, aBlob, 2, SQLITE_STATIC);
assert( sqlite3_step(pIdxSelect)!=SQLITE_ROW );
p->rc = sqlite3_reset(pIdxSelect);
+ sqlite3_bind_null(pIdxSelect, 2);
}
}
#endif
@@ -195675,6 +202171,7 @@ static void fts5WriteFlushBtree(Fts5Index *p, Fts5SegWriter *pWriter){
sqlite3_bind_int64(p->pIdxWriter, 3, bFlag + ((i64)pWriter->iBtPage<<1));
sqlite3_step(p->pIdxWriter);
p->rc = sqlite3_reset(p->pIdxWriter);
+ sqlite3_bind_null(p->pIdxWriter, 2);
}
pWriter->iBtPage = 0;
}
@@ -196860,7 +203357,13 @@ static void fts5MergePrefixLists(
Fts5Buffer out = {0, 0, 0};
Fts5Buffer tmp = {0, 0, 0};
- if( sqlite3Fts5BufferSize(&p->rc, &out, p1->n + p2->n) ) return;
+ /* The maximum size of the output is equal to the sum of the two
+ ** input sizes + 1 varint (9 bytes). The extra varint is because if the
+ ** first rowid in one input is a large negative number, and the first in
+ ** the other a non-negative number, the delta for the non-negative
+ ** number will be larger on disk than the literal integer value
+ ** was. */
+ if( sqlite3Fts5BufferSize(&p->rc, &out, p1->n + p2->n + 9) ) return;
fts5DoclistIterInit(p1, &i1);
fts5DoclistIterInit(p2, &i2);
@@ -196954,6 +203457,7 @@ static void fts5MergePrefixLists(
fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid);
fts5BufferSafeAppendBlob(&out, i2.aPoslist, i2.aEof - i2.aPoslist);
}
+ assert( out.n<=(p1->n+p2->n+9) );
fts5BufferSet(&p->rc, p1, out.n, out.p);
fts5BufferFree(&tmp);
@@ -198981,6 +205485,12 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){
aColMap[1] = nCol;
aColMap[2] = nCol+1;
+ assert( SQLITE_INDEX_CONSTRAINT_EQ<SQLITE_INDEX_CONSTRAINT_MATCH );
+ assert( SQLITE_INDEX_CONSTRAINT_GT<SQLITE_INDEX_CONSTRAINT_MATCH );
+ assert( SQLITE_INDEX_CONSTRAINT_LE<SQLITE_INDEX_CONSTRAINT_MATCH );
+ assert( SQLITE_INDEX_CONSTRAINT_GE<SQLITE_INDEX_CONSTRAINT_MATCH );
+ assert( SQLITE_INDEX_CONSTRAINT_LE<SQLITE_INDEX_CONSTRAINT_MATCH );
+
/* Set idxFlags flags for all WHERE clause terms that will be used. */
for(i=0; i<pInfo->nConstraint; i++){
struct sqlite3_index_constraint *p = &pInfo->aConstraint[i];
@@ -198999,11 +205509,11 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){
pInfo->estimatedCost = 1e50;
return SQLITE_OK;
}
- }else{
+ }else if( p->op<=SQLITE_INDEX_CONSTRAINT_MATCH ){
int j;
for(j=1; j<ArraySize(aConstraint); j++){
struct Constraint *pC = &aConstraint[j];
- if( iCol==aColMap[pC->iCol] && p->op & pC->op && p->usable ){
+ if( iCol==aColMap[pC->iCol] && (p->op & pC->op) && p->usable ){
pC->iConsIndex = i;
idxFlags |= pC->fts5op;
}
@@ -201075,7 +207585,7 @@ static void fts5SourceIdFunc(
){
assert( nArg==0 );
UNUSED_PARAM2(nArg, apUnused);
- sqlite3_result_text(pCtx, "fts5: 2017-10-24 18:55:49 1a584e499906b5c87ec7d43d4abce641fdf017c42125b083109bc77c4de48827", -1, SQLITE_TRANSIENT);
+ sqlite3_result_text(pCtx, "fts5: 2018-06-04 19:24:41 c7ee0833225bfd8c5ec2f9bf62b97c4e04d03bd9566366d5221ac8fb199a87ca", -1, SQLITE_TRANSIENT);
}
static int fts5Init(sqlite3 *db){
@@ -201651,6 +208161,7 @@ static int fts5StorageInsertDocsize(
sqlite3_bind_blob(pReplace, 2, pBuf->p, pBuf->n, SQLITE_STATIC);
sqlite3_step(pReplace);
rc = sqlite3_reset(pReplace);
+ sqlite3_bind_null(pReplace, 2);
}
}
return rc;
@@ -202311,6 +208822,7 @@ static int sqlite3Fts5StorageConfigValue(
}
sqlite3_step(pReplace);
rc = sqlite3_reset(pReplace);
+ sqlite3_bind_null(pReplace, 1);
}
if( rc==SQLITE_OK && pVal ){
int iNew = p->pConfig->iCookie + 1;
@@ -205343,9 +211855,9 @@ SQLITE_API int sqlite3_stmt_init(
#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */
/************** End of stmt.c ************************************************/
-#if __LINE__!=205346
+#if __LINE__!=211858
#undef SQLITE_SOURCE_ID
-#define SQLITE_SOURCE_ID "2017-10-24 18:55:49 1a584e499906b5c87ec7d43d4abce641fdf017c42125b083109bc77c4de4alt2"
+#define SQLITE_SOURCE_ID "2018-06-04 19:24:41 c7ee0833225bfd8c5ec2f9bf62b97c4e04d03bd9566366d5221ac8fb199aalt2"
#endif
/* Return the source-id for this library */
SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
diff --git a/src/3rdparty/sqlite3/sqlite3.h b/src/3rdparty/sqlite3/sqlite3.h
index 5f28e036b..4427d2fa2 100644
--- a/src/3rdparty/sqlite3/sqlite3.h
+++ b/src/3rdparty/sqlite3/sqlite3.h
@@ -123,9 +123,9 @@ extern "C" {
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()].
*/
-#define SQLITE_VERSION "3.21.0"
-#define SQLITE_VERSION_NUMBER 3021000
-#define SQLITE_SOURCE_ID "2017-10-24 18:55:49 1a584e499906b5c87ec7d43d4abce641fdf017c42125b083109bc77c4de48827"
+#define SQLITE_VERSION "3.24.0"
+#define SQLITE_VERSION_NUMBER 3024000
+#define SQLITE_SOURCE_ID "2018-06-04 19:24:41 c7ee0833225bfd8c5ec2f9bf62b97c4e04d03bd9566366d5221ac8fb199a87ca"
/*
** CAPI3REF: Run-Time Library Version Numbers
@@ -470,6 +470,8 @@ SQLITE_API int sqlite3_exec(
** the most recent error can be obtained using
** [sqlite3_extended_errcode()].
*/
+#define SQLITE_ERROR_MISSING_COLLSEQ (SQLITE_ERROR | (1<<8))
+#define SQLITE_ERROR_RETRY (SQLITE_ERROR | (2<<8))
#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8))
#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8))
#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8))
@@ -502,6 +504,7 @@ SQLITE_API int sqlite3_exec(
#define SQLITE_IOERR_COMMIT_ATOMIC (SQLITE_IOERR | (30<<8))
#define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8))
#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8))
+#define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8))
#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8))
#define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8))
#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8))
@@ -509,10 +512,13 @@ SQLITE_API int sqlite3_exec(
#define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8))
#define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8))
#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8))
+#define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8))
#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8))
#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8))
#define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8))
#define SQLITE_READONLY_DBMOVED (SQLITE_READONLY | (4<<8))
+#define SQLITE_READONLY_CANTINIT (SQLITE_READONLY | (5<<8))
+#define SQLITE_READONLY_DIRECTORY (SQLITE_READONLY | (6<<8))
#define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8))
#define SQLITE_CONSTRAINT_CHECK (SQLITE_CONSTRAINT | (1<<8))
#define SQLITE_CONSTRAINT_COMMITHOOK (SQLITE_CONSTRAINT | (2<<8))
@@ -1060,6 +1066,12 @@ struct sqlite3_io_methods {
** so that all subsequent write operations are independent.
** ^SQLite will never invoke SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE without
** a prior successful call to [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE].
+**
+** <li>[[SQLITE_FCNTL_LOCK_TIMEOUT]]
+** The [SQLITE_FCNTL_LOCK_TIMEOUT] opcode causes attempts to obtain
+** a file lock using the xLock or xShmLock methods of the VFS to wait
+** for up to M milliseconds before failing, where M is the single
+** unsigned integer parameter.
** </ul>
*/
#define SQLITE_FCNTL_LOCKSTATE 1
@@ -1094,6 +1106,7 @@ struct sqlite3_io_methods {
#define SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 31
#define SQLITE_FCNTL_COMMIT_ATOMIC_WRITE 32
#define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33
+#define SQLITE_FCNTL_LOCK_TIMEOUT 34
/* deprecated names */
#define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE
@@ -1131,12 +1144,18 @@ typedef struct sqlite3_api_routines sqlite3_api_routines;
** in the name of the object stands for "virtual file system". See
** the [VFS | VFS documentation] for further information.
**
-** The value of the iVersion field is initially 1 but may be larger in
-** future versions of SQLite. Additional fields may be appended to this
-** object when the iVersion value is increased. Note that the structure
-** of the sqlite3_vfs object changes in the transaction between
-** SQLite version 3.5.9 and 3.6.0 and yet the iVersion field was not
-** modified.
+** The VFS interface is sometimes extended by adding new methods onto
+** the end. Each time such an extension occurs, the iVersion field
+** is incremented. The iVersion value started out as 1 in
+** SQLite [version 3.5.0] on [dateof:3.5.0], then increased to 2
+** with SQLite [version 3.7.0] on [dateof:3.7.0], and then increased
+** to 3 with SQLite [version 3.7.6] on [dateof:3.7.6]. Additional fields
+** may be appended to the sqlite3_vfs object and the iVersion value
+** may increase again in future versions of SQLite.
+** Note that the structure
+** of the sqlite3_vfs object changes in the transition from
+** SQLite [version 3.5.9] to [version 3.6.0] on [dateof:3.6.0]
+** and yet the iVersion field was not modified.
**
** The szOsFile field is the size of the subclassed [sqlite3_file]
** structure used by this VFS. mxPathname is the maximum length of
@@ -1913,6 +1932,22 @@ struct sqlite3_mem_methods {
** I/O required to support statement rollback.
** The default value for this setting is controlled by the
** [SQLITE_STMTJRNL_SPILL] compile-time option.
+**
+** [[SQLITE_CONFIG_SORTERREF_SIZE]]
+** <dt>SQLITE_CONFIG_SORTERREF_SIZE
+** <dd>The SQLITE_CONFIG_SORTERREF_SIZE option accepts a single parameter
+** of type (int) - the new value of the sorter-reference size threshold.
+** Usually, when SQLite uses an external sort to order records according
+** to an ORDER BY clause, all fields required by the caller are present in the
+** sorted records. However, if SQLite determines based on the declared type
+** of a table column that its values are likely to be very large - larger
+** than the configured sorter-reference size threshold - then a reference
+** is stored in each sorted record and the required column values loaded
+** from the database as records are returned in sorted order. The default
+** value for this option is to never use this optimization. Specifying a
+** negative value for this option restores the default behaviour.
+** This option is only available if SQLite is compiled with the
+** [SQLITE_ENABLE_SORTER_REFERENCES] compile-time option.
** </dl>
*/
#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */
@@ -1942,6 +1977,7 @@ struct sqlite3_mem_methods {
#define SQLITE_CONFIG_PMASZ 25 /* unsigned int szPma */
#define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */
#define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */
+#define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */
/*
** CAPI3REF: Database Connection Configuration Options
@@ -2044,8 +2080,9 @@ struct sqlite3_mem_methods {
** connections at all to the database. If so, it performs a checkpoint
** operation before closing the connection. This option may be used to
** override this behaviour. The first parameter passed to this operation
-** is an integer - non-zero to disable checkpoints-on-close, or zero (the
-** default) to enable them. The second parameter is a pointer to an integer
+** is an integer - positive to disable checkpoints-on-close, or zero (the
+** default) to enable them, and negative to leave the setting unchanged.
+** The second parameter is a pointer to an integer
** into which is written 0 or 1 to indicate whether checkpoints-on-close
** have been disabled - 0 if they are not disabled, 1 if they are.
** </dd>
@@ -2059,8 +2096,39 @@ struct sqlite3_mem_methods {
** slower. But the QPSG has the advantage of more predictable behavior. With
** the QPSG active, SQLite will always use the same query plan in the field as
** was used during testing in the lab.
+** The first argument to this setting is an integer which is 0 to disable
+** the QPSG, positive to enable QPSG, or negative to leave the setting
+** unchanged. The second parameter is a pointer to an integer into which
+** is written 0 or 1 to indicate whether the QPSG is disabled or enabled
+** following this call.
+** </dd>
+**
+** <dt>SQLITE_DBCONFIG_TRIGGER_EQP</dt>
+** <dd> By default, the output of EXPLAIN QUERY PLAN commands does not
+** include output for any operations performed by trigger programs. This
+** option is used to set or clear (the default) a flag that governs this
+** behavior. The first parameter passed to this operation is an integer -
+** positive to enable output for trigger programs, or zero to disable it,
+** or negative to leave the setting unchanged.
+** The second parameter is a pointer to an integer into which is written
+** 0 or 1 to indicate whether output-for-triggers has been disabled - 0 if
+** it is not disabled, 1 if it is.
** </dd>
**
+** <dt>SQLITE_DBCONFIG_RESET_DATABASE</dt>
+** <dd> Set the SQLITE_DBCONFIG_RESET_DATABASE flag and then run
+** [VACUUM] in order to reset a database back to an empty database
+** with no schema and no content. The following process works even for
+** a badly corrupted database file:
+** <ol>
+** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0);
+** <li> [sqlite3_exec](db, "[VACUUM]", 0, 0, 0);
+** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0);
+** </ol>
+** Because resetting a database is destructive and irreversible, the
+** process requires the use of this obscure API and multiple steps to help
+** ensure that it does not happen by accident.
+** </dd>
** </dl>
*/
#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */
@@ -2071,7 +2139,9 @@ struct sqlite3_mem_methods {
#define SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION 1005 /* int int* */
#define SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE 1006 /* int int* */
#define SQLITE_DBCONFIG_ENABLE_QPSG 1007 /* int int* */
-
+#define SQLITE_DBCONFIG_TRIGGER_EQP 1008 /* int int* */
+#define SQLITE_DBCONFIG_RESET_DATABASE 1009 /* int int* */
+#define SQLITE_DBCONFIG_MAX 1009 /* Largest DBCONFIG */
/*
** CAPI3REF: Enable Or Disable Extended Result Codes
@@ -2477,16 +2547,16 @@ SQLITE_API void sqlite3_free_table(char **result);
**
** These routines are work-alikes of the "printf()" family of functions
** from the standard C library.
-** These routines understand most of the common K&R formatting options,
-** plus some additional non-standard formats, detailed below.
-** Note that some of the more obscure formatting options from recent
-** C-library standards are omitted from this implementation.
+** These routines understand most of the common formatting options from
+** the standard library printf()
+** plus some additional non-standard formats ([%q], [%Q], [%w], and [%z]).
+** See the [built-in printf()] documentation for details.
**
** ^The sqlite3_mprintf() and sqlite3_vmprintf() routines write their
-** results into memory obtained from [sqlite3_malloc()].
+** results into memory obtained from [sqlite3_malloc64()].
** The strings returned by these two routines should be
** released by [sqlite3_free()]. ^Both routines return a
-** NULL pointer if [sqlite3_malloc()] is unable to allocate enough
+** NULL pointer if [sqlite3_malloc64()] is unable to allocate enough
** memory to hold the resulting string.
**
** ^(The sqlite3_snprintf() routine is similar to "snprintf()" from
@@ -2510,71 +2580,7 @@ SQLITE_API void sqlite3_free_table(char **result);
**
** ^The sqlite3_vsnprintf() routine is a varargs version of sqlite3_snprintf().
**
-** These routines all implement some additional formatting
-** options that are useful for constructing SQL statements.
-** All of the usual printf() formatting options apply. In addition, there
-** is are "%q", "%Q", "%w" and "%z" options.
-**
-** ^(The %q option works like %s in that it substitutes a nul-terminated
-** string from the argument list. But %q also doubles every '\'' character.
-** %q is designed for use inside a string literal.)^ By doubling each '\''
-** character it escapes that character and allows it to be inserted into
-** the string.
-**
-** For example, assume the string variable zText contains text as follows:
-**
-** <blockquote><pre>
-** char *zText = "It's a happy day!";
-** </pre></blockquote>
-**
-** One can use this text in an SQL statement as follows:
-**
-** <blockquote><pre>
-** char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText);
-** sqlite3_exec(db, zSQL, 0, 0, 0);
-** sqlite3_free(zSQL);
-** </pre></blockquote>
-**
-** Because the %q format string is used, the '\'' character in zText
-** is escaped and the SQL generated is as follows:
-**
-** <blockquote><pre>
-** INSERT INTO table1 VALUES('It''s a happy day!')
-** </pre></blockquote>
-**
-** This is correct. Had we used %s instead of %q, the generated SQL
-** would have looked like this:
-**
-** <blockquote><pre>
-** INSERT INTO table1 VALUES('It's a happy day!');
-** </pre></blockquote>
-**
-** This second example is an SQL syntax error. As a general rule you should
-** always use %q instead of %s when inserting text into a string literal.
-**
-** ^(The %Q option works like %q except it also adds single quotes around
-** the outside of the total string. Additionally, if the parameter in the
-** argument list is a NULL pointer, %Q substitutes the text "NULL" (without
-** single quotes).)^ So, for example, one could say:
-**
-** <blockquote><pre>
-** char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
-** sqlite3_exec(db, zSQL, 0, 0, 0);
-** sqlite3_free(zSQL);
-** </pre></blockquote>
-**
-** The code above will render a correct SQL statement in the zSQL
-** variable even if the zText variable is a NULL pointer.
-**
-** ^(The "%w" formatting option is like "%q" except that it expects to
-** be contained within double-quotes instead of single quotes, and it
-** escapes the double-quote character instead of the single-quote
-** character.)^ The "%w" formatting option is intended for safely inserting
-** table and column names into a constructed SQL statement.
-**
-** ^(The "%z" formatting option works like "%s" but with the
-** addition that after the string has been read and copied into
-** the result, [sqlite3_free()] is called on the input string.)^
+** See also: [built-in printf()], [printf() SQL function]
*/
SQLITE_API char *sqlite3_mprintf(const char*,...);
SQLITE_API char *sqlite3_vmprintf(const char*, va_list);
@@ -2932,8 +2938,8 @@ SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*,
** KEYWORDS: SQLITE_TRACE
**
** These constants identify classes of events that can be monitored
-** using the [sqlite3_trace_v2()] tracing logic. The third argument
-** to [sqlite3_trace_v2()] is an OR-ed combination of one or more of
+** using the [sqlite3_trace_v2()] tracing logic. The M argument
+** to [sqlite3_trace_v2(D,M,X,P)] is an OR-ed combination of one or more of
** the following constants. ^The first argument to the trace callback
** is one of the following constants.
**
@@ -3640,13 +3646,13 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal);
** or [GLOB] operator or if the parameter is compared to an indexed column
** and the [SQLITE_ENABLE_STAT3] compile-time option is enabled.
** </li>
+** </ol>
**
** <p>^sqlite3_prepare_v3() differs from sqlite3_prepare_v2() only in having
** the extra prepFlags parameter, which is a bit array consisting of zero or
** more of the [SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_*] flags. ^The
** sqlite3_prepare_v2() interface works exactly the same as
** sqlite3_prepare_v3() with a zero prepFlags parameter.
-** </ol>
*/
SQLITE_API int sqlite3_prepare(
sqlite3 *db, /* Database handle */
@@ -4779,6 +4785,9 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6
** datatype of the value
** <tr><td><b>sqlite3_value_numeric_type&nbsp;&nbsp;</b>
** <td>&rarr;&nbsp;&nbsp;<td>Best numeric datatype of the value
+** <tr><td><b>sqlite3_value_nochange&nbsp;&nbsp;</b>
+** <td>&rarr;&nbsp;&nbsp;<td>True if the column is unchanged in an UPDATE
+** against a virtual table.
** </table></blockquote>
**
** <b>Details:</b>
@@ -4827,6 +4836,19 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6
** then the conversion is performed. Otherwise no conversion occurs.
** The [SQLITE_INTEGER | datatype] after conversion is returned.)^
**
+** ^Within the [xUpdate] method of a [virtual table], the
+** sqlite3_value_nochange(X) interface returns true if and only if
+** the column corresponding to X is unchanged by the UPDATE operation
+** that the xUpdate method call was invoked to implement and if
+** and the prior [xColumn] method call that was invoked to extracted
+** the value for that column returned without setting a result (probably
+** because it queried [sqlite3_vtab_nochange()] and found that the column
+** was unchanging). ^Within an [xUpdate] method, any value for which
+** sqlite3_value_nochange(X) is true will in all other respects appear
+** to be a NULL value. If sqlite3_value_nochange(X) is invoked anywhere other
+** than within an [xUpdate] method call for an UPDATE statement, then
+** the return value is arbitrary and meaningless.
+**
** Please pay particular attention to the fact that the pointer returned
** from [sqlite3_value_blob()], [sqlite3_value_text()], or
** [sqlite3_value_text16()] can be invalidated by a subsequent call to
@@ -4849,6 +4871,7 @@ SQLITE_API int sqlite3_value_bytes(sqlite3_value*);
SQLITE_API int sqlite3_value_bytes16(sqlite3_value*);
SQLITE_API int sqlite3_value_type(sqlite3_value*);
SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*);
+SQLITE_API int sqlite3_value_nochange(sqlite3_value*);
/*
** CAPI3REF: Finding The Subtype Of SQL Values
@@ -5505,6 +5528,41 @@ SQLITE_API SQLITE_EXTERN char *sqlite3_temp_directory;
SQLITE_API SQLITE_EXTERN char *sqlite3_data_directory;
/*
+** CAPI3REF: Win32 Specific Interface
+**
+** These interfaces are available only on Windows. The
+** [sqlite3_win32_set_directory] interface is used to set the value associated
+** with the [sqlite3_temp_directory] or [sqlite3_data_directory] variable, to
+** zValue, depending on the value of the type parameter. The zValue parameter
+** should be NULL to cause the previous value to be freed via [sqlite3_free];
+** a non-NULL value will be copied into memory obtained from [sqlite3_malloc]
+** prior to being used. The [sqlite3_win32_set_directory] interface returns
+** [SQLITE_OK] to indicate success, [SQLITE_ERROR] if the type is unsupported,
+** or [SQLITE_NOMEM] if memory could not be allocated. The value of the
+** [sqlite3_data_directory] variable is intended to act as a replacement for
+** the current directory on the sub-platforms of Win32 where that concept is
+** not present, e.g. WinRT and UWP. The [sqlite3_win32_set_directory8] and
+** [sqlite3_win32_set_directory16] interfaces behave exactly the same as the
+** sqlite3_win32_set_directory interface except the string parameter must be
+** UTF-8 or UTF-16, respectively.
+*/
+SQLITE_API int sqlite3_win32_set_directory(
+ unsigned long type, /* Identifier for directory being set or reset */
+ void *zValue /* New value for directory being set or reset */
+);
+SQLITE_API int sqlite3_win32_set_directory8(unsigned long type, const char *zValue);
+SQLITE_API int sqlite3_win32_set_directory16(unsigned long type, const void *zValue);
+
+/*
+** CAPI3REF: Win32 Directory Types
+**
+** These macros are only available on Windows. They define the allowed values
+** for the type argument to the [sqlite3_win32_set_directory] interface.
+*/
+#define SQLITE_WIN32_DATA_DIRECTORY_TYPE 1
+#define SQLITE_WIN32_TEMP_DIRECTORY_TYPE 2
+
+/*
** CAPI3REF: Test For Auto-Commit Mode
** KEYWORDS: {autocommit mode}
** METHOD: sqlite3
@@ -6236,6 +6294,10 @@ struct sqlite3_index_info {
/*
** CAPI3REF: Virtual Table Scan Flags
+**
+** Virtual table implementations are allowed to set the
+** [sqlite3_index_info].idxFlags field to some combination of
+** these bits.
*/
#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */
@@ -6951,9 +7013,9 @@ SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*);
** the xFileControl method. ^The return value of the xFileControl
** method becomes the return value of this routine.
**
-** ^The SQLITE_FCNTL_FILE_POINTER value for the op parameter causes
+** ^The [SQLITE_FCNTL_FILE_POINTER] value for the op parameter causes
** a pointer to the underlying [sqlite3_file] object to be written into
-** the space pointed to by the 4th parameter. ^The SQLITE_FCNTL_FILE_POINTER
+** the space pointed to by the 4th parameter. ^The [SQLITE_FCNTL_FILE_POINTER]
** case is a short-circuit path which does not actually invoke the
** underlying sqlite3_io_methods.xFileControl method.
**
@@ -6965,7 +7027,7 @@ SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*);
** an incorrect zDbName and an SQLITE_ERROR return from the underlying
** xFileControl method.
**
-** See also: [SQLITE_FCNTL_LOCKSTATE]
+** See also: [file control opcodes]
*/
SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*);
@@ -7011,7 +7073,7 @@ SQLITE_API int sqlite3_test_control(int op, ...);
#define SQLITE_TESTCTRL_ALWAYS 13
#define SQLITE_TESTCTRL_RESERVE 14
#define SQLITE_TESTCTRL_OPTIMIZATIONS 15
-#define SQLITE_TESTCTRL_ISKEYWORD 16
+#define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */
#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */
#define SQLITE_TESTCTRL_LOCALTIME_FAULT 18
#define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */
@@ -7022,7 +7084,191 @@ SQLITE_API int sqlite3_test_control(int op, ...);
#define SQLITE_TESTCTRL_ISINIT 23
#define SQLITE_TESTCTRL_SORTER_MMAP 24
#define SQLITE_TESTCTRL_IMPOSTER 25
-#define SQLITE_TESTCTRL_LAST 25
+#define SQLITE_TESTCTRL_PARSER_COVERAGE 26
+#define SQLITE_TESTCTRL_LAST 26 /* Largest TESTCTRL */
+
+/*
+** CAPI3REF: SQL Keyword Checking
+**
+** These routines provide access to the set of SQL language keywords
+** recognized by SQLite. Applications can uses these routines to determine
+** whether or not a specific identifier needs to be escaped (for example,
+** by enclosing in double-quotes) so as not to confuse the parser.
+**
+** The sqlite3_keyword_count() interface returns the number of distinct
+** keywords understood by SQLite.
+**
+** The sqlite3_keyword_name(N,Z,L) interface finds the N-th keyword and
+** makes *Z point to that keyword expressed as UTF8 and writes the number
+** of bytes in the keyword into *L. The string that *Z points to is not
+** zero-terminated. The sqlite3_keyword_name(N,Z,L) routine returns
+** SQLITE_OK if N is within bounds and SQLITE_ERROR if not. If either Z
+** or L are NULL or invalid pointers then calls to
+** sqlite3_keyword_name(N,Z,L) result in undefined behavior.
+**
+** The sqlite3_keyword_check(Z,L) interface checks to see whether or not
+** the L-byte UTF8 identifier that Z points to is a keyword, returning non-zero
+** if it is and zero if not.
+**
+** The parser used by SQLite is forgiving. It is often possible to use
+** a keyword as an identifier as long as such use does not result in a
+** parsing ambiguity. For example, the statement
+** "CREATE TABLE BEGIN(REPLACE,PRAGMA,END);" is accepted by SQLite, and
+** creates a new table named "BEGIN" with three columns named
+** "REPLACE", "PRAGMA", and "END". Nevertheless, best practice is to avoid
+** using keywords as identifiers. Common techniques used to avoid keyword
+** name collisions include:
+** <ul>
+** <li> Put all identifier names inside double-quotes. This is the official
+** SQL way to escape identifier names.
+** <li> Put identifier names inside &#91;...&#93;. This is not standard SQL,
+** but it is what SQL Server does and so lots of programmers use this
+** technique.
+** <li> Begin every identifier with the letter "Z" as no SQL keywords start
+** with "Z".
+** <li> Include a digit somewhere in every identifier name.
+** </ul>
+**
+** Note that the number of keywords understood by SQLite can depend on
+** compile-time options. For example, "VACUUM" is not a keyword if
+** SQLite is compiled with the [-DSQLITE_OMIT_VACUUM] option. Also,
+** new keywords may be added to future releases of SQLite.
+*/
+SQLITE_API int sqlite3_keyword_count(void);
+SQLITE_API int sqlite3_keyword_name(int,const char**,int*);
+SQLITE_API int sqlite3_keyword_check(const char*,int);
+
+/*
+** CAPI3REF: Dynamic String Object
+** KEYWORDS: {dynamic string}
+**
+** An instance of the sqlite3_str object contains a dynamically-sized
+** string under construction.
+**
+** The lifecycle of an sqlite3_str object is as follows:
+** <ol>
+** <li> ^The sqlite3_str object is created using [sqlite3_str_new()].
+** <li> ^Text is appended to the sqlite3_str object using various
+** methods, such as [sqlite3_str_appendf()].
+** <li> ^The sqlite3_str object is destroyed and the string it created
+** is returned using the [sqlite3_str_finish()] interface.
+** </ol>
+*/
+typedef struct sqlite3_str sqlite3_str;
+
+/*
+** CAPI3REF: Create A New Dynamic String Object
+** CONSTRUCTOR: sqlite3_str
+**
+** ^The [sqlite3_str_new(D)] interface allocates and initializes
+** a new [sqlite3_str] object. To avoid memory leaks, the object returned by
+** [sqlite3_str_new()] must be freed by a subsequent call to
+** [sqlite3_str_finish(X)].
+**
+** ^The [sqlite3_str_new(D)] interface always returns a pointer to a
+** valid [sqlite3_str] object, though in the event of an out-of-memory
+** error the returned object might be a special singleton that will
+** silently reject new text, always return SQLITE_NOMEM from
+** [sqlite3_str_errcode()], always return 0 for
+** [sqlite3_str_length()], and always return NULL from
+** [sqlite3_str_finish(X)]. It is always safe to use the value
+** returned by [sqlite3_str_new(D)] as the sqlite3_str parameter
+** to any of the other [sqlite3_str] methods.
+**
+** The D parameter to [sqlite3_str_new(D)] may be NULL. If the
+** D parameter in [sqlite3_str_new(D)] is not NULL, then the maximum
+** length of the string contained in the [sqlite3_str] object will be
+** the value set for [sqlite3_limit](D,[SQLITE_LIMIT_LENGTH]) instead
+** of [SQLITE_MAX_LENGTH].
+*/
+SQLITE_API sqlite3_str *sqlite3_str_new(sqlite3*);
+
+/*
+** CAPI3REF: Finalize A Dynamic String
+** DESTRUCTOR: sqlite3_str
+**
+** ^The [sqlite3_str_finish(X)] interface destroys the sqlite3_str object X
+** and returns a pointer to a memory buffer obtained from [sqlite3_malloc64()]
+** that contains the constructed string. The calling application should
+** pass the returned value to [sqlite3_free()] to avoid a memory leak.
+** ^The [sqlite3_str_finish(X)] interface may return a NULL pointer if any
+** errors were encountered during construction of the string. ^The
+** [sqlite3_str_finish(X)] interface will also return a NULL pointer if the
+** string in [sqlite3_str] object X is zero bytes long.
+*/
+SQLITE_API char *sqlite3_str_finish(sqlite3_str*);
+
+/*
+** CAPI3REF: Add Content To A Dynamic String
+** METHOD: sqlite3_str
+**
+** These interfaces add content to an sqlite3_str object previously obtained
+** from [sqlite3_str_new()].
+**
+** ^The [sqlite3_str_appendf(X,F,...)] and
+** [sqlite3_str_vappendf(X,F,V)] interfaces uses the [built-in printf]
+** functionality of SQLite to append formatted text onto the end of
+** [sqlite3_str] object X.
+**
+** ^The [sqlite3_str_append(X,S,N)] method appends exactly N bytes from string S
+** onto the end of the [sqlite3_str] object X. N must be non-negative.
+** S must contain at least N non-zero bytes of content. To append a
+** zero-terminated string in its entirety, use the [sqlite3_str_appendall()]
+** method instead.
+**
+** ^The [sqlite3_str_appendall(X,S)] method appends the complete content of
+** zero-terminated string S onto the end of [sqlite3_str] object X.
+**
+** ^The [sqlite3_str_appendchar(X,N,C)] method appends N copies of the
+** single-byte character C onto the end of [sqlite3_str] object X.
+** ^This method can be used, for example, to add whitespace indentation.
+**
+** ^The [sqlite3_str_reset(X)] method resets the string under construction
+** inside [sqlite3_str] object X back to zero bytes in length.
+**
+** These methods do not return a result code. ^If an error occurs, that fact
+** is recorded in the [sqlite3_str] object and can be recovered by a
+** subsequent call to [sqlite3_str_errcode(X)].
+*/
+SQLITE_API void sqlite3_str_appendf(sqlite3_str*, const char *zFormat, ...);
+SQLITE_API void sqlite3_str_vappendf(sqlite3_str*, const char *zFormat, va_list);
+SQLITE_API void sqlite3_str_append(sqlite3_str*, const char *zIn, int N);
+SQLITE_API void sqlite3_str_appendall(sqlite3_str*, const char *zIn);
+SQLITE_API void sqlite3_str_appendchar(sqlite3_str*, int N, char C);
+SQLITE_API void sqlite3_str_reset(sqlite3_str*);
+
+/*
+** CAPI3REF: Status Of A Dynamic String
+** METHOD: sqlite3_str
+**
+** These interfaces return the current status of an [sqlite3_str] object.
+**
+** ^If any prior errors have occurred while constructing the dynamic string
+** in sqlite3_str X, then the [sqlite3_str_errcode(X)] method will return
+** an appropriate error code. ^The [sqlite3_str_errcode(X)] method returns
+** [SQLITE_NOMEM] following any out-of-memory error, or
+** [SQLITE_TOOBIG] if the size of the dynamic string exceeds
+** [SQLITE_MAX_LENGTH], or [SQLITE_OK] if there have been no errors.
+**
+** ^The [sqlite3_str_length(X)] method returns the current length, in bytes,
+** of the dynamic string under construction in [sqlite3_str] object X.
+** ^The length returned by [sqlite3_str_length(X)] does not include the
+** zero-termination byte.
+**
+** ^The [sqlite3_str_value(X)] method returns a pointer to the current
+** content of the dynamic string under construction in X. The value
+** returned by [sqlite3_str_value(X)] is managed by the sqlite3_str object X
+** and might be freed or altered by any subsequent method on the same
+** [sqlite3_str] object. Applications must not used the pointer returned
+** [sqlite3_str_value(X)] after any subsequent method call on the same
+** object. ^Applications may change the content of the string returned
+** by [sqlite3_str_value(X)] as long as they do not write into any bytes
+** outside the range of 0 to [sqlite3_str_length(X)] and do not read or
+** write any byte after any subsequent sqlite3_str method call.
+*/
+SQLITE_API int sqlite3_str_errcode(sqlite3_str*);
+SQLITE_API int sqlite3_str_length(sqlite3_str*);
+SQLITE_API char *sqlite3_str_value(sqlite3_str*);
/*
** CAPI3REF: SQLite Runtime Status
@@ -7257,6 +7503,15 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r
** highwater mark associated with SQLITE_DBSTATUS_CACHE_WRITE is always 0.
** </dd>
**
+** [[SQLITE_DBSTATUS_CACHE_SPILL]] ^(<dt>SQLITE_DBSTATUS_CACHE_SPILL</dt>
+** <dd>This parameter returns the number of dirty cache entries that have
+** been written to disk in the middle of a transaction due to the page
+** cache overflowing. Transactions are more efficient if they are written
+** to disk all at once. When pages spill mid-transaction, that introduces
+** additional overhead. This parameter can be used help identify
+** inefficiencies that can be resolve by increasing the cache size.
+** </dd>
+**
** [[SQLITE_DBSTATUS_DEFERRED_FKS]] ^(<dt>SQLITE_DBSTATUS_DEFERRED_FKS</dt>
** <dd>This parameter returns zero for the current value if and only if
** all foreign key constraints (deferred or immediate) have been
@@ -7276,7 +7531,8 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r
#define SQLITE_DBSTATUS_CACHE_WRITE 9
#define SQLITE_DBSTATUS_DEFERRED_FKS 10
#define SQLITE_DBSTATUS_CACHE_USED_SHARED 11
-#define SQLITE_DBSTATUS_MAX 11 /* Largest defined DBSTATUS */
+#define SQLITE_DBSTATUS_CACHE_SPILL 12
+#define SQLITE_DBSTATUS_MAX 12 /* Largest defined DBSTATUS */
/*
@@ -8277,6 +8533,40 @@ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...);
SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *);
/*
+** CAPI3REF: Determine If Virtual Table Column Access Is For UPDATE
+**
+** If the sqlite3_vtab_nochange(X) routine is called within the [xColumn]
+** method of a [virtual table], then it returns true if and only if the
+** column is being fetched as part of an UPDATE operation during which the
+** column value will not change. Applications might use this to substitute
+** a return value that is less expensive to compute and that the corresponding
+** [xUpdate] method understands as a "no-change" value.
+**
+** If the [xColumn] method calls sqlite3_vtab_nochange() and finds that
+** the column is not changed by the UPDATE statement, then the xColumn
+** method can optionally return without setting a result, without calling
+** any of the [sqlite3_result_int|sqlite3_result_xxxxx() interfaces].
+** In that case, [sqlite3_value_nochange(X)] will return true for the
+** same column in the [xUpdate] method.
+*/
+SQLITE_API int sqlite3_vtab_nochange(sqlite3_context*);
+
+/*
+** CAPI3REF: Determine The Collation For a Virtual Table Constraint
+**
+** This function may only be called from within a call to the [xBestIndex]
+** method of a [virtual table].
+**
+** The first argument must be the sqlite3_index_info object that is the
+** first parameter to the xBestIndex() method. The second argument must be
+** an index into the aConstraint[] array belonging to the sqlite3_index_info
+** structure passed to xBestIndex. This function returns a pointer to a buffer
+** containing the name of the collation sequence for the corresponding
+** constraint.
+*/
+SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_info*,int);
+
+/*
** CAPI3REF: Conflict resolution modes
** KEYWORDS: {conflict resolution mode}
**
@@ -8723,6 +9013,128 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp(
SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb);
/*
+** CAPI3REF: Serialize a database
+**
+** The sqlite3_serialize(D,S,P,F) interface returns a pointer to memory
+** that is a serialization of the S database on [database connection] D.
+** If P is not a NULL pointer, then the size of the database in bytes
+** is written into *P.
+**
+** For an ordinary on-disk database file, the serialization is just a
+** copy of the disk file. For an in-memory database or a "TEMP" database,
+** the serialization is the same sequence of bytes which would be written
+** to disk if that database where backed up to disk.
+**
+** The usual case is that sqlite3_serialize() copies the serialization of
+** the database into memory obtained from [sqlite3_malloc64()] and returns
+** a pointer to that memory. The caller is responsible for freeing the
+** returned value to avoid a memory leak. However, if the F argument
+** contains the SQLITE_SERIALIZE_NOCOPY bit, then no memory allocations
+** are made, and the sqlite3_serialize() function will return a pointer
+** to the contiguous memory representation of the database that SQLite
+** is currently using for that database, or NULL if the no such contiguous
+** memory representation of the database exists. A contiguous memory
+** representation of the database will usually only exist if there has
+** been a prior call to [sqlite3_deserialize(D,S,...)] with the same
+** values of D and S.
+** The size of the database is written into *P even if the
+** SQLITE_SERIALIZE_NOCOPY bit is set but no contiguous copy
+** of the database exists.
+**
+** A call to sqlite3_serialize(D,S,P,F) might return NULL even if the
+** SQLITE_SERIALIZE_NOCOPY bit is omitted from argument F if a memory
+** allocation error occurs.
+**
+** This interface is only available if SQLite is compiled with the
+** [SQLITE_ENABLE_DESERIALIZE] option.
+*/
+SQLITE_API unsigned char *sqlite3_serialize(
+ sqlite3 *db, /* The database connection */
+ const char *zSchema, /* Which DB to serialize. ex: "main", "temp", ... */
+ sqlite3_int64 *piSize, /* Write size of the DB here, if not NULL */
+ unsigned int mFlags /* Zero or more SQLITE_SERIALIZE_* flags */
+);
+
+/*
+** CAPI3REF: Flags for sqlite3_serialize
+**
+** Zero or more of the following constants can be OR-ed together for
+** the F argument to [sqlite3_serialize(D,S,P,F)].
+**
+** SQLITE_SERIALIZE_NOCOPY means that [sqlite3_serialize()] will return
+** a pointer to contiguous in-memory database that it is currently using,
+** without making a copy of the database. If SQLite is not currently using
+** a contiguous in-memory database, then this option causes
+** [sqlite3_serialize()] to return a NULL pointer. SQLite will only be
+** using a contiguous in-memory database if it has been initialized by a
+** prior call to [sqlite3_deserialize()].
+*/
+#define SQLITE_SERIALIZE_NOCOPY 0x001 /* Do no memory allocations */
+
+/*
+** CAPI3REF: Deserialize a database
+**
+** The sqlite3_deserialize(D,S,P,N,M,F) interface causes the
+** [database connection] D to disconnect from database S and then
+** reopen S as an in-memory database based on the serialization contained
+** in P. The serialized database P is N bytes in size. M is the size of
+** the buffer P, which might be larger than N. If M is larger than N, and
+** the SQLITE_DESERIALIZE_READONLY bit is not set in F, then SQLite is
+** permitted to add content to the in-memory database as long as the total
+** size does not exceed M bytes.
+**
+** If the SQLITE_DESERIALIZE_FREEONCLOSE bit is set in F, then SQLite will
+** invoke sqlite3_free() on the serialization buffer when the database
+** connection closes. If the SQLITE_DESERIALIZE_RESIZEABLE bit is set, then
+** SQLite will try to increase the buffer size using sqlite3_realloc64()
+** if writes on the database cause it to grow larger than M bytes.
+**
+** The sqlite3_deserialize() interface will fail with SQLITE_BUSY if the
+** database is currently in a read transaction or is involved in a backup
+** operation.
+**
+** If sqlite3_deserialize(D,S,P,N,M,F) fails for any reason and if the
+** SQLITE_DESERIALIZE_FREEONCLOSE bit is set in argument F, then
+** [sqlite3_free()] is invoked on argument P prior to returning.
+**
+** This interface is only available if SQLite is compiled with the
+** [SQLITE_ENABLE_DESERIALIZE] option.
+*/
+SQLITE_API int sqlite3_deserialize(
+ sqlite3 *db, /* The database connection */
+ const char *zSchema, /* Which DB to reopen with the deserialization */
+ unsigned char *pData, /* The serialized database content */
+ sqlite3_int64 szDb, /* Number bytes in the deserialization */
+ sqlite3_int64 szBuf, /* Total size of buffer pData[] */
+ unsigned mFlags /* Zero or more SQLITE_DESERIALIZE_* flags */
+);
+
+/*
+** CAPI3REF: Flags for sqlite3_deserialize()
+**
+** The following are allowed values for 6th argument (the F argument) to
+** the [sqlite3_deserialize(D,S,P,N,M,F)] interface.
+**
+** The SQLITE_DESERIALIZE_FREEONCLOSE means that the database serialization
+** in the P argument is held in memory obtained from [sqlite3_malloc64()]
+** and that SQLite should take ownership of this memory and automatically
+** free it when it has finished using it. Without this flag, the caller
+** is resposible for freeing any dynamically allocated memory.
+**
+** The SQLITE_DESERIALIZE_RESIZEABLE flag means that SQLite is allowed to
+** grow the size of the database using calls to [sqlite3_realloc64()]. This
+** flag should only be used if SQLITE_DESERIALIZE_FREEONCLOSE is also used.
+** Without this flag, the deserialized database cannot increase in size beyond
+** the number of bytes specified by the M parameter.
+**
+** The SQLITE_DESERIALIZE_READONLY flag means that the deserialized database
+** should be treated as read-only.
+*/
+#define SQLITE_DESERIALIZE_FREEONCLOSE 1 /* Call sqlite3_free() on close */
+#define SQLITE_DESERIALIZE_RESIZEABLE 2 /* Resize using sqlite3_realloc64() */
+#define SQLITE_DESERIALIZE_READONLY 4 /* Database is read-only */
+
+/*
** Undo the hack that converts floating point types to integer for
** builds on processors without floating point support.
*/
@@ -8869,16 +9281,23 @@ extern "C" {
/*
** CAPI3REF: Session Object Handle
+**
+** An instance of this object is a [session] that can be used to
+** record changes to a database.
*/
typedef struct sqlite3_session sqlite3_session;
/*
** CAPI3REF: Changeset Iterator Handle
+**
+** An instance of this object acts as a cursor for iterating
+** over the elements of a [changeset] or [patchset].
*/
typedef struct sqlite3_changeset_iter sqlite3_changeset_iter;
/*
** CAPI3REF: Create A New Session Object
+** CONSTRUCTOR: sqlite3_session
**
** Create a new session object attached to database handle db. If successful,
** a pointer to the new object is written to *ppSession and SQLITE_OK is
@@ -8915,6 +9334,7 @@ SQLITE_API int sqlite3session_create(
/*
** CAPI3REF: Delete A Session Object
+** DESTRUCTOR: sqlite3_session
**
** Delete a session object previously allocated using
** [sqlite3session_create()]. Once a session object has been deleted, the
@@ -8930,6 +9350,7 @@ SQLITE_API void sqlite3session_delete(sqlite3_session *pSession);
/*
** CAPI3REF: Enable Or Disable A Session Object
+** METHOD: sqlite3_session
**
** Enable or disable the recording of changes by a session object. When
** enabled, a session object records changes made to the database. When
@@ -8949,6 +9370,7 @@ SQLITE_API int sqlite3session_enable(sqlite3_session *pSession, int bEnable);
/*
** CAPI3REF: Set Or Clear the Indirect Change Flag
+** METHOD: sqlite3_session
**
** Each change recorded by a session object is marked as either direct or
** indirect. A change is marked as indirect if either:
@@ -8978,6 +9400,7 @@ SQLITE_API int sqlite3session_indirect(sqlite3_session *pSession, int bIndirect)
/*
** CAPI3REF: Attach A Table To A Session Object
+** METHOD: sqlite3_session
**
** If argument zTab is not NULL, then it is the name of a table to attach
** to the session object passed as the first argument. All subsequent changes
@@ -9003,6 +9426,35 @@ SQLITE_API int sqlite3session_indirect(sqlite3_session *pSession, int bIndirect)
**
** SQLITE_OK is returned if the call completes without error. Or, if an error
** occurs, an SQLite error code (e.g. SQLITE_NOMEM) is returned.
+**
+** <h3>Special sqlite_stat1 Handling</h3>
+**
+** As of SQLite version 3.22.0, the "sqlite_stat1" table is an exception to
+** some of the rules above. In SQLite, the schema of sqlite_stat1 is:
+** <pre>
+** &nbsp; CREATE TABLE sqlite_stat1(tbl,idx,stat)
+** </pre>
+**
+** Even though sqlite_stat1 does not have a PRIMARY KEY, changes are
+** recorded for it as if the PRIMARY KEY is (tbl,idx). Additionally, changes
+** are recorded for rows for which (idx IS NULL) is true. However, for such
+** rows a zero-length blob (SQL value X'') is stored in the changeset or
+** patchset instead of a NULL value. This allows such changesets to be
+** manipulated by legacy implementations of sqlite3changeset_invert(),
+** concat() and similar.
+**
+** The sqlite3changeset_apply() function automatically converts the
+** zero-length blob back to a NULL value when updating the sqlite_stat1
+** table. However, if the application calls sqlite3changeset_new(),
+** sqlite3changeset_old() or sqlite3changeset_conflict on a changeset
+** iterator directly (including on a changeset iterator passed to a
+** conflict-handler callback) then the X'' value is returned. The application
+** must translate X'' to NULL itself if required.
+**
+** Legacy (older than 3.22.0) versions of the sessions module cannot capture
+** changes made to the sqlite_stat1 table. Legacy versions of the
+** sqlite3changeset_apply() function silently ignore any modifications to the
+** sqlite_stat1 table that are part of a changeset or patchset.
*/
SQLITE_API int sqlite3session_attach(
sqlite3_session *pSession, /* Session object */
@@ -9011,6 +9463,7 @@ SQLITE_API int sqlite3session_attach(
/*
** CAPI3REF: Set a table filter on a Session Object.
+** METHOD: sqlite3_session
**
** The second argument (xFilter) is the "filter callback". For changes to rows
** in tables that are not attached to the Session object, the filter is called
@@ -9029,6 +9482,7 @@ SQLITE_API void sqlite3session_table_filter(
/*
** CAPI3REF: Generate A Changeset From A Session Object
+** METHOD: sqlite3_session
**
** Obtain a changeset containing changes to the tables attached to the
** session object passed as the first argument. If successful,
@@ -9138,7 +9592,8 @@ SQLITE_API int sqlite3session_changeset(
);
/*
-** CAPI3REF: Load The Difference Between Tables Into A Session
+** CAPI3REF: Load The Difference Between Tables Into A Session
+** METHOD: sqlite3_session
**
** If it is not already attached to the session object passed as the first
** argument, this function attaches table zTbl in the same manner as the
@@ -9203,6 +9658,7 @@ SQLITE_API int sqlite3session_diff(
/*
** CAPI3REF: Generate A Patchset From A Session Object
+** METHOD: sqlite3_session
**
** The differences between a patchset and a changeset are that:
**
@@ -9254,6 +9710,7 @@ SQLITE_API int sqlite3session_isempty(sqlite3_session *pSession);
/*
** CAPI3REF: Create An Iterator To Traverse A Changeset
+** CONSTRUCTOR: sqlite3_changeset_iter
**
** Create an iterator used to iterate through the contents of a changeset.
** If successful, *pp is set to point to the iterator handle and SQLITE_OK
@@ -9294,6 +9751,7 @@ SQLITE_API int sqlite3changeset_start(
/*
** CAPI3REF: Advance A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** This function may only be used with iterators created by function
** [sqlite3changeset_start()]. If it is called on an iterator passed to
@@ -9318,6 +9776,7 @@ SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *pIter);
/*
** CAPI3REF: Obtain The Current Operation From A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** The pIter argument passed to this function may either be an iterator
** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator
@@ -9352,6 +9811,7 @@ SQLITE_API int sqlite3changeset_op(
/*
** CAPI3REF: Obtain The Primary Key Definition Of A Table
+** METHOD: sqlite3_changeset_iter
**
** For each modified table, a changeset includes the following:
**
@@ -9383,6 +9843,7 @@ SQLITE_API int sqlite3changeset_pk(
/*
** CAPI3REF: Obtain old.* Values From A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** The pIter argument passed to this function may either be an iterator
** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator
@@ -9413,6 +9874,7 @@ SQLITE_API int sqlite3changeset_old(
/*
** CAPI3REF: Obtain new.* Values From A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** The pIter argument passed to this function may either be an iterator
** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator
@@ -9446,6 +9908,7 @@ SQLITE_API int sqlite3changeset_new(
/*
** CAPI3REF: Obtain Conflicting Row Values From A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** This function should only be used with iterator objects passed to a
** conflict-handler callback by [sqlite3changeset_apply()] with either
@@ -9473,6 +9936,7 @@ SQLITE_API int sqlite3changeset_conflict(
/*
** CAPI3REF: Determine The Number Of Foreign Key Constraint Violations
+** METHOD: sqlite3_changeset_iter
**
** This function may only be called with an iterator passed to an
** SQLITE_CHANGESET_FOREIGN_KEY conflict handler callback. In this case
@@ -9489,6 +9953,7 @@ SQLITE_API int sqlite3changeset_fk_conflicts(
/*
** CAPI3REF: Finalize A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** This function is used to finalize an iterator allocated with
** [sqlite3changeset_start()].
@@ -9505,6 +9970,7 @@ SQLITE_API int sqlite3changeset_fk_conflicts(
** to that error is returned by this function. Otherwise, SQLITE_OK is
** returned. This is to allow the following pattern (pseudo-code):
**
+** <pre>
** sqlite3changeset_start();
** while( SQLITE_ROW==sqlite3changeset_next() ){
** // Do something with change.
@@ -9513,6 +9979,7 @@ SQLITE_API int sqlite3changeset_fk_conflicts(
** if( rc!=SQLITE_OK ){
** // An error has occurred
** }
+** </pre>
*/
SQLITE_API int sqlite3changeset_finalize(sqlite3_changeset_iter *pIter);
@@ -9560,6 +10027,7 @@ SQLITE_API int sqlite3changeset_invert(
** sqlite3_changegroup object. Calling it produces similar results as the
** following code fragment:
**
+** <pre>
** sqlite3_changegroup *pGrp;
** rc = sqlite3_changegroup_new(&pGrp);
** if( rc==SQLITE_OK ) rc = sqlite3changegroup_add(pGrp, nA, pA);
@@ -9570,6 +10038,7 @@ SQLITE_API int sqlite3changeset_invert(
** *ppOut = 0;
** *pnOut = 0;
** }
+** </pre>
**
** Refer to the sqlite3_changegroup documentation below for details.
*/
@@ -9585,11 +10054,15 @@ SQLITE_API int sqlite3changeset_concat(
/*
** CAPI3REF: Changegroup Handle
+**
+** A changegroup is an object used to combine two or more
+** [changesets] or [patchsets]
*/
typedef struct sqlite3_changegroup sqlite3_changegroup;
/*
** CAPI3REF: Create A New Changegroup Object
+** CONSTRUCTOR: sqlite3_changegroup
**
** An sqlite3_changegroup object is used to combine two or more changesets
** (or patchsets) into a single changeset (or patchset). A single changegroup
@@ -9627,6 +10100,7 @@ SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp);
/*
** CAPI3REF: Add A Changeset To A Changegroup
+** METHOD: sqlite3_changegroup
**
** Add all changes within the changeset (or patchset) in buffer pData (size
** nData bytes) to the changegroup.
@@ -9704,6 +10178,7 @@ SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pDa
/*
** CAPI3REF: Obtain A Composite Changeset From A Changegroup
+** METHOD: sqlite3_changegroup
**
** Obtain a buffer containing a changeset (or patchset) representing the
** current contents of the changegroup. If the inputs to the changegroup
@@ -9734,25 +10209,25 @@ SQLITE_API int sqlite3changegroup_output(
/*
** CAPI3REF: Delete A Changegroup Object
+** DESTRUCTOR: sqlite3_changegroup
*/
SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*);
/*
** CAPI3REF: Apply A Changeset To A Database
**
-** Apply a changeset to a database. This function attempts to update the
-** "main" database attached to handle db with the changes found in the
-** changeset passed via the second and third arguments.
+** Apply a changeset or patchset to a database. These functions attempt to
+** update the "main" database attached to handle db with the changes found in
+** the changeset passed via the second and third arguments.
**
-** The fourth argument (xFilter) passed to this function is the "filter
+** The fourth argument (xFilter) passed to these functions is the "filter
** callback". If it is not NULL, then for each table affected by at least one
** change in the changeset, the filter callback is invoked with
** the table name as the second argument, and a copy of the context pointer
-** passed as the sixth argument to this function as the first. If the "filter
-** callback" returns zero, then no attempt is made to apply any changes to
-** the table. Otherwise, if the return value is non-zero or the xFilter
-** argument to this function is NULL, all changes related to the table are
-** attempted.
+** passed as the sixth argument as the first. If the "filter callback"
+** returns zero, then no attempt is made to apply any changes to the table.
+** Otherwise, if the return value is non-zero or the xFilter argument to
+** is NULL, all changes related to the table are attempted.
**
** For each table that is not excluded by the filter callback, this function
** tests that the target database contains a compatible table. A table is
@@ -9797,7 +10272,7 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*);
**
** <dl>
** <dt>DELETE Changes<dd>
-** For each DELETE change, this function checks if the target database
+** For each DELETE change, the function checks if the target database
** contains a row with the same primary key value (or values) as the
** original row values stored in the changeset. If it does, and the values
** stored in all non-primary key columns also match the values stored in
@@ -9842,7 +10317,7 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*);
** [SQLITE_CHANGESET_REPLACE].
**
** <dt>UPDATE Changes<dd>
-** For each UPDATE change, this function checks if the target database
+** For each UPDATE change, the function checks if the target database
** contains a row with the same primary key value (or values) as the
** original row values stored in the changeset. If it does, and the values
** stored in all modified non-primary key columns also match the values
@@ -9873,11 +10348,28 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*);
** This can be used to further customize the applications conflict
** resolution strategy.
**
-** All changes made by this function are enclosed in a savepoint transaction.
+** All changes made by these functions are enclosed in a savepoint transaction.
** If any other error (aside from a constraint failure when attempting to
** write to the target database) occurs, then the savepoint transaction is
** rolled back, restoring the target database to its original state, and an
** SQLite error code returned.
+**
+** If the output parameters (ppRebase) and (pnRebase) are non-NULL and
+** the input is a changeset (not a patchset), then sqlite3changeset_apply_v2()
+** may set (*ppRebase) to point to a "rebase" that may be used with the
+** sqlite3_rebaser APIs buffer before returning. In this case (*pnRebase)
+** is set to the size of the buffer in bytes. It is the responsibility of the
+** caller to eventually free any such buffer using sqlite3_free(). The buffer
+** is only allocated and populated if one or more conflicts were encountered
+** while applying the patchset. See comments surrounding the sqlite3_rebaser
+** APIs for further details.
+**
+** The behavior of sqlite3changeset_apply_v2() and its streaming equivalent
+** may be modified by passing a combination of
+** [SQLITE_CHANGESETAPPLY_NOSAVEPOINT | supported flags] as the 9th parameter.
+**
+** Note that the sqlite3changeset_apply_v2() API is still <b>experimental</b>
+** and therefore subject to change.
*/
SQLITE_API int sqlite3changeset_apply(
sqlite3 *db, /* Apply change to "main" db of this handle */
@@ -9894,6 +10386,41 @@ SQLITE_API int sqlite3changeset_apply(
),
void *pCtx /* First argument passed to xConflict */
);
+SQLITE_API int sqlite3changeset_apply_v2(
+ sqlite3 *db, /* Apply change to "main" db of this handle */
+ int nChangeset, /* Size of changeset in bytes */
+ void *pChangeset, /* Changeset blob */
+ int(*xFilter)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ const char *zTab /* Table name */
+ ),
+ int(*xConflict)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */
+ sqlite3_changeset_iter *p /* Handle describing change and conflict */
+ ),
+ void *pCtx, /* First argument passed to xConflict */
+ void **ppRebase, int *pnRebase, /* OUT: Rebase data */
+ int flags /* Combination of SESSION_APPLY_* flags */
+);
+
+/*
+** CAPI3REF: Flags for sqlite3changeset_apply_v2
+**
+** The following flags may passed via the 9th parameter to
+** [sqlite3changeset_apply_v2] and [sqlite3changeset_apply_v2_strm]:
+**
+** <dl>
+** <dt>SQLITE_CHANGESETAPPLY_NOSAVEPOINT <dd>
+** Usually, the sessions module encloses all operations performed by
+** a single call to apply_v2() or apply_v2_strm() in a [SAVEPOINT]. The
+** SAVEPOINT is committed if the changeset or patchset is successfully
+** applied, or rolled back if an error occurs. Specifying this flag
+** causes the sessions module to omit this savepoint. In this case, if the
+** caller has an open transaction or savepoint when apply_v2() is called,
+** it may revert the partially applied changeset by rolling it back.
+*/
+#define SQLITE_CHANGESETAPPLY_NOSAVEPOINT 0x0001
/*
** CAPI3REF: Constants Passed To The Conflict Handler
@@ -9991,6 +10518,161 @@ SQLITE_API int sqlite3changeset_apply(
#define SQLITE_CHANGESET_REPLACE 1
#define SQLITE_CHANGESET_ABORT 2
+/*
+** CAPI3REF: Rebasing changesets
+** EXPERIMENTAL
+**
+** Suppose there is a site hosting a database in state S0. And that
+** modifications are made that move that database to state S1 and a
+** changeset recorded (the "local" changeset). Then, a changeset based
+** on S0 is received from another site (the "remote" changeset) and
+** applied to the database. The database is then in state
+** (S1+"remote"), where the exact state depends on any conflict
+** resolution decisions (OMIT or REPLACE) made while applying "remote".
+** Rebasing a changeset is to update it to take those conflict
+** resolution decisions into account, so that the same conflicts
+** do not have to be resolved elsewhere in the network.
+**
+** For example, if both the local and remote changesets contain an
+** INSERT of the same key on "CREATE TABLE t1(a PRIMARY KEY, b)":
+**
+** local: INSERT INTO t1 VALUES(1, 'v1');
+** remote: INSERT INTO t1 VALUES(1, 'v2');
+**
+** and the conflict resolution is REPLACE, then the INSERT change is
+** removed from the local changeset (it was overridden). Or, if the
+** conflict resolution was "OMIT", then the local changeset is modified
+** to instead contain:
+**
+** UPDATE t1 SET b = 'v2' WHERE a=1;
+**
+** Changes within the local changeset are rebased as follows:
+**
+** <dl>
+** <dt>Local INSERT<dd>
+** This may only conflict with a remote INSERT. If the conflict
+** resolution was OMIT, then add an UPDATE change to the rebased
+** changeset. Or, if the conflict resolution was REPLACE, add
+** nothing to the rebased changeset.
+**
+** <dt>Local DELETE<dd>
+** This may conflict with a remote UPDATE or DELETE. In both cases the
+** only possible resolution is OMIT. If the remote operation was a
+** DELETE, then add no change to the rebased changeset. If the remote
+** operation was an UPDATE, then the old.* fields of change are updated
+** to reflect the new.* values in the UPDATE.
+**
+** <dt>Local UPDATE<dd>
+** This may conflict with a remote UPDATE or DELETE. If it conflicts
+** with a DELETE, and the conflict resolution was OMIT, then the update
+** is changed into an INSERT. Any undefined values in the new.* record
+** from the update change are filled in using the old.* values from
+** the conflicting DELETE. Or, if the conflict resolution was REPLACE,
+** the UPDATE change is simply omitted from the rebased changeset.
+**
+** If conflict is with a remote UPDATE and the resolution is OMIT, then
+** the old.* values are rebased using the new.* values in the remote
+** change. Or, if the resolution is REPLACE, then the change is copied
+** into the rebased changeset with updates to columns also updated by
+** the conflicting remote UPDATE removed. If this means no columns would
+** be updated, the change is omitted.
+** </dl>
+**
+** A local change may be rebased against multiple remote changes
+** simultaneously. If a single key is modified by multiple remote
+** changesets, they are combined as follows before the local changeset
+** is rebased:
+**
+** <ul>
+** <li> If there has been one or more REPLACE resolutions on a
+** key, it is rebased according to a REPLACE.
+**
+** <li> If there have been no REPLACE resolutions on a key, then
+** the local changeset is rebased according to the most recent
+** of the OMIT resolutions.
+** </ul>
+**
+** Note that conflict resolutions from multiple remote changesets are
+** combined on a per-field basis, not per-row. This means that in the
+** case of multiple remote UPDATE operations, some fields of a single
+** local change may be rebased for REPLACE while others are rebased for
+** OMIT.
+**
+** In order to rebase a local changeset, the remote changeset must first
+** be applied to the local database using sqlite3changeset_apply_v2() and
+** the buffer of rebase information captured. Then:
+**
+** <ol>
+** <li> An sqlite3_rebaser object is created by calling
+** sqlite3rebaser_create().
+** <li> The new object is configured with the rebase buffer obtained from
+** sqlite3changeset_apply_v2() by calling sqlite3rebaser_configure().
+** If the local changeset is to be rebased against multiple remote
+** changesets, then sqlite3rebaser_configure() should be called
+** multiple times, in the same order that the multiple
+** sqlite3changeset_apply_v2() calls were made.
+** <li> Each local changeset is rebased by calling sqlite3rebaser_rebase().
+** <li> The sqlite3_rebaser object is deleted by calling
+** sqlite3rebaser_delete().
+** </ol>
+*/
+typedef struct sqlite3_rebaser sqlite3_rebaser;
+
+/*
+** CAPI3REF: Create a changeset rebaser object.
+** EXPERIMENTAL
+**
+** Allocate a new changeset rebaser object. If successful, set (*ppNew) to
+** point to the new object and return SQLITE_OK. Otherwise, if an error
+** occurs, return an SQLite error code (e.g. SQLITE_NOMEM) and set (*ppNew)
+** to NULL.
+*/
+SQLITE_API int sqlite3rebaser_create(sqlite3_rebaser **ppNew);
+
+/*
+** CAPI3REF: Configure a changeset rebaser object.
+** EXPERIMENTAL
+**
+** Configure the changeset rebaser object to rebase changesets according
+** to the conflict resolutions described by buffer pRebase (size nRebase
+** bytes), which must have been obtained from a previous call to
+** sqlite3changeset_apply_v2().
+*/
+SQLITE_API int sqlite3rebaser_configure(
+ sqlite3_rebaser*,
+ int nRebase, const void *pRebase
+);
+
+/*
+** CAPI3REF: Rebase a changeset
+** EXPERIMENTAL
+**
+** Argument pIn must point to a buffer containing a changeset nIn bytes
+** in size. This function allocates and populates a buffer with a copy
+** of the changeset rebased rebased according to the configuration of the
+** rebaser object passed as the first argument. If successful, (*ppOut)
+** is set to point to the new buffer containing the rebased changset and
+** (*pnOut) to its size in bytes and SQLITE_OK returned. It is the
+** responsibility of the caller to eventually free the new buffer using
+** sqlite3_free(). Otherwise, if an error occurs, (*ppOut) and (*pnOut)
+** are set to zero and an SQLite error code returned.
+*/
+SQLITE_API int sqlite3rebaser_rebase(
+ sqlite3_rebaser*,
+ int nIn, const void *pIn,
+ int *pnOut, void **ppOut
+);
+
+/*
+** CAPI3REF: Delete a changeset rebaser object.
+** EXPERIMENTAL
+**
+** Delete the changeset rebaser object and all associated resources. There
+** should be one call to this function for each successful invocation
+** of sqlite3rebaser_create().
+*/
+SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p);
+
/*
** CAPI3REF: Streaming Versions of API functions.
**
@@ -10000,6 +10682,7 @@ SQLITE_API int sqlite3changeset_apply(
** <table border=1 style="margin-left:8ex;margin-right:8ex">
** <tr><th>Streaming function<th>Non-streaming equivalent</th>
** <tr><td>sqlite3changeset_apply_strm<td>[sqlite3changeset_apply]
+** <tr><td>sqlite3changeset_apply_strm_v2<td>[sqlite3changeset_apply_v2]
** <tr><td>sqlite3changeset_concat_strm<td>[sqlite3changeset_concat]
** <tr><td>sqlite3changeset_invert_strm<td>[sqlite3changeset_invert]
** <tr><td>sqlite3changeset_start_strm<td>[sqlite3changeset_start]
@@ -10095,6 +10778,23 @@ SQLITE_API int sqlite3changeset_apply_strm(
),
void *pCtx /* First argument passed to xConflict */
);
+SQLITE_API int sqlite3changeset_apply_v2_strm(
+ sqlite3 *db, /* Apply change to "main" db of this handle */
+ int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */
+ void *pIn, /* First arg for xInput */
+ int(*xFilter)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ const char *zTab /* Table name */
+ ),
+ int(*xConflict)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */
+ sqlite3_changeset_iter *p /* Handle describing change and conflict */
+ ),
+ void *pCtx, /* First argument passed to xConflict */
+ void **ppRebase, int *pnRebase,
+ int flags
+);
SQLITE_API int sqlite3changeset_concat_strm(
int (*xInputA)(void *pIn, void *pData, int *pnData),
void *pInA,
@@ -10132,6 +10832,13 @@ SQLITE_API int sqlite3changegroup_output_strm(sqlite3_changegroup*,
int (*xOutput)(void *pOut, const void *pData, int nData),
void *pOut
);
+SQLITE_API int sqlite3rebaser_rebase_strm(
+ sqlite3_rebaser *pRebaser,
+ int (*xInput)(void *pIn, void *pData, int *pnData),
+ void *pIn,
+ int (*xOutput)(void *pOut, const void *pData, int nData),
+ void *pOut
+);
/*
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index ac60b1b66..6db99a49e 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -2,12 +2,13 @@
if(NOT TOKEN_AUTH_ONLY)
endif()
-set(synclib_NAME ${APPLICATION_EXECUTABLE}sync)
-
find_package(Qt5 5.6 COMPONENTS Core Network Xml Concurrent REQUIRED)
if (Qt5Core_VERSION VERSION_LESS 5.9.0)
message(STATUS "For HTTP/2 support, compile with Qt 5.9 or higher.")
endif()
+get_target_property (QT_QMAKE_EXECUTABLE Qt5::qmake IMPORTED_LOCATION)
+message(STATUS "Using Qt ${Qt5Core_VERSION} (${QT_QMAKE_EXECUTABLE})")
+
if(NOT TOKEN_AUTH_ONLY)
find_package(Qt5Keychain REQUIRED)
diff --git a/src/cmd/CMakeLists.txt b/src/cmd/CMakeLists.txt
index 449313668..76b1c75db 100644
--- a/src/cmd/CMakeLists.txt
+++ b/src/cmd/CMakeLists.txt
@@ -16,13 +16,11 @@ if(UNIX AND NOT APPLE)
endif()
if(NOT BUILD_LIBRARIES_ONLY)
- add_executable(${cmd_NAME} ${cmd_SRC})
- set_target_properties(${cmd_NAME} PROPERTIES
- RUNTIME_OUTPUT_DIRECTORY ${BIN_OUTPUT_DIRECTORY} )
- set_target_properties(${cmd_NAME} PROPERTIES
- INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}/${APPLICATION_EXECUTABLE};${CMAKE_INSTALL_RPATH}" )
+ add_executable(${cmd_NAME} ${cmd_SRC})
+ set_target_properties(${cmd_NAME} PROPERTIES
+ RUNTIME_OUTPUT_DIRECTORY ${BIN_OUTPUT_DIRECTORY} )
- target_link_libraries(${cmd_NAME} ocsync ${synclib_NAME} Qt5::Core Qt5::Network)
+ target_link_libraries(${cmd_NAME} "${csync_NAME}" "${synclib_NAME}" Qt5::Core Qt5::Network)
# Need tokenizer for netrc parser
target_include_directories(${cmd_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/src/3rdparty/qtokenizer)
diff --git a/src/cmd/cmd.cpp b/src/cmd/cmd.cpp
index 31cf99316..f6270fc7a 100644
--- a/src/cmd/cmd.cpp
+++ b/src/cmd/cmd.cpp
@@ -23,17 +23,16 @@
#include <QFileInfo>
#include <QJsonDocument>
#include <QJsonObject>
+#include <QNetworkProxy>
#include <qdebug.h>
#include "account.h"
-#include "clientproxy.h"
#include "configfile.h" // ONLY ACCESS THE STATIC FUNCTIONS!
#include "creds/httpcredentials.h"
#include "simplesslerrorhandler.h"
#include "syncengine.h"
#include "common/syncjournaldb.h"
#include "config.h"
-#include "connectionvalidator.h"
#include "cmd.h"
@@ -85,8 +84,6 @@ struct CmdOptions
// So we have to use a global variable
CmdOptions *opts = 0;
-const qint64 timeoutToUseMsec = qMax(1000, ConnectionValidator::DefaultCallingIntervalMsec - 5 * 1000);
-
class EchoDisabler
{
public:
@@ -337,7 +334,6 @@ int main(int argc, char **argv)
options.downlimit = 0;
options.deltasync = false;
options.deltasyncminfilesize = 10 * 1024 * 1024;
- ClientProxy clientProxy;
parseOptions(app.arguments(), &options);
@@ -449,8 +445,6 @@ int main(int argc, char **argv)
} else {
qFatal("Could not read httpproxy. The proxy should have the format \"http://hostname:port\".");
}
- } else {
- clientProxy.setupQtProxyFromConfig();
}
SimpleSslErrorHandler *sslErrorHandler = new SimpleSslErrorHandler;
@@ -464,24 +458,29 @@ int main(int argc, char **argv)
account->setCredentials(cred);
account->setSslErrorHandler(sslErrorHandler);
- //obtain capabilities using event loop
- QEventLoop loop;
-
- JsonApiJob *job = new JsonApiJob(account, QLatin1String("ocs/v1.php/cloud/capabilities"));
- job->setTimeout(timeoutToUseMsec);
- QObject::connect(job, &JsonApiJob::jsonReceived, [&](const QJsonDocument &json) {
- auto caps = json.object().value("ocs").toObject().value("data").toObject().value("capabilities").toObject();
- qDebug() << "Server capabilities" << caps;
- account->setCapabilities(caps.toVariantMap());
- loop.quit();
- });
- job->start();
-
- loop.exec();
-
- if (job->reply()->error() != QNetworkReply::NoError){
- std::cout<<"Error connecting to server\n";
- return EXIT_FAILURE;
+ // Perform a call to get the capabilities.
+ if (!options.nonShib) {
+ // Do not do it if '--nonshib' was passed. This mean we should only connect to the 'nonshib'
+ // dav endpoint. Since we do not get the capabilities, in that case, this has the additional
+ // side effect that chunking-ng will be disabled. (because otherwise it would use the new
+ // 'dav' endpoint instead of the nonshib one (which still use the old chunking)
+
+ QEventLoop loop;
+ JsonApiJob *job = new JsonApiJob(account, QLatin1String("ocs/v1.php/cloud/capabilities"));
+ QObject::connect(job, &JsonApiJob::jsonReceived, [&](const QJsonDocument &json) {
+ auto caps = json.object().value("ocs").toObject().value("data").toObject().value("capabilities").toObject();
+ qDebug() << "Server capabilities" << caps;
+ account->setCapabilities(caps.toVariantMap());
+ loop.quit();
+ });
+ job->start();
+
+ loop.exec();
+
+ if (job->reply()->error() != QNetworkReply::NoError){
+ std::cout<<"Error connecting to server\n";
+ return EXIT_FAILURE;
+ }
}
// much lower age than the default since this utility is usually made to be run right after a change in the tests
diff --git a/src/common/checksums.cpp b/src/common/checksums.cpp
index 2e9f8c95c..bf4f83982 100644
--- a/src/common/checksums.cpp
+++ b/src/common/checksums.cpp
@@ -21,6 +21,11 @@
#include <QLoggingCategory>
#include <qtconcurrentrun.h>
+#include <QCryptographicHash>
+
+#ifdef ZLIB_FOUND
+#include <zlib.h>
+#endif
/** \file checksums.cpp
*
@@ -73,6 +78,8 @@
* - Adler32 (requires zlib)
* - MD5
* - SHA1
+ * - SHA256
+ * - SHA3-256 (requires Qt 5.9)
*
*/
@@ -80,6 +87,53 @@ namespace OCC {
Q_LOGGING_CATEGORY(lcChecksums, "sync.checksums", QtInfoMsg)
+#define BUFSIZE qint64(500 * 1024) // 500 KiB
+
+static QByteArray calcCryptoHash( const QString& filename, QCryptographicHash::Algorithm algo )
+{
+ QFile file(filename);
+ QByteArray arr;
+ QCryptographicHash crypto( algo );
+
+ if (file.open(QIODevice::ReadOnly)) {
+ if (crypto.addData(&file)) {
+ arr = crypto.result().toHex();
+ }
+ }
+ return arr;
+ }
+
+QByteArray calcMd5(const QString &filename)
+{
+ return calcCryptoHash(filename, QCryptographicHash::Md5);
+}
+
+QByteArray calcSha1(const QString &filename)
+{
+ return calcCryptoHash(filename, QCryptographicHash::Sha1);
+}
+
+#ifdef ZLIB_FOUND
+QByteArray calcAdler32(const QString &filename)
+{
+ QFile file(filename);
+ const qint64 bufSize = qMin(BUFSIZE, file.size() + 1);
+ QByteArray buf(bufSize, Qt::Uninitialized);
+
+ unsigned int adler = adler32(0L, Z_NULL, 0);
+ if (file.open(QIODevice::ReadOnly)) {
+ qint64 size;
+ while (!file.atEnd()) {
+ size = file.read(buf.data(), bufSize);
+ if (size > 0)
+ adler = adler32(adler, (const Bytef *)buf.data(), size);
+ }
+ }
+
+ return QByteArray::number(adler, 16);
+}
+#endif
+
QByteArray makeChecksumHeader(const QByteArray &checksumType, const QByteArray &checksum)
{
if (checksumType.isEmpty() || checksum.isEmpty())
@@ -94,7 +148,9 @@ QByteArray findBestChecksum(const QByteArray &checksums)
{
int i = 0;
// The order of the searches here defines the preference ordering.
- if (-1 != (i = checksums.indexOf("SHA1:"))
+ if (-1 != (i = checksums.indexOf("SHA3-256:"))
+ || -1 != (i = checksums.indexOf("SHA256:"))
+ || -1 != (i = checksums.indexOf("SHA1:"))
|| -1 != (i = checksums.indexOf("MD5:"))
|| -1 != (i = checksums.indexOf("Adler32:"))) {
// Now i is the start of the best checksum
@@ -188,13 +244,20 @@ QByteArray ComputeChecksum::computeNow(const QString &filePath, const QByteArray
}
if (checksumType == checkSumMD5C) {
- return FileSystem::calcMd5(filePath);
+ return calcMd5(filePath);
} else if (checksumType == checkSumSHA1C) {
- return FileSystem::calcSha1(filePath);
+ return calcSha1(filePath);
+ } else if (checksumType == checkSumSHA2C) {
+ return calcCryptoHash(filePath, QCryptographicHash::Sha256);
}
+#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)
+ else if (checksumType == checkSumSHA3C) {
+ return calcCryptoHash(filePath, QCryptographicHash::Sha3_256);
+ }
+#endif
#ifdef ZLIB_FOUND
else if (checksumType == checkSumAdlerC) {
- return FileSystem::calcAdler32(filePath);
+ return calcAdler32(filePath);
}
#endif
// for an unknown checksum or no checksum, we're done right now
diff --git a/src/common/checksums.h b/src/common/checksums.h
index 02cfbe8eb..6e98e0af5 100644
--- a/src/common/checksums.h
+++ b/src/common/checksums.h
@@ -19,6 +19,7 @@
#pragma once
#include "ocsynclib.h"
+#include "config.h"
#include <QObject>
#include <QByteArray>
@@ -32,6 +33,8 @@ namespace OCC {
*/
static const char checkSumMD5C[] = "MD5";
static const char checkSumSHA1C[] = "SHA1";
+static const char checkSumSHA2C[] = "SHA256";
+static const char checkSumSHA3C[] = "SHA3-256";
static const char checkSumAdlerC[] = "Adler32";
class SyncJournalDb;
@@ -61,6 +64,12 @@ OCSYNC_EXPORT bool uploadChecksumEnabled();
/// Checks OWNCLOUD_CONTENT_CHECKSUM_TYPE (default: SHA1)
OCSYNC_EXPORT QByteArray contentChecksumType();
+// Exported functions for the tests.
+QByteArray OCSYNC_EXPORT calcMd5(const QString &fileName);
+QByteArray OCSYNC_EXPORT calcSha1(const QString &fileName);
+#ifdef ZLIB_FOUND
+QByteArray OCSYNC_EXPORT calcAdler32(const QString &fileName);
+#endif
/**
* Computes the checksum of a file.
diff --git a/src/common/filesystembase.cpp b/src/common/filesystembase.cpp
index 0489356b2..a648c783f 100644
--- a/src/common/filesystembase.cpp
+++ b/src/common/filesystembase.cpp
@@ -22,16 +22,11 @@
#include <QDir>
#include <QUrl>
#include <QFile>
-#include <QCryptographicHash>
#include <QCoreApplication>
#include <sys/stat.h>
#include <sys/types.h>
-#ifdef ZLIB_FOUND
-#include <zlib.h>
-#endif
-
#ifdef Q_OS_WIN
#include <windows.h>
#include <windef.h>
@@ -272,10 +267,12 @@ bool FileSystem::openAndSeekFileSharedRead(QFile *file, QString *errorOrNull, qi
int fd = _open_osfhandle((intptr_t)fileHandle, _O_RDONLY);
if (fd == -1) {
error = "could not make fd from handle";
+ CloseHandle(fileHandle);
return false;
}
if (!file->open(fd, QIODevice::ReadOnly, QFile::AutoCloseHandle)) {
error = file->errorString();
+ _close(fd); // implicitly closes fileHandle
return false;
}
@@ -359,53 +356,6 @@ QString FileSystem::fileSystemForPath(const QString &path)
}
#endif
-#define BUFSIZE qint64(500 * 1024) // 500 KiB
-
-static QByteArray readToCrypto( const QString& filename, QCryptographicHash::Algorithm algo )
- {
- QFile file(filename);
- QByteArray arr;
- QCryptographicHash crypto( algo );
-
- if (file.open(QIODevice::ReadOnly)) {
- if (crypto.addData(&file)) {
- arr = crypto.result().toHex();
- }
- }
- return arr;
- }
-
-QByteArray FileSystem::calcMd5(const QString &filename)
-{
- return readToCrypto(filename, QCryptographicHash::Md5);
-}
-
-QByteArray FileSystem::calcSha1(const QString &filename)
-{
- return readToCrypto(filename, QCryptographicHash::Sha1);
-}
-
-#ifdef ZLIB_FOUND
-QByteArray FileSystem::calcAdler32(const QString &filename)
-{
- QFile file(filename);
- const qint64 bufSize = qMin(BUFSIZE, file.size() + 1);
- QByteArray buf(bufSize, Qt::Uninitialized);
-
- unsigned int adler = adler32(0L, Z_NULL, 0);
- if (file.open(QIODevice::ReadOnly)) {
- qint64 size;
- while (!file.atEnd()) {
- size = file.read(buf.data(), bufSize);
- if (size > 0)
- adler = adler32(adler, (const Bytef *)buf.data(), size);
- }
- }
-
- return QByteArray::number(adler, 16);
-}
-#endif
-
bool FileSystem::remove(const QString &fileName, QString *errorString)
{
#ifdef Q_OS_WIN
@@ -537,4 +487,22 @@ bool FileSystem::isLnkFile(const QString &filename)
return filename.endsWith(".lnk");
}
+bool FileSystem::isJunction(const QString &filename)
+{
+#ifdef Q_OS_WIN
+ WIN32_FIND_DATA findData;
+ HANDLE hFind = FindFirstFileEx((const wchar_t *)filename.utf16(), FindExInfoBasic, &findData, FindExSearchNameMatch, NULL, 0);
+ if (hFind != INVALID_HANDLE_VALUE) {
+ FindClose(hFind);
+ return false;
+ }
+ return findData.dwFileAttributes != INVALID_FILE_ATTRIBUTES
+ && findData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT
+ && findData.dwReserved0 == IO_REPARSE_TAG_MOUNT_POINT;
+#else
+ Q_UNUSED(filename);
+ return false;
+#endif
+}
+
} // namespace OCC
diff --git a/src/common/filesystembase.h b/src/common/filesystembase.h
index b3c8f04b7..b1b66b76b 100644
--- a/src/common/filesystembase.h
+++ b/src/common/filesystembase.h
@@ -130,19 +130,21 @@ namespace FileSystem {
QString fileSystemForPath(const QString &path);
#endif
- QByteArray OCSYNC_EXPORT calcMd5(const QString &fileName);
- QByteArray OCSYNC_EXPORT calcSha1(const QString &fileName);
-#ifdef ZLIB_FOUND
- QByteArray OCSYNC_EXPORT calcAdler32(const QString &fileName);
-#endif
-
/**
* Returns true when a file is locked. (Windows only)
*/
bool OCSYNC_EXPORT isFileLocked(const QString &fileName);
+ /**
+ * Returns whether the file is a shortcut file (ends with .lnk)
+ */
bool OCSYNC_EXPORT isLnkFile(const QString &filename);
+ /**
+ * Returns whether the file is a junction (windows only)
+ */
+ bool OCSYNC_EXPORT isJunction(const QString &filename);
+
/*
* This function takes a path and converts it to a UNC representation of the
* string. That means that it prepends a \\?\ (unless already UNC) and converts
diff --git a/src/common/ownsql.cpp b/src/common/ownsql.cpp
index bcd9dd6b0..ff22eff52 100644
--- a/src/common/ownsql.cpp
+++ b/src/common/ownsql.cpp
@@ -49,6 +49,12 @@ SqlDatabase::SqlDatabase()
{
}
+SqlDatabase::~SqlDatabase()
+{
+ close();
+}
+
+
bool SqlDatabase::isOpen()
{
return _db != 0;
@@ -184,6 +190,9 @@ QString SqlDatabase::error() const
void SqlDatabase::close()
{
if (_db) {
+ foreach (auto q, _queries) {
+ q->finish();
+ }
SQLITE_DO(sqlite3_close(_db));
if (_errId != SQLITE_OK)
qCWarning(lcSql) << "Closing database failed" << _error;
@@ -217,9 +226,8 @@ sqlite3 *SqlDatabase::sqliteDb()
/* =========================================================================================== */
SqlQuery::SqlQuery(SqlDatabase &db)
- : _db(db.sqliteDb())
- , _stmt(0)
- , _errId(0)
+ : _sqldb(&db)
+ , _db(db.sqliteDb())
{
}
@@ -230,18 +238,16 @@ SqlQuery::~SqlQuery()
}
}
-SqlQuery::SqlQuery(const QString &sql, SqlDatabase &db)
- : _db(db.sqliteDb())
- , _stmt(0)
- , _errId(0)
+SqlQuery::SqlQuery(const QByteArray &sql, SqlDatabase &db)
+ : _sqldb(&db)
+ , _db(db.sqliteDb())
{
prepare(sql);
}
-int SqlQuery::prepare(const QString &sql, bool allow_failure)
+int SqlQuery::prepare(const QByteArray &sql, bool allow_failure)
{
- QString s(sql);
- _sql = s.trimmed();
+ _sql = sql.trimmed();
if (_stmt) {
finish();
}
@@ -249,7 +255,7 @@ int SqlQuery::prepare(const QString &sql, bool allow_failure)
int n = 0;
int rc;
do {
- rc = sqlite3_prepare_v2(_db, _sql.toUtf8().constData(), -1, &_stmt, 0);
+ rc = sqlite3_prepare_v2(_db, _sql.constData(), -1, &_stmt, 0);
if ((rc == SQLITE_BUSY) || (rc == SQLITE_LOCKED)) {
n++;
OCC::Utility::usleep(SQLITE_SLEEP_TIME_USEC);
@@ -261,19 +267,32 @@ int SqlQuery::prepare(const QString &sql, bool allow_failure)
_error = QString::fromUtf8(sqlite3_errmsg(_db));
qCWarning(lcSql) << "Sqlite prepare statement error:" << _error << "in" << _sql;
ENFORCE(allow_failure, "SQLITE Prepare error");
+ } else {
+ ASSERT(_stmt);
+ _sqldb->_queries.insert(this);
}
}
return _errId;
}
+/**
+ * There is no overloads to QByteArray::startWith that takes Qt::CaseInsensitive.
+ * Returns true if 'a' starts with 'b' in a case insensitive way
+ */
+static bool startsWithInsensitive(const QByteArray &a, const char *b)
+{
+ int len = strlen(b);
+ return a.size() >= len && qstrnicmp(a.constData(), b, len) == 0;
+}
+
bool SqlQuery::isSelect()
{
- return (!_sql.isEmpty() && _sql.startsWith("SELECT", Qt::CaseInsensitive));
+ return startsWithInsensitive(_sql, "SELECT");
}
bool SqlQuery::isPragma()
{
- return (!_sql.isEmpty() && _sql.startsWith("PRAGMA", Qt::CaseInsensitive));
+ return startsWithInsensitive(_sql, "PRAGMA");
}
bool SqlQuery::exec()
@@ -440,8 +459,13 @@ int SqlQuery::numRowsAffected()
void SqlQuery::finish()
{
+ if (!_stmt)
+ return;
SQLITE_DO(sqlite3_finalize(_stmt));
_stmt = 0;
+ if (_sqldb) {
+ _sqldb->_queries.remove(this);
+ }
}
void SqlQuery::reset_and_clear_bindings()
@@ -452,4 +476,18 @@ void SqlQuery::reset_and_clear_bindings()
}
}
+bool SqlQuery::initOrReset(const QByteArray &sql, OCC::SqlDatabase &db)
+{
+ ENFORCE(!_sqldb || &db == _sqldb);
+ _sqldb = &db;
+ _db = db.sqliteDb();
+ if (_stmt) {
+ reset_and_clear_bindings();
+ return true;
+ } else {
+ return prepare(sql) == 0;
+ }
+}
+
+
} // namespace OCC
diff --git a/src/common/ownsql.h b/src/common/ownsql.h
index 1ad7e93b7..a5e53e8d0 100644
--- a/src/common/ownsql.h
+++ b/src/common/ownsql.h
@@ -21,6 +21,7 @@
#include <QObject>
#include <QVariant>
+#include <QSet>
#include "ocsynclib.h"
@@ -29,6 +30,8 @@ struct sqlite3_stmt;
namespace OCC {
+class SqlQuery;
+
/**
* @brief The SqlDatabase class
* @ingroup libsync
@@ -38,6 +41,7 @@ class OCSYNC_EXPORT SqlDatabase
Q_DISABLE_COPY(SqlDatabase)
public:
explicit SqlDatabase();
+ ~SqlDatabase();
bool isOpen();
bool openOrCreateReadWrite(const QString &filename);
@@ -62,18 +66,54 @@ private:
sqlite3 *_db;
QString _error; // last error string
int _errId;
+
+ friend class SqlQuery;
+ QSet<SqlQuery *> _queries;
};
/**
* @brief The SqlQuery class
* @ingroup libsync
+ *
+ * There is basically 3 ways to initialize and use a query:
+ *
+ SqlQuery q1;
+ [...]
+ q1.initOrReset(...);
+ q1.bindValue(...);
+ q1.exec(...)
+ *
+ SqlQuery q2(db);
+ q2.prepare(...);
+ [...]
+ q2.reset_and_clear_bindings();
+ q2.bindValue(...);
+ q2.exec(...)
+ *
+ SqlQuery q3("...", db);
+ q3.bindValue(...);
+ q3.exec(...)
+ *
*/
class OCSYNC_EXPORT SqlQuery
{
Q_DISABLE_COPY(SqlQuery)
public:
+ explicit SqlQuery() = default;
explicit SqlQuery(SqlDatabase &db);
- explicit SqlQuery(const QString &sql, SqlDatabase &db);
+ explicit SqlQuery(const QByteArray &sql, SqlDatabase &db);
+ /**
+ * Prepare the SqlQuery if it was not prepared yet.
+ * Otherwise, clear the results and the bindings.
+ * return false if there is an error
+ */
+ bool initOrReset(const QByteArray &sql, SqlDatabase &db);
+ /**
+ * Prepare the SqlQuery.
+ * If the query was already prepared, this will first call finish(), and re-prepare it.
+ * This function must only be used if the constructor was setting a SqlDatabase
+ */
+ int prepare(const QByteArray &sql, bool allow_failure = false);
~SqlQuery();
QString error() const;
@@ -82,16 +122,13 @@ public:
/// Checks whether the value at the given column index is NULL
bool nullValue(int index);
-
QString stringValue(int index);
int intValue(int index);
quint64 int64Value(int index);
QByteArray baValue(int index);
-
bool isSelect();
bool isPragma();
bool exec();
- int prepare(const QString &sql, bool allow_failure = false);
bool next();
void bindValue(int pos, const QVariant &value);
QString lastQuery() const;
@@ -100,11 +137,12 @@ public:
void finish();
private:
- sqlite3 *_db;
- sqlite3_stmt *_stmt;
+ SqlDatabase *_sqldb = nullptr;
+ sqlite3 *_db = nullptr;
+ sqlite3_stmt *_stmt = nullptr;
QString _error;
int _errId;
- QString _sql;
+ QByteArray _sql;
};
} // namespace OCC
diff --git a/src/common/remotepermissions.cpp b/src/common/remotepermissions.cpp
index 30ac59cff..90febc000 100644
--- a/src/common/remotepermissions.cpp
+++ b/src/common/remotepermissions.cpp
@@ -27,7 +27,7 @@ static const char letters[] = " WDNVCKRSMmz";
template <typename Char>
void RemotePermissions::fromArray(const Char *p)
{
- _value = p ? notNullMask : 0;
+ _value = notNullMask;
if (!p)
return;
while (*p) {
@@ -37,17 +37,7 @@ void RemotePermissions::fromArray(const Char *p)
}
}
-RemotePermissions::RemotePermissions(const char *p)
-{
- fromArray(p);
-}
-
-RemotePermissions::RemotePermissions(const QString &s)
-{
- fromArray(s.isEmpty() ? nullptr : s.utf16());
-}
-
-QByteArray RemotePermissions::toString() const
+QByteArray RemotePermissions::toDbValue() const
{
QByteArray result;
if (isNull())
@@ -64,4 +54,25 @@ QByteArray RemotePermissions::toString() const
return result;
}
+QByteArray RemotePermissions::toString() const
+{
+ return toDbValue();
+}
+
+RemotePermissions RemotePermissions::fromDbValue(const QByteArray &value)
+{
+ if (value.isEmpty())
+ return RemotePermissions();
+ RemotePermissions perm;
+ perm.fromArray(value.constData());
+ return perm;
+}
+
+RemotePermissions RemotePermissions::fromServerString(const QString &value)
+{
+ RemotePermissions perm;
+ perm.fromArray(value.utf16());
+ return perm;
+}
+
} // namespace OCC
diff --git a/src/common/remotepermissions.h b/src/common/remotepermissions.h
index 3e118a4e2..ecbc049f0 100644
--- a/src/common/remotepermissions.h
+++ b/src/common/remotepermissions.h
@@ -58,11 +58,22 @@ public:
// (by setting forceRemoteDiscovery in SyncJournalDb::checkConnect)
PermissionsCount = HasZSyncMetadata
};
+
+ /// null permissions
RemotePermissions() = default;
- explicit RemotePermissions(const char *);
- explicit RemotePermissions(const QString &);
+ /// array with one character per permission, "" is null, " " is non-null but empty
+ QByteArray toDbValue() const;
+
+ /// output for display purposes, no defined format (same as toDbValue in practice)
QByteArray toString() const;
+
+ /// read value that was written with toDbValue()
+ static RemotePermissions fromDbValue(const QByteArray &);
+
+ /// read a permissions string received from the server, never null
+ static RemotePermissions fromServerString(const QString &);
+
bool hasPermission(Permissions p) const
{
return _value & (1 << static_cast<int>(p));
diff --git a/src/common/syncjournaldb.cpp b/src/common/syncjournaldb.cpp
index 1a495837e..20fc6f387 100644
--- a/src/common/syncjournaldb.cpp
+++ b/src/common/syncjournaldb.cpp
@@ -33,6 +33,13 @@
#include "common/c_jhash.h"
+// SQL expression to check whether path.startswith(prefix + '/')
+// Note: '/' + 1 == '0'
+#define IS_PREFIX_PATH_OF(prefix, path) \
+ "(" path " > (" prefix "||'/') AND " path " < (" prefix "||'0'))"
+#define IS_PREFIX_PATH_OR_EQUAL(prefix, path) \
+ "(" path " == " prefix " OR " IS_PREFIX_PATH_OF(prefix, path) ")"
+
namespace OCC {
Q_LOGGING_CATEGORY(lcDb, "sync.database", QtInfoMsg)
@@ -51,15 +58,15 @@ static void fillFileRecordFromGetQuery(SyncJournalFileRecord &rec, SqlQuery &que
rec._type = static_cast<ItemType>(query.intValue(3));
rec._etag = query.baValue(4);
rec._fileId = query.baValue(5);
- rec._remotePerm = RemotePermissions(query.baValue(6).constData());
+ rec._remotePerm = RemotePermissions::fromDbValue(query.baValue(6));
rec._fileSize = query.int64Value(7);
rec._serverHasIgnoredFiles = (query.intValue(8) > 0);
rec._checksumHeader = query.baValue(9);
}
-static QString defaultJournalMode(const QString &dbPath)
+static QByteArray defaultJournalMode(const QString &dbPath)
{
-#ifdef Q_OS_WIN
+#if defined(Q_OS_WIN)
// See #2693: Some exFAT file systems seem unable to cope with the
// WAL journaling mode. They work fine with DELETE.
QString fileSystem = FileSystem::fileSystemForPath(dbPath);
@@ -68,6 +75,11 @@ static QString defaultJournalMode(const QString &dbPath)
qCInfo(lcDb) << "Filesystem contains FAT - using DELETE journal mode";
return "DELETE";
}
+#elif defined(Q_OS_MAC)
+ if (dbPath.startsWith("/Volumes/")) {
+ qCInfo(lcDb) << "Mounted sync dir, do not use WAL for" << dbPath;
+ return "DELETE";
+ }
#else
Q_UNUSED(dbPath)
#endif
@@ -82,7 +94,7 @@ SyncJournalDb::SyncJournalDb(const QString &dbFilePath, QObject *parent)
, _metadataTableIsEmpty(false)
{
// Allow forcing the journal mode for debugging
- static QString envJournalMode = QString::fromLocal8Bit(qgetenv("OWNCLOUD_SQLITE_JOURNAL_MODE"));
+ static QByteArray envJournalMode = qgetenv("OWNCLOUD_SQLITE_JOURNAL_MODE");
_journalMode = envJournalMode;
if (_journalMode.isEmpty()) {
_journalMode = defaultJournalMode(_dbFile);
@@ -257,14 +269,21 @@ bool SyncJournalDb::sqlFail(const QString &log, const SqlQuery &query)
{
commitTransaction();
qCWarning(lcDb) << "SQL Error" << log << query.error();
- ASSERT(false);
_db.close();
+ ASSERT(false);
return false;
}
bool SyncJournalDb::checkConnect()
{
if (_db.isOpen()) {
+ // Unfortunately the sqlite isOpen check can return true even when the underlying storage
+ // has become unavailable - and then some operations may cause crashes. See #6049
+ if (!QFile::exists(_dbFile)) {
+ qCWarning(lcDb) << "Database open, but file " + _dbFile + " does not exist";
+ close();
+ return false;
+ }
return true;
}
@@ -294,7 +313,7 @@ bool SyncJournalDb::checkConnect()
qCInfo(lcDb) << "sqlite3 version" << pragma1.stringValue(0);
}
- pragma1.prepare(QString("PRAGMA journal_mode=%1;").arg(_journalMode));
+ pragma1.prepare("PRAGMA journal_mode=" + _journalMode + ";");
if (!pragma1.exec()) {
return sqlFail("Set PRAGMA journal_mode", pragma1);
} else {
@@ -303,9 +322,9 @@ bool SyncJournalDb::checkConnect()
}
// For debugging purposes, allow temp_store to be set
- static QString env_temp_store = QString::fromLocal8Bit(qgetenv("OWNCLOUD_SQLITE_TEMP_STORE"));
+ static QByteArray env_temp_store = qgetenv("OWNCLOUD_SQLITE_TEMP_STORE");
if (!env_temp_store.isEmpty()) {
- pragma1.prepare(QString("PRAGMA temp_store = %1;").arg(env_temp_store));
+ pragma1.prepare("PRAGMA temp_store = " + env_temp_store + ";");
if (!pragma1.exec()) {
return sqlFail("Set PRAGMA temp_store", pragma1);
}
@@ -539,188 +558,24 @@ bool SyncJournalDb::checkConnect()
if (forceRemoteDiscovery) {
forceRemoteDiscoveryNextSyncLocked();
}
-
- _getFileRecordQuery.reset(new SqlQuery(_db));
- if (_getFileRecordQuery->prepare(
- GET_FILE_RECORD_QUERY
- " WHERE phash=?1")) {
- return sqlFail("prepare _getFileRecordQuery", *_getFileRecordQuery);
- }
-
- _getFileRecordQueryByInode.reset(new SqlQuery(_db));
- if (_getFileRecordQueryByInode->prepare(
- GET_FILE_RECORD_QUERY
- " WHERE inode=?1")) {
- return sqlFail("prepare _getFileRecordQueryByInode", *_getFileRecordQueryByInode);
- }
-
- _getFileRecordQueryByFileId.reset(new SqlQuery(_db));
- if (_getFileRecordQueryByFileId->prepare(
- GET_FILE_RECORD_QUERY
- " WHERE fileid=?1")) {
- return sqlFail("prepare _getFileRecordQueryByFileId", *_getFileRecordQueryByFileId);
- }
-
- // This query is used to skip discovery and fill the tree from the
- // database instead
- _getFilesBelowPathQuery.reset(new SqlQuery(_db));
- if (_getFilesBelowPathQuery->prepare(
- GET_FILE_RECORD_QUERY
- " WHERE path > (?1||'/') AND path < (?1||'0')"
- // We want to ensure that the contents of a directory are sorted
- // directly behind the directory itself. Without this ORDER BY
- // an ordering like foo, foo-2, foo/file would be returned.
- // With the trailing /, we get foo-2, foo, foo/file. This property
- // is used in fill_tree_from_db().
- " ORDER BY path||'/' ASC")) {
- return sqlFail("prepare _getFilesBelowPathQuery", *_getFilesBelowPathQuery);
- }
-
- _getAllFilesQuery.reset(new SqlQuery(_db));
- if (_getAllFilesQuery->prepare(
- GET_FILE_RECORD_QUERY
- " ORDER BY path||'/' ASC")) {
- return sqlFail("prepare _getAllFilesQuery", *_getAllFilesQuery);
- }
-
- _setFileRecordQuery.reset(new SqlQuery(_db));
- if (_setFileRecordQuery->prepare("INSERT OR REPLACE INTO metadata "
- "(phash, pathlen, path, inode, uid, gid, mode, modtime, type, md5, fileid, remotePerm, filesize, ignoredChildrenRemote, contentChecksum, contentChecksumTypeId) "
- "VALUES (?1 , ?2, ?3 , ?4 , ?5 , ?6 , ?7, ?8 , ?9 , ?10, ?11, ?12, ?13, ?14, ?15, ?16);")) {
- return sqlFail("prepare _setFileRecordQuery", *_setFileRecordQuery);
- }
-
- _setFileRecordChecksumQuery.reset(new SqlQuery(_db));
- if (_setFileRecordChecksumQuery->prepare(
- "UPDATE metadata"
- " SET contentChecksum = ?2, contentChecksumTypeId = ?3"
- " WHERE phash == ?1;")) {
- return sqlFail("prepare _setFileRecordChecksumQuery", *_setFileRecordChecksumQuery);
- }
-
- _setFileRecordLocalMetadataQuery.reset(new SqlQuery(_db));
- if (_setFileRecordLocalMetadataQuery->prepare(
- "UPDATE metadata"
- " SET inode=?2, modtime=?3, filesize=?4"
- " WHERE phash == ?1;")) {
- return sqlFail("prepare _setFileRecordLocalMetadataQuery", *_setFileRecordLocalMetadataQuery);
- }
-
- _getDownloadInfoQuery.reset(new SqlQuery(_db));
- if (_getDownloadInfoQuery->prepare("SELECT tmpfile, etag, errorcount FROM "
- "downloadinfo WHERE path=?1")) {
- return sqlFail("prepare _getDownloadInfoQuery", *_getDownloadInfoQuery);
- }
-
- _setDownloadInfoQuery.reset(new SqlQuery(_db));
- if (_setDownloadInfoQuery->prepare("INSERT OR REPLACE INTO downloadinfo "
- "(path, tmpfile, etag, errorcount) "
- "VALUES ( ?1 , ?2, ?3, ?4 )")) {
- return sqlFail("prepare _setDownloadInfoQuery", *_setDownloadInfoQuery);
- }
-
- _deleteDownloadInfoQuery.reset(new SqlQuery(_db));
- if (_deleteDownloadInfoQuery->prepare("DELETE FROM downloadinfo WHERE path=?1")) {
- return sqlFail("prepare _deleteDownloadInfoQuery", *_deleteDownloadInfoQuery);
- }
-
- _getUploadInfoQuery.reset(new SqlQuery(_db));
- if (_getUploadInfoQuery->prepare("SELECT chunk, transferid, errorcount, size, modtime, contentChecksum FROM "
- "uploadinfo WHERE path=?1")) {
- return sqlFail("prepare _getUploadInfoQuery", *_getUploadInfoQuery);
- }
-
- _setUploadInfoQuery.reset(new SqlQuery(_db));
- if (_setUploadInfoQuery->prepare("INSERT OR REPLACE INTO uploadinfo "
- "(path, chunk, transferid, errorcount, size, modtime, contentChecksum) "
- "VALUES ( ?1 , ?2, ?3 , ?4 , ?5, ?6 , ?7 )")) {
- return sqlFail("prepare _setUploadInfoQuery", *_setUploadInfoQuery);
- }
-
- _deleteUploadInfoQuery.reset(new SqlQuery(_db));
- if (_deleteUploadInfoQuery->prepare("DELETE FROM uploadinfo WHERE path=?1")) {
- return sqlFail("prepare _deleteUploadInfoQuery", *_deleteUploadInfoQuery);
+ if (!_deleteDownloadInfoQuery.initOrReset("DELETE FROM downloadinfo WHERE path=?1", _db)) {
+ return sqlFail("prepare _deleteDownloadInfoQuery", _deleteDownloadInfoQuery);
}
- _deleteFileRecordPhash.reset(new SqlQuery(_db));
- if (_deleteFileRecordPhash->prepare("DELETE FROM metadata WHERE phash=?1")) {
- return sqlFail("prepare _deleteFileRecordPhash", *_deleteFileRecordPhash);
+ if (!_deleteUploadInfoQuery.initOrReset("DELETE FROM uploadinfo WHERE path=?1", _db)) {
+ return sqlFail("prepare _deleteUploadInfoQuery", _deleteUploadInfoQuery);
}
- _deleteFileRecordRecursively.reset(new SqlQuery(_db));
- if (_deleteFileRecordRecursively->prepare("DELETE FROM metadata WHERE path LIKE(?||'/%')")) {
- return sqlFail("prepare _deleteFileRecordRecursively", *_deleteFileRecordRecursively);
- }
-
- QString sql("SELECT lastTryEtag, lastTryModtime, retrycount, errorstring, lastTryTime, ignoreDuration, renameTarget, errorCategory "
- "FROM blacklist WHERE path=?1");
+ QByteArray sql("SELECT lastTryEtag, lastTryModtime, retrycount, errorstring, lastTryTime, ignoreDuration, renameTarget, errorCategory, requestId "
+ "FROM blacklist WHERE path=?1");
if (Utility::fsCasePreserving()) {
// if the file system is case preserving we have to check the blacklist
// case insensitively
- sql += QLatin1String(" COLLATE NOCASE");
- }
- _getErrorBlacklistQuery.reset(new SqlQuery(_db));
- if (_getErrorBlacklistQuery->prepare(sql)) {
- return sqlFail("prepare _getErrorBlacklistQuery", *_getErrorBlacklistQuery);
- }
-
- _setErrorBlacklistQuery.reset(new SqlQuery(_db));
- if (_setErrorBlacklistQuery->prepare("INSERT OR REPLACE INTO blacklist "
- "(path, lastTryEtag, lastTryModtime, retrycount, errorstring, lastTryTime, ignoreDuration, renameTarget, errorCategory) "
- "VALUES ( ?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)")) {
- return sqlFail("prepare _setErrorBlacklistQuery", *_setErrorBlacklistQuery);
+ sql += " COLLATE NOCASE";
}
-
- _getSelectiveSyncListQuery.reset(new SqlQuery(_db));
- if (_getSelectiveSyncListQuery->prepare("SELECT path FROM selectivesync WHERE type=?1")) {
- return sqlFail("prepare _getSelectiveSyncListQuery", *_getSelectiveSyncListQuery);
- }
-
- _getChecksumTypeIdQuery.reset(new SqlQuery(_db));
- if (_getChecksumTypeIdQuery->prepare("SELECT id FROM checksumtype WHERE name=?1")) {
- return sqlFail("prepare _getChecksumTypeIdQuery", *_getChecksumTypeIdQuery);
- }
-
- _getChecksumTypeQuery.reset(new SqlQuery(_db));
- if (_getChecksumTypeQuery->prepare("SELECT name FROM checksumtype WHERE id=?1")) {
- return sqlFail("prepare _getChecksumTypeQuery", *_getChecksumTypeQuery);
- }
-
- _insertChecksumTypeQuery.reset(new SqlQuery(_db));
- if (_insertChecksumTypeQuery->prepare("INSERT OR IGNORE INTO checksumtype (name) VALUES (?1)")) {
- return sqlFail("prepare _insertChecksumTypeQuery", *_insertChecksumTypeQuery);
- }
-
- _getDataFingerprintQuery.reset(new SqlQuery(_db));
- if (_getDataFingerprintQuery->prepare("SELECT fingerprint FROM datafingerprint")) {
- return sqlFail("prepare _getDataFingerprintQuery", *_getDataFingerprintQuery);
- }
-
- _setDataFingerprintQuery1.reset(new SqlQuery(_db));
- if (_setDataFingerprintQuery1->prepare("DELETE FROM datafingerprint;")) {
- return sqlFail("prepare _setDataFingerprintQuery1", *_setDataFingerprintQuery1);
- }
- _setDataFingerprintQuery2.reset(new SqlQuery(_db));
- if (_setDataFingerprintQuery2->prepare("INSERT INTO datafingerprint (fingerprint) VALUES (?1);")) {
- return sqlFail("prepare _setDataFingerprintQuery2", *_setDataFingerprintQuery2);
- }
-
- _getConflictRecordQuery.reset(new SqlQuery(_db));
- if (_getConflictRecordQuery->prepare("SELECT baseFileId, baseModtime, baseEtag FROM conflicts WHERE path=?1;")) {
- return sqlFail("prepare _getConflictRecordQuery", *_getConflictRecordQuery);
- }
-
- _setConflictRecordQuery.reset(new SqlQuery(_db));
- if (_setConflictRecordQuery->prepare("INSERT OR REPLACE INTO conflicts "
- "(path, baseFileId, baseModtime, baseEtag) "
- "VALUES (?1, ?2, ?3, ?4);")) {
- return sqlFail("prepare _setConflictRecordQuery", *_setConflictRecordQuery);
- }
-
- _deleteConflictRecordQuery.reset(new SqlQuery(_db));
- if (_deleteConflictRecordQuery->prepare("DELETE FROM conflicts WHERE path=?1;")) {
- return sqlFail("prepare _deleteConflictRecordQuery", *_deleteConflictRecordQuery);
+ if (!_getErrorBlacklistQuery.initOrReset(sql, _db)) {
+ return sqlFail("prepare _getErrorBlacklistQuery", _getErrorBlacklistQuery);
}
// don't start a new transaction now
@@ -745,38 +600,8 @@ void SyncJournalDb::close()
qCInfo(lcDb) << "Closing DB" << _dbFile;
commitTransaction();
-
- _getFileRecordQuery.reset(0);
- _getFileRecordQueryByInode.reset(0);
- _getFileRecordQueryByFileId.reset(0);
- _getFilesBelowPathQuery.reset(0);
- _getAllFilesQuery.reset(0);
- _setFileRecordQuery.reset(0);
- _setFileRecordChecksumQuery.reset(0);
- _setFileRecordLocalMetadataQuery.reset(0);
- _getDownloadInfoQuery.reset(0);
- _setDownloadInfoQuery.reset(0);
- _deleteDownloadInfoQuery.reset(0);
- _getUploadInfoQuery.reset(0);
- _setUploadInfoQuery.reset(0);
- _deleteUploadInfoQuery.reset(0);
- _deleteFileRecordPhash.reset(0);
- _deleteFileRecordRecursively.reset(0);
- _getErrorBlacklistQuery.reset(0);
- _setErrorBlacklistQuery.reset(0);
- _getSelectiveSyncListQuery.reset(0);
- _getChecksumTypeIdQuery.reset(0);
- _getChecksumTypeQuery.reset(0);
- _insertChecksumTypeQuery.reset(0);
- _getDataFingerprintQuery.reset(0);
- _setDataFingerprintQuery1.reset(0);
- _setDataFingerprintQuery2.reset(0);
- _getConflictRecordQuery.reset(0);
- _setConflictRecordQuery.reset(0);
- _deleteConflictRecordQuery.reset(0);
-
_db.close();
- _avoidReadFromDbOnNextSyncFilter.clear();
+ clearEtagStorageFilter();
_metadataTableIsEmpty = false;
}
@@ -792,7 +617,7 @@ bool SyncJournalDb::updateDatabaseStructure()
bool SyncJournalDb::updateMetadataTableStructure()
{
- QStringList columns = tableColumns("metadata");
+ auto columns = tableColumns("metadata");
bool re = true;
// check if the file_id column is there and create it if not
@@ -800,7 +625,7 @@ bool SyncJournalDb::updateMetadataTableStructure()
return false;
}
- if (columns.indexOf(QLatin1String("fileid")) == -1) {
+ if (columns.indexOf("fileid") == -1) {
SqlQuery query(_db);
query.prepare("ALTER TABLE metadata ADD COLUMN fileid VARCHAR(128);");
if (!query.exec()) {
@@ -815,7 +640,7 @@ bool SyncJournalDb::updateMetadataTableStructure()
}
commitInternal("update database structure: add fileid col");
}
- if (columns.indexOf(QLatin1String("remotePerm")) == -1) {
+ if (columns.indexOf("remotePerm") == -1) {
SqlQuery query(_db);
query.prepare("ALTER TABLE metadata ADD COLUMN remotePerm VARCHAR(128);");
if (!query.exec()) {
@@ -824,7 +649,7 @@ bool SyncJournalDb::updateMetadataTableStructure()
}
commitInternal("update database structure (remotePerm)");
}
- if (columns.indexOf(QLatin1String("filesize")) == -1) {
+ if (columns.indexOf("filesize") == -1) {
SqlQuery query(_db);
query.prepare("ALTER TABLE metadata ADD COLUMN filesize BIGINT;");
if (!query.exec()) {
@@ -854,7 +679,7 @@ bool SyncJournalDb::updateMetadataTableStructure()
commitInternal("update database structure: add path index");
}
- if (columns.indexOf(QLatin1String("ignoredChildrenRemote")) == -1) {
+ if (columns.indexOf("ignoredChildrenRemote") == -1) {
SqlQuery query(_db);
query.prepare("ALTER TABLE metadata ADD COLUMN ignoredChildrenRemote INT;");
if (!query.exec()) {
@@ -864,7 +689,7 @@ bool SyncJournalDb::updateMetadataTableStructure()
commitInternal("update database structure: add ignoredChildrenRemote col");
}
- if (columns.indexOf(QLatin1String("contentChecksum")) == -1) {
+ if (columns.indexOf("contentChecksum") == -1) {
SqlQuery query(_db);
query.prepare("ALTER TABLE metadata ADD COLUMN contentChecksum TEXT;");
if (!query.exec()) {
@@ -873,7 +698,7 @@ bool SyncJournalDb::updateMetadataTableStructure()
}
commitInternal("update database structure: add contentChecksum col");
}
- if (columns.indexOf(QLatin1String("contentChecksumTypeId")) == -1) {
+ if (columns.indexOf("contentChecksumTypeId") == -1) {
SqlQuery query(_db);
query.prepare("ALTER TABLE metadata ADD COLUMN contentChecksumTypeId INTEGER;");
if (!query.exec()) {
@@ -893,13 +718,22 @@ bool SyncJournalDb::updateMetadataTableStructure()
commitInternal("update database structure: add contentChecksum col for uploadinfo");
}
+ if (!tableColumns("conflicts").contains("basePath")) {
+ SqlQuery query(_db);
+ query.prepare("ALTER TABLE conflicts ADD COLUMN basePath TEXT;");
+ if (!query.exec()) {
+ sqlFail("updateMetadataTableStructure: add basePath column", query);
+ re = false;
+ }
+ }
+
return re;
}
bool SyncJournalDb::updateErrorBlacklistTableStructure()
{
- QStringList columns = tableColumns("blacklist");
+ auto columns = tableColumns("blacklist");
bool re = true;
// check if the file_id column is there and create it if not
@@ -907,7 +741,7 @@ bool SyncJournalDb::updateErrorBlacklistTableStructure()
return false;
}
- if (columns.indexOf(QLatin1String("lastTryTime")) == -1) {
+ if (columns.indexOf("lastTryTime") == -1) {
SqlQuery query(_db);
query.prepare("ALTER TABLE blacklist ADD COLUMN lastTryTime INTEGER(8);");
if (!query.exec()) {
@@ -921,7 +755,7 @@ bool SyncJournalDb::updateErrorBlacklistTableStructure()
}
commitInternal("update database structure: add lastTryTime, ignoreDuration cols");
}
- if (columns.indexOf(QLatin1String("renameTarget")) == -1) {
+ if (columns.indexOf("renameTarget") == -1) {
SqlQuery query(_db);
query.prepare("ALTER TABLE blacklist ADD COLUMN renameTarget VARCHAR(4096);");
if (!query.exec()) {
@@ -931,7 +765,7 @@ bool SyncJournalDb::updateErrorBlacklistTableStructure()
commitInternal("update database structure: add renameTarget col");
}
- if (columns.indexOf(QLatin1String("errorCategory")) == -1) {
+ if (columns.indexOf("errorCategory") == -1) {
SqlQuery query(_db);
query.prepare("ALTER TABLE blacklist ADD COLUMN errorCategory INTEGER(8);");
if (!query.exec()) {
@@ -941,6 +775,16 @@ bool SyncJournalDb::updateErrorBlacklistTableStructure()
commitInternal("update database structure: add errorCategory col");
}
+ if (columns.indexOf("requestId") == -1) {
+ SqlQuery query(_db);
+ query.prepare("ALTER TABLE blacklist ADD COLUMN requestId VARCHAR(36);");
+ if (!query.exec()) {
+ sqlFail("updateBlacklistTableStructure: Add requestId", query);
+ re = false;
+ }
+ commitInternal("update database structure: add errorCategory col");
+ }
+
SqlQuery query(_db);
query.prepare("CREATE INDEX IF NOT EXISTS blacklist_index ON blacklist(path collate nocase);");
if (!query.exec()) {
@@ -951,26 +795,20 @@ bool SyncJournalDb::updateErrorBlacklistTableStructure()
return re;
}
-QStringList SyncJournalDb::tableColumns(const QString &table)
+QVector<QByteArray> SyncJournalDb::tableColumns(const QByteArray &table)
{
- QStringList columns;
- if (!table.isEmpty()) {
- if (checkConnect()) {
- QString q = QString("PRAGMA table_info('%1');").arg(table);
- SqlQuery query(_db);
- query.prepare(q);
-
- if (!query.exec()) {
- return columns;
- }
-
- while (query.next()) {
- columns.append(query.stringValue(1));
- }
- }
+ QVector<QByteArray> columns;
+ if (!checkConnect()) {
+ return columns;
+ }
+ SqlQuery query("PRAGMA table_info('" + table + "');", _db);
+ if (!query.exec()) {
+ return columns;
+ }
+ while (query.next()) {
+ columns.append(query.baValue(1));
}
qCDebug(lcDb) << "Columns in the current journal: " << columns;
-
return columns;
}
@@ -993,10 +831,10 @@ bool SyncJournalDb::setFileRecord(const SyncJournalFileRecord &_record)
SyncJournalFileRecord record = _record;
QMutexLocker locker(&_mutex);
- if (!_avoidReadFromDbOnNextSyncFilter.isEmpty()) {
+ if (!_etagStorageFilter.isEmpty()) {
// If we are a directory that should not be read from db next time, don't write the etag
QByteArray prefix = record._path + "/";
- foreach (const QByteArray &it, _avoidReadFromDbOnNextSyncFilter) {
+ foreach (const QByteArray &it, _etagStorageFilter) {
if (it.startsWith(prefix)) {
qCInfo(lcDb) << "Filtered writing the etag of" << prefix << "because it is a prefix of" << it;
record._etag = "_invalid_";
@@ -1024,25 +862,32 @@ bool SyncJournalDb::setFileRecord(const SyncJournalFileRecord &_record)
QByteArray checksumType, checksum;
parseChecksumHeader(record._checksumHeader, &checksumType, &checksum);
int contentChecksumTypeId = mapChecksumType(checksumType);
- _setFileRecordQuery->reset_and_clear_bindings();
- _setFileRecordQuery->bindValue(1, phash);
- _setFileRecordQuery->bindValue(2, plen);
- _setFileRecordQuery->bindValue(3, record._path);
- _setFileRecordQuery->bindValue(4, record._inode);
- _setFileRecordQuery->bindValue(5, 0); // uid Not used
- _setFileRecordQuery->bindValue(6, 0); // gid Not used
- _setFileRecordQuery->bindValue(7, 0); // mode Not used
- _setFileRecordQuery->bindValue(8, record._modtime);
- _setFileRecordQuery->bindValue(9, record._type);
- _setFileRecordQuery->bindValue(10, etag);
- _setFileRecordQuery->bindValue(11, fileId);
- _setFileRecordQuery->bindValue(12, remotePerm);
- _setFileRecordQuery->bindValue(13, record._fileSize);
- _setFileRecordQuery->bindValue(14, record._serverHasIgnoredFiles ? 1 : 0);
- _setFileRecordQuery->bindValue(15, checksum);
- _setFileRecordQuery->bindValue(16, contentChecksumTypeId);
-
- if (!_setFileRecordQuery->exec()) {
+
+ if (!_setFileRecordQuery.initOrReset(QByteArrayLiteral(
+ "INSERT OR REPLACE INTO metadata "
+ "(phash, pathlen, path, inode, uid, gid, mode, modtime, type, md5, fileid, remotePerm, filesize, ignoredChildrenRemote, contentChecksum, contentChecksumTypeId) "
+ "VALUES (?1 , ?2, ?3 , ?4 , ?5 , ?6 , ?7, ?8 , ?9 , ?10, ?11, ?12, ?13, ?14, ?15, ?16);"), _db)) {
+ return false;
+ }
+
+ _setFileRecordQuery.bindValue(1, phash);
+ _setFileRecordQuery.bindValue(2, plen);
+ _setFileRecordQuery.bindValue(3, record._path);
+ _setFileRecordQuery.bindValue(4, record._inode);
+ _setFileRecordQuery.bindValue(5, 0); // uid Not used
+ _setFileRecordQuery.bindValue(6, 0); // gid Not used
+ _setFileRecordQuery.bindValue(7, 0); // mode Not used
+ _setFileRecordQuery.bindValue(8, record._modtime);
+ _setFileRecordQuery.bindValue(9, record._type);
+ _setFileRecordQuery.bindValue(10, etag);
+ _setFileRecordQuery.bindValue(11, fileId);
+ _setFileRecordQuery.bindValue(12, remotePerm);
+ _setFileRecordQuery.bindValue(13, record._fileSize);
+ _setFileRecordQuery.bindValue(14, record._serverHasIgnoredFiles ? 1 : 0);
+ _setFileRecordQuery.bindValue(15, checksum);
+ _setFileRecordQuery.bindValue(16, contentChecksumTypeId);
+
+ if (!_setFileRecordQuery.exec()) {
return false;
}
@@ -1064,18 +909,20 @@ bool SyncJournalDb::deleteFileRecord(const QString &filename, bool recursively)
// if (!recursively) {
// always delete the actual file.
+ if (!_deleteFileRecordPhash.initOrReset(QByteArrayLiteral("DELETE FROM metadata WHERE phash=?1"), _db))
+ return false;
+
qlonglong phash = getPHash(filename.toUtf8());
- _deleteFileRecordPhash->reset_and_clear_bindings();
- _deleteFileRecordPhash->bindValue(1, phash);
+ _deleteFileRecordPhash.bindValue(1, phash);
- if (!_deleteFileRecordPhash->exec()) {
+ if (!_deleteFileRecordPhash.exec())
return false;
- }
if (recursively) {
- _deleteFileRecordRecursively->reset_and_clear_bindings();
- _deleteFileRecordRecursively->bindValue(1, filename);
- if (!_deleteFileRecordRecursively->exec()) {
+ if (!_deleteFileRecordRecursively.initOrReset(QByteArrayLiteral("DELETE FROM metadata WHERE " IS_PREFIX_PATH_OF("?1", "path")), _db))
+ return false;
+ _deleteFileRecordRecursively.bindValue(1, filename);
+ if (!_deleteFileRecordRecursively.exec()) {
return false;
}
}
@@ -1103,20 +950,22 @@ bool SyncJournalDb::getFileRecord(const QByteArray &filename, SyncJournalFileRec
return false;
if (!filename.isEmpty()) {
- _getFileRecordQuery->reset_and_clear_bindings();
- _getFileRecordQuery->bindValue(1, getPHash(filename));
+ if (!_getFileRecordQuery.initOrReset(QByteArrayLiteral(GET_FILE_RECORD_QUERY " WHERE phash=?1"), _db))
+ return false;
- if (!_getFileRecordQuery->exec()) {
+ _getFileRecordQuery.bindValue(1, getPHash(filename));
+
+ if (!_getFileRecordQuery.exec()) {
close();
return false;
}
- if (_getFileRecordQuery->next()) {
- fillFileRecordFromGetQuery(*rec, *_getFileRecordQuery);
+ if (_getFileRecordQuery.next()) {
+ fillFileRecordFromGetQuery(*rec, _getFileRecordQuery);
} else {
- int errId = _getFileRecordQuery->errorId();
+ int errId = _getFileRecordQuery.errorId();
if (errId != SQLITE_DONE) { // only do this if the problem is different from SQLITE_DONE
- QString err = _getFileRecordQuery->error();
+ QString err = _getFileRecordQuery.error();
qCWarning(lcDb) << "No journal entry found for " << filename << "Error: " << err;
close();
}
@@ -1140,16 +989,16 @@ bool SyncJournalDb::getFileRecordByInode(quint64 inode, SyncJournalFileRecord *r
if (!checkConnect())
return false;
- _getFileRecordQueryByInode->reset_and_clear_bindings();
- _getFileRecordQueryByInode->bindValue(1, inode);
+ if (!_getFileRecordQueryByInode.initOrReset(QByteArrayLiteral(GET_FILE_RECORD_QUERY " WHERE inode=?1"), _db))
+ return false;
+
+ _getFileRecordQueryByInode.bindValue(1, inode);
- if (!_getFileRecordQueryByInode->exec()) {
+ if (!_getFileRecordQueryByInode.exec())
return false;
- }
- if (_getFileRecordQueryByInode->next()) {
- fillFileRecordFromGetQuery(*rec, *_getFileRecordQueryByInode);
- }
+ if (_getFileRecordQueryByInode.next())
+ fillFileRecordFromGetQuery(*rec, _getFileRecordQueryByInode);
return true;
}
@@ -1164,16 +1013,17 @@ bool SyncJournalDb::getFileRecordsByFileId(const QByteArray &fileId, const std::
if (!checkConnect())
return false;
- _getFileRecordQueryByFileId->reset_and_clear_bindings();
- _getFileRecordQueryByFileId->bindValue(1, fileId);
+ if (!_getFileRecordQueryByFileId.initOrReset(QByteArrayLiteral(GET_FILE_RECORD_QUERY " WHERE fileid=?1"), _db))
+ return false;
+
+ _getFileRecordQueryByFileId.bindValue(1, fileId);
- if (!_getFileRecordQueryByFileId->exec()) {
+ if (!_getFileRecordQueryByFileId.exec())
return false;
- }
- while (_getFileRecordQueryByFileId->next()) {
+ while (_getFileRecordQueryByFileId.next()) {
SyncJournalFileRecord rec;
- fillFileRecordFromGetQuery(rec, *_getFileRecordQueryByFileId);
+ fillFileRecordFromGetQuery(rec, _getFileRecordQueryByFileId);
rowCallback(rec);
}
@@ -1190,15 +1040,34 @@ bool SyncJournalDb::getFilesBelowPath(const QByteArray &path, const std::functio
if (!checkConnect())
return false;
- // Since the path column doesn't store the starting /, the getFilesBelowPathQuery
- // can't be used for the root path "". It would scan for (path > '/' and path < '0')
- // and find nothing. So, unfortunately, we have to use a different query for
- // retrieving the whole tree.
- auto &query = path.isEmpty() ? _getAllFilesQuery : _getFilesBelowPathQuery;
+ SqlQuery *query = nullptr;
- query->reset_and_clear_bindings();
- if (query == _getFilesBelowPathQuery)
+ if(path.isEmpty()) {
+ // Since the path column doesn't store the starting /, the getFilesBelowPathQuery
+ // can't be used for the root path "". It would scan for (path > '/' and path < '0')
+ // and find nothing. So, unfortunately, we have to use a different query for
+ // retrieving the whole tree.
+
+ if (!_getAllFilesQuery.initOrReset(QByteArrayLiteral( GET_FILE_RECORD_QUERY " ORDER BY path||'/' ASC"), _db))
+ return false;
+ query = &_getAllFilesQuery;
+ } else {
+ // This query is used to skip discovery and fill the tree from the
+ // database instead
+ if (!_getFilesBelowPathQuery.initOrReset(QByteArrayLiteral(
+ GET_FILE_RECORD_QUERY
+ " WHERE " IS_PREFIX_PATH_OF("?1", "path")
+ // We want to ensure that the contents of a directory are sorted
+ // directly behind the directory itself. Without this ORDER BY
+ // an ordering like foo, foo-2, foo/file would be returned.
+ // With the trailing /, we get foo-2, foo, foo/file. This property
+ // is used in fill_tree_from_db().
+ " ORDER BY path||'/' ASC"), _db)) {
+ return false;
+ }
+ query = &_getFilesBelowPathQuery;
query->bindValue(1, path);
+ }
if (!query->exec()) {
return false;
@@ -1297,18 +1166,17 @@ bool SyncJournalDb::updateFileRecordChecksum(const QString &filename,
}
int checksumTypeId = mapChecksumType(contentChecksumType);
- auto &query = _setFileRecordChecksumQuery;
-
- query->reset_and_clear_bindings();
- query->bindValue(1, phash);
- query->bindValue(2, contentChecksum);
- query->bindValue(3, checksumTypeId);
- if (!query->exec()) {
+ if (!_setFileRecordChecksumQuery.initOrReset(QByteArrayLiteral(
+ "UPDATE metadata"
+ " SET contentChecksum = ?2, contentChecksumTypeId = ?3"
+ " WHERE phash == ?1;"), _db)) {
return false;
}
-
- return true;
+ _setFileRecordChecksumQuery.bindValue(1, phash);
+ _setFileRecordChecksumQuery.bindValue(2, contentChecksum);
+ _setFileRecordChecksumQuery.bindValue(3, checksumTypeId);
+ return _setFileRecordChecksumQuery.exec();
}
bool SyncJournalDb::updateLocalMetadata(const QString &filename,
@@ -1325,19 +1193,19 @@ bool SyncJournalDb::updateLocalMetadata(const QString &filename,
return false;
}
- auto &query = _setFileRecordLocalMetadataQuery;
-
- query->reset_and_clear_bindings();
- query->bindValue(1, phash);
- query->bindValue(2, inode);
- query->bindValue(3, modtime);
- query->bindValue(4, size);
- if (!query->exec()) {
+ if (!_setFileRecordLocalMetadataQuery.initOrReset(QByteArrayLiteral(
+ "UPDATE metadata"
+ " SET inode=?2, modtime=?3, filesize=?4"
+ " WHERE phash == ?1;"), _db)) {
return false;
}
- return true;
+ _setFileRecordLocalMetadataQuery.bindValue(1, phash);
+ _setFileRecordLocalMetadataQuery.bindValue(2, inode);
+ _setFileRecordLocalMetadataQuery.bindValue(3, modtime);
+ _setFileRecordLocalMetadataQuery.bindValue(4, size);
+ return _setFileRecordLocalMetadataQuery.exec();
}
bool SyncJournalDb::setFileRecordMetadata(const SyncJournalFileRecord &record)
@@ -1397,15 +1265,20 @@ SyncJournalDb::DownloadInfo SyncJournalDb::getDownloadInfo(const QString &file)
DownloadInfo res;
if (checkConnect()) {
- _getDownloadInfoQuery->reset_and_clear_bindings();
- _getDownloadInfoQuery->bindValue(1, file);
- if (!_getDownloadInfoQuery->exec()) {
+ if (!_getDownloadInfoQuery.initOrReset(QByteArrayLiteral(
+ "SELECT tmpfile, etag, errorcount FROM downloadinfo WHERE path=?1"), _db)) {
+ return res;
+ }
+
+ _getDownloadInfoQuery.bindValue(1, file);
+
+ if (!_getDownloadInfoQuery.exec()) {
return res;
}
- if (_getDownloadInfoQuery->next()) {
- toDownloadInfo(*_getDownloadInfoQuery, &res);
+ if (_getDownloadInfoQuery.next()) {
+ toDownloadInfo(_getDownloadInfoQuery, &res);
} else {
res._valid = false;
}
@@ -1421,23 +1294,23 @@ void SyncJournalDb::setDownloadInfo(const QString &file, const SyncJournalDb::Do
return;
}
- if (i._valid) {
- _setDownloadInfoQuery->reset_and_clear_bindings();
- _setDownloadInfoQuery->bindValue(1, file);
- _setDownloadInfoQuery->bindValue(2, i._tmpfile);
- _setDownloadInfoQuery->bindValue(3, i._etag);
- _setDownloadInfoQuery->bindValue(4, i._errorCount);
- if (!_setDownloadInfoQuery->exec()) {
+ if (i._valid) {
+ if (!_setDownloadInfoQuery.initOrReset(QByteArrayLiteral(
+ "INSERT OR REPLACE INTO downloadinfo "
+ "(path, tmpfile, etag, errorcount) "
+ "VALUES ( ?1 , ?2, ?3, ?4 )"), _db)) {
return;
}
+ _setDownloadInfoQuery.bindValue(1, file);
+ _setDownloadInfoQuery.bindValue(2, i._tmpfile);
+ _setDownloadInfoQuery.bindValue(3, i._etag);
+ _setDownloadInfoQuery.bindValue(4, i._errorCount);
+ _setDownloadInfoQuery.exec();
} else {
- _deleteDownloadInfoQuery->reset_and_clear_bindings();
- _deleteDownloadInfoQuery->bindValue(1, file);
-
- if (!_deleteDownloadInfoQuery->exec()) {
- return;
- }
+ _deleteDownloadInfoQuery.reset_and_clear_bindings();
+ _deleteDownloadInfoQuery.bindValue(1, file);
+ _deleteDownloadInfoQuery.exec();
}
}
@@ -1471,7 +1344,7 @@ QVector<SyncJournalDb::DownloadInfo> SyncJournalDb::getAndDeleteStaleDownloadInf
}
}
- if (!deleteBatch(*_deleteDownloadInfoQuery, superfluousPaths, "downloadinfo"))
+ if (!deleteBatch(_deleteDownloadInfoQuery, superfluousPaths, "downloadinfo"))
return empty_result;
return deleted_entries;
@@ -1502,21 +1375,25 @@ SyncJournalDb::UploadInfo SyncJournalDb::getUploadInfo(const QString &file)
UploadInfo res;
if (checkConnect()) {
- _getUploadInfoQuery->reset_and_clear_bindings();
- _getUploadInfoQuery->bindValue(1, file);
+ if (!_getUploadInfoQuery.initOrReset(QByteArrayLiteral(
+ "SELECT chunk, transferid, errorcount, size, modtime, contentChecksum FROM "
+ "uploadinfo WHERE path=?1"), _db)) {
+ return res;
+ }
+ _getUploadInfoQuery.bindValue(1, file);
- if (!_getUploadInfoQuery->exec()) {
+ if (!_getUploadInfoQuery.exec()) {
return res;
}
- if (_getUploadInfoQuery->next()) {
+ if (_getUploadInfoQuery.next()) {
bool ok = true;
- res._chunk = _getUploadInfoQuery->intValue(0);
- res._transferid = _getUploadInfoQuery->intValue(1);
- res._errorCount = _getUploadInfoQuery->intValue(2);
- res._size = _getUploadInfoQuery->int64Value(3);
- res._modtime = _getUploadInfoQuery->int64Value(4);
- res._contentChecksum = _getUploadInfoQuery->baValue(5);
+ res._chunk = _getUploadInfoQuery.intValue(0);
+ res._transferid = _getUploadInfoQuery.intValue(1);
+ res._errorCount = _getUploadInfoQuery.intValue(2);
+ res._size = _getUploadInfoQuery.int64Value(3);
+ res._modtime = _getUploadInfoQuery.int64Value(4);
+ res._contentChecksum = _getUploadInfoQuery.baValue(5);
res._valid = ok;
}
}
@@ -1532,23 +1409,29 @@ void SyncJournalDb::setUploadInfo(const QString &file, const SyncJournalDb::Uplo
}
if (i._valid) {
- _setUploadInfoQuery->reset_and_clear_bindings();
- _setUploadInfoQuery->bindValue(1, file);
- _setUploadInfoQuery->bindValue(2, i._chunk);
- _setUploadInfoQuery->bindValue(3, i._transferid);
- _setUploadInfoQuery->bindValue(4, i._errorCount);
- _setUploadInfoQuery->bindValue(5, i._size);
- _setUploadInfoQuery->bindValue(6, i._modtime);
- _setUploadInfoQuery->bindValue(7, i._contentChecksum);
-
- if (!_setUploadInfoQuery->exec()) {
+ if (!_setUploadInfoQuery.initOrReset(QByteArrayLiteral(
+ "INSERT OR REPLACE INTO uploadinfo "
+ "(path, chunk, transferid, errorcount, size, modtime, contentChecksum) "
+ "VALUES ( ?1 , ?2, ?3 , ?4 , ?5, ?6 , ?7 )"), _db)) {
+ return;
+ }
+
+ _setUploadInfoQuery.bindValue(1, file);
+ _setUploadInfoQuery.bindValue(2, i._chunk);
+ _setUploadInfoQuery.bindValue(3, i._transferid);
+ _setUploadInfoQuery.bindValue(4, i._errorCount);
+ _setUploadInfoQuery.bindValue(5, i._size);
+ _setUploadInfoQuery.bindValue(6, i._modtime);
+ _setUploadInfoQuery.bindValue(7, i._contentChecksum);
+
+ if (!_setUploadInfoQuery.exec()) {
return;
}
} else {
- _deleteUploadInfoQuery->reset_and_clear_bindings();
- _deleteUploadInfoQuery->bindValue(1, file);
+ _deleteUploadInfoQuery.reset_and_clear_bindings();
+ _deleteUploadInfoQuery.bindValue(1, file);
- if (!_deleteUploadInfoQuery->exec()) {
+ if (!_deleteUploadInfoQuery.exec()) {
return;
}
}
@@ -1580,7 +1463,7 @@ QVector<uint> SyncJournalDb::deleteStaleUploadInfos(const QSet<QString> &keep)
}
}
- deleteBatch(*_deleteUploadInfoQuery, superfluousPaths, "uploadinfo");
+ deleteBatch(_deleteUploadInfoQuery, superfluousPaths, "uploadinfo");
return ids;
}
@@ -1592,22 +1475,21 @@ SyncJournalErrorBlacklistRecord SyncJournalDb::errorBlacklistEntry(const QString
if (file.isEmpty())
return entry;
- // SELECT lastTryEtag, lastTryModtime, retrycount, errorstring
-
if (checkConnect()) {
- _getErrorBlacklistQuery->reset_and_clear_bindings();
- _getErrorBlacklistQuery->bindValue(1, file);
- if (_getErrorBlacklistQuery->exec()) {
- if (_getErrorBlacklistQuery->next()) {
- entry._lastTryEtag = _getErrorBlacklistQuery->baValue(0);
- entry._lastTryModtime = _getErrorBlacklistQuery->int64Value(1);
- entry._retryCount = _getErrorBlacklistQuery->intValue(2);
- entry._errorString = _getErrorBlacklistQuery->stringValue(3);
- entry._lastTryTime = _getErrorBlacklistQuery->int64Value(4);
- entry._ignoreDuration = _getErrorBlacklistQuery->int64Value(5);
- entry._renameTarget = _getErrorBlacklistQuery->stringValue(6);
+ _getErrorBlacklistQuery.reset_and_clear_bindings();
+ _getErrorBlacklistQuery.bindValue(1, file);
+ if (_getErrorBlacklistQuery.exec()) {
+ if (_getErrorBlacklistQuery.next()) {
+ entry._lastTryEtag = _getErrorBlacklistQuery.baValue(0);
+ entry._lastTryModtime = _getErrorBlacklistQuery.int64Value(1);
+ entry._retryCount = _getErrorBlacklistQuery.intValue(2);
+ entry._errorString = _getErrorBlacklistQuery.stringValue(3);
+ entry._lastTryTime = _getErrorBlacklistQuery.int64Value(4);
+ entry._ignoreDuration = _getErrorBlacklistQuery.int64Value(5);
+ entry._renameTarget = _getErrorBlacklistQuery.stringValue(6);
entry._errorCategory = static_cast<SyncJournalErrorBlacklistRecord::Category>(
- _getErrorBlacklistQuery->intValue(7));
+ _getErrorBlacklistQuery.intValue(7));
+ entry._requestId = _getErrorBlacklistQuery.baValue(8);
entry._file = file;
}
}
@@ -1725,17 +1607,24 @@ void SyncJournalDb::setErrorBlacklistEntry(const SyncJournalErrorBlacklistRecord
return;
}
- _setErrorBlacklistQuery->reset_and_clear_bindings();
- _setErrorBlacklistQuery->bindValue(1, item._file);
- _setErrorBlacklistQuery->bindValue(2, item._lastTryEtag);
- _setErrorBlacklistQuery->bindValue(3, item._lastTryModtime);
- _setErrorBlacklistQuery->bindValue(4, item._retryCount);
- _setErrorBlacklistQuery->bindValue(5, item._errorString);
- _setErrorBlacklistQuery->bindValue(6, item._lastTryTime);
- _setErrorBlacklistQuery->bindValue(7, item._ignoreDuration);
- _setErrorBlacklistQuery->bindValue(8, item._renameTarget);
- _setErrorBlacklistQuery->bindValue(9, item._errorCategory);
- _setErrorBlacklistQuery->exec();
+ if (!_setErrorBlacklistQuery.initOrReset(QByteArrayLiteral(
+ "INSERT OR REPLACE INTO blacklist "
+ "(path, lastTryEtag, lastTryModtime, retrycount, errorstring, lastTryTime, ignoreDuration, renameTarget, errorCategory, requestId) "
+ "VALUES ( ?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)"), _db)) {
+ return;
+ }
+
+ _setErrorBlacklistQuery.bindValue(1, item._file);
+ _setErrorBlacklistQuery.bindValue(2, item._lastTryEtag);
+ _setErrorBlacklistQuery.bindValue(3, item._lastTryModtime);
+ _setErrorBlacklistQuery.bindValue(4, item._retryCount);
+ _setErrorBlacklistQuery.bindValue(5, item._errorString);
+ _setErrorBlacklistQuery.bindValue(6, item._lastTryTime);
+ _setErrorBlacklistQuery.bindValue(7, item._ignoreDuration);
+ _setErrorBlacklistQuery.bindValue(8, item._renameTarget);
+ _setErrorBlacklistQuery.bindValue(9, item._errorCategory);
+ _setErrorBlacklistQuery.bindValue(10, item._requestId);
+ _setErrorBlacklistQuery.exec();
}
QVector<SyncJournalDb::PollInfo> SyncJournalDb::getPollInfos()
@@ -1797,14 +1686,18 @@ QStringList SyncJournalDb::getSelectiveSyncList(SyncJournalDb::SelectiveSyncList
return result;
}
- _getSelectiveSyncListQuery->reset_and_clear_bindings();
- _getSelectiveSyncListQuery->bindValue(1, int(type));
- if (!_getSelectiveSyncListQuery->exec()) {
+ if (!_getSelectiveSyncListQuery.initOrReset(QByteArrayLiteral("SELECT path FROM selectivesync WHERE type=?1"), _db)) {
+ *ok = false;
+ return result;
+ }
+
+ _getSelectiveSyncListQuery.bindValue(1, int(type));
+ if (!_getSelectiveSyncListQuery.exec()) {
*ok = false;
return result;
}
- while (_getSelectiveSyncListQuery->next()) {
- auto entry = _getSelectiveSyncListQuery->stringValue(0);
+ while (_getSelectiveSyncListQuery.next()) {
+ auto entry = _getSelectiveSyncListQuery.stringValue(0);
if (!entry.endsWith(QLatin1Char('/'))) {
entry.append(QLatin1Char('/'));
}
@@ -1822,6 +1715,8 @@ void SyncJournalDb::setSelectiveSyncList(SyncJournalDb::SelectiveSyncListType ty
return;
}
+ startTransaction();
+
//first, delete all entries of this type
SqlQuery delQuery("DELETE FROM selectivesync WHERE type == ?1", _db);
delQuery.bindValue(1, int(type));
@@ -1838,6 +1733,8 @@ void SyncJournalDb::setSelectiveSyncList(SyncJournalDb::SelectiveSyncListType ty
qCWarning(lcDb) << "SQL error when inserting into selective sync" << type << path << delQuery.error();
}
}
+
+ commitInternal("setSelectiveSyncList");
}
void SyncJournalDb::avoidRenamesOnNextSync(const QByteArray &path)
@@ -1849,9 +1746,8 @@ void SyncJournalDb::avoidRenamesOnNextSync(const QByteArray &path)
}
SqlQuery query(_db);
- query.prepare("UPDATE metadata SET fileid = '', inode = '0' WHERE path == ?1 OR path LIKE(?2||'/%')");
+ query.prepare("UPDATE metadata SET fileid = '', inode = '0' WHERE " IS_PREFIX_PATH_OR_EQUAL("?1", "path"));
query.bindValue(1, path);
- query.bindValue(2, path);
query.exec();
// We also need to remove the ETags so the update phase refreshes the directory paths
@@ -1861,25 +1757,33 @@ void SyncJournalDb::avoidRenamesOnNextSync(const QByteArray &path)
void SyncJournalDb::avoidReadFromDbOnNextSync(const QByteArray &fileName)
{
- // Make sure that on the next sync, fileName is not read from the DB but uses the PROPFIND to
- // get the info from the server
- // We achieve that by clearing the etag of the parents directory recursively
-
QMutexLocker locker(&_mutex);
if (!checkConnect()) {
return;
}
+ // Remove trailing slash
+ auto argument = fileName;
+ if (argument.endsWith('/'))
+ argument.chop(1);
+
SqlQuery query(_db);
// This query will match entries for which the path is a prefix of fileName
// Note: ItemTypeDirectory == 2
- query.prepare("UPDATE metadata SET md5='_invalid_' WHERE ?1 LIKE(path||'/%') AND type == 2;");
- query.bindValue(1, fileName);
+ query.prepare("UPDATE metadata SET md5='_invalid_' WHERE " IS_PREFIX_PATH_OR_EQUAL("path", "?1") " AND type == 2;");
+ query.bindValue(1, argument);
query.exec();
- // Prevent future overwrite of the etag for this sync
- _avoidReadFromDbOnNextSyncFilter.append(fileName);
+ // Prevent future overwrite of the etags of this folder and all
+ // parent folders for this sync
+ argument.append('/');
+ _etagStorageFilter.append(argument);
+}
+
+void SyncJournalDb::clearEtagStorageFilter()
+{
+ _etagStorageFilter.clear();
}
void SyncJournalDb::forceRemoteDiscoveryNextSync()
@@ -1910,8 +1814,9 @@ QByteArray SyncJournalDb::getChecksumType(int checksumTypeId)
}
// Retrieve the id
- auto &query = *_getChecksumTypeQuery;
- query.reset_and_clear_bindings();
+ auto &query = _getChecksumTypeQuery;
+ if (!query.initOrReset(QByteArrayLiteral("SELECT name FROM checksumtype WHERE id=?1"), _db))
+ return {};
query.bindValue(1, checksumTypeId);
if (!query.exec()) {
return 0;
@@ -1931,24 +1836,26 @@ int SyncJournalDb::mapChecksumType(const QByteArray &checksumType)
}
// Ensure the checksum type is in the db
- _insertChecksumTypeQuery->reset_and_clear_bindings();
- _insertChecksumTypeQuery->bindValue(1, checksumType);
- if (!_insertChecksumTypeQuery->exec()) {
+ if (!_insertChecksumTypeQuery.initOrReset(QByteArrayLiteral("INSERT OR IGNORE INTO checksumtype (name) VALUES (?1)"), _db))
+ return 0;
+ _insertChecksumTypeQuery.bindValue(1, checksumType);
+ if (!_insertChecksumTypeQuery.exec()) {
return 0;
}
// Retrieve the id
- _getChecksumTypeIdQuery->reset_and_clear_bindings();
- _getChecksumTypeIdQuery->bindValue(1, checksumType);
- if (!_getChecksumTypeIdQuery->exec()) {
+ if (!_getChecksumTypeIdQuery.initOrReset(QByteArrayLiteral("SELECT id FROM checksumtype WHERE name=?1"), _db))
+ return 0;
+ _getChecksumTypeIdQuery.bindValue(1, checksumType);
+ if (!_getChecksumTypeIdQuery.exec()) {
return 0;
}
- if (!_getChecksumTypeIdQuery->next()) {
+ if (!_getChecksumTypeIdQuery.next()) {
qCWarning(lcDb) << "No checksum type mapping found for" << checksumType;
return 0;
}
- return _getChecksumTypeIdQuery->intValue(0);
+ return _getChecksumTypeIdQuery.intValue(0);
}
QByteArray SyncJournalDb::dataFingerprint()
@@ -1958,15 +1865,17 @@ QByteArray SyncJournalDb::dataFingerprint()
return QByteArray();
}
- _getDataFingerprintQuery->reset_and_clear_bindings();
- if (!_getDataFingerprintQuery->exec()) {
+ if (!_getDataFingerprintQuery.initOrReset(QByteArrayLiteral("SELECT fingerprint FROM datafingerprint"), _db))
+ return QByteArray();
+
+ if (!_getDataFingerprintQuery.exec()) {
return QByteArray();
}
- if (!_getDataFingerprintQuery->next()) {
+ if (!_getDataFingerprintQuery.next()) {
return QByteArray();
}
- return _getDataFingerprintQuery->baValue(0);
+ return _getDataFingerprintQuery.baValue(0);
}
void SyncJournalDb::setDataFingerprint(const QByteArray &dataFingerprint)
@@ -1976,12 +1885,15 @@ void SyncJournalDb::setDataFingerprint(const QByteArray &dataFingerprint)
return;
}
- _setDataFingerprintQuery1->reset_and_clear_bindings();
- _setDataFingerprintQuery1->exec();
+ if (!_setDataFingerprintQuery1.initOrReset(QByteArrayLiteral("DELETE FROM datafingerprint;"), _db)
+ || !_setDataFingerprintQuery2.initOrReset(QByteArrayLiteral("INSERT INTO datafingerprint (fingerprint) VALUES (?1);"), _db)) {
+ return;
+ }
- _setDataFingerprintQuery2->reset_and_clear_bindings();
- _setDataFingerprintQuery2->bindValue(1, dataFingerprint);
- _setDataFingerprintQuery2->exec();
+ _setDataFingerprintQuery1.exec();
+
+ _setDataFingerprintQuery2.bindValue(1, dataFingerprint);
+ _setDataFingerprintQuery2.exec();
}
void SyncJournalDb::setConflictRecord(const ConflictRecord &record)
@@ -1990,12 +1902,17 @@ void SyncJournalDb::setConflictRecord(const ConflictRecord &record)
if (!checkConnect())
return;
- auto &query = *_setConflictRecordQuery;
- query.reset_and_clear_bindings();
+ auto &query = _setConflictRecordQuery;
+ ASSERT(query.initOrReset(QByteArrayLiteral(
+ "INSERT OR REPLACE INTO conflicts "
+ "(path, baseFileId, baseModtime, baseEtag, basePath) "
+ "VALUES (?1, ?2, ?3, ?4, ?5);"),
+ _db));
query.bindValue(1, record.path);
query.bindValue(2, record.baseFileId);
query.bindValue(3, record.baseModtime);
query.bindValue(4, record.baseEtag);
+ query.bindValue(5, record.initialBasePath);
ASSERT(query.exec());
}
@@ -2006,9 +1923,8 @@ ConflictRecord SyncJournalDb::conflictRecord(const QByteArray &path)
QMutexLocker locker(&_mutex);
if (!checkConnect())
return entry;
-
- auto &query = *_getConflictRecordQuery;
- query.reset_and_clear_bindings();
+ auto &query = _getConflictRecordQuery;
+ ASSERT(query.initOrReset(QByteArrayLiteral("SELECT baseFileId, baseModtime, baseEtag, basePath FROM conflicts WHERE path=?1;"), _db));
query.bindValue(1, path);
ASSERT(query.exec());
if (!query.next())
@@ -2018,6 +1934,7 @@ ConflictRecord SyncJournalDb::conflictRecord(const QByteArray &path)
entry.baseFileId = query.baValue(0);
entry.baseModtime = query.int64Value(1);
entry.baseEtag = query.baValue(2);
+ entry.initialBasePath = query.baValue(3);
return entry;
}
@@ -2027,10 +1944,9 @@ void SyncJournalDb::deleteConflictRecord(const QByteArray &path)
if (!checkConnect())
return;
- auto &query = *_deleteConflictRecordQuery;
- query.reset_and_clear_bindings();
- query.bindValue(1, path);
- ASSERT(query.exec());
+ ASSERT(_deleteConflictRecordQuery.initOrReset("DELETE FROM conflicts WHERE path=?1;", _db));
+ _deleteConflictRecordQuery.bindValue(1, path);
+ ASSERT(_deleteConflictRecordQuery.exec());
}
QByteArrayList SyncJournalDb::conflictRecordPaths()
@@ -2058,6 +1974,25 @@ void SyncJournalDb::clearFileTable()
query.exec();
}
+void SyncJournalDb::markVirtualFileForDownloadRecursively(const QByteArray &path)
+{
+ QMutexLocker lock(&_mutex);
+ if (!checkConnect())
+ return;
+
+ static_assert(ItemTypeVirtualFile == 4 && ItemTypeVirtualFileDownload == 5, "");
+ SqlQuery query("UPDATE metadata SET type=5 WHERE " IS_PREFIX_PATH_OF("?1", "path") " AND type=4;", _db);
+ query.bindValue(1, path);
+ query.exec();
+
+ // We also must make sure we do not read the files from the database (same logic as in avoidReadFromDbOnNextSync)
+ // This includes all the parents up to the root, but also all the directory within the selected dir.
+ static_assert(ItemTypeDirectory == 2, "");
+ query.prepare("UPDATE metadata SET md5='_invalid_' WHERE (" IS_PREFIX_PATH_OF("?1", "path") " OR " IS_PREFIX_PATH_OR_EQUAL("path", "?1") ") AND type == 2;");
+ query.bindValue(1, path);
+ query.exec();
+}
+
void SyncJournalDb::commit(const QString &context, bool startTrans)
{
QMutexLocker lock(&_mutex);
diff --git a/src/common/syncjournaldb.h b/src/common/syncjournaldb.h
index aa30d349c..316473730 100644
--- a/src/common/syncjournaldb.h
+++ b/src/common/syncjournaldb.h
@@ -108,11 +108,17 @@ public:
}
int _chunk;
int _transferid;
- quint64 _size; //currently unused
+ qint64 _size;
qint64 _modtime;
int _errorCount;
bool _valid;
QByteArray _contentChecksum;
+ /**
+ * Returns true if this entry refers to a chunked upload that can be continued.
+ * (As opposed to a small file transfer which is stored in the db so we can detect the case
+ * when the upload succeeded, but the connection was dropped before we got the answer)
+ */
+ bool isChunked() const { return _transferid != 0; }
};
struct PollInfo
@@ -159,21 +165,30 @@ public:
void setSelectiveSyncList(SelectiveSyncListType type, const QStringList &list);
/**
- * Make sure that on the next sync, fileName is not read from the DB but uses the PROPFIND to
- * get the info from the server
+ * Make sure that on the next sync fileName and its parents are discovered from the server.
*
- * Specifically, this sets the md5 field of fileName and all its parents to _invalid_.
+ * That means its metadata and, if it's a directory, its direct contents.
+ *
+ * Specifically, etag (md5 field) of fileName and all its parents are set to _invalid_.
* That causes a metadata difference and a resulting discovery from the remote for the
* affected folders.
*
* Since folders in the selective sync list will not be rediscovered (csync_ftw,
- * _csync_detect_update skip them), the _invalid_ marker will stay and it. And any
+ * _csync_detect_update skip them), the _invalid_ marker will stay. And any
* child items in the db will be ignored when reading a remote tree from the database.
+ *
+ * Any setFileRecord() call to affected directories before the next sync run will be
+ * adjusted to retain the invalid etag via _etagStorageFilter.
*/
void avoidReadFromDbOnNextSync(const QString &fileName) { avoidReadFromDbOnNextSync(fileName.toUtf8()); }
void avoidReadFromDbOnNextSync(const QByteArray &fileName);
/**
+ * Wipe _etagStorageFilter. Also done implicitly on close().
+ */
+ void clearEtagStorageFilter();
+
+ /**
* Ensures full remote discovery happens on the next sync.
*
* Equivalent to calling avoidReadFromDbOnNextSync() for all files.
@@ -213,13 +228,13 @@ public:
/// Store a new or updated record in the database
void setConflictRecord(const ConflictRecord &record);
- /// Retrieve a conflict record by path of the _conflict- file
+ /// Retrieve a conflict record by path of the file with the conflict tag
ConflictRecord conflictRecord(const QByteArray &path);
- /// Delete a conflict record by path of the _conflict- file
+ /// Delete a conflict record by path of the file with the conflict tag
void deleteConflictRecord(const QByteArray &path);
- /// Return all paths of _conflict- files with records in the db
+ /// Return all paths of files with a conflict tag in the name and records in the db
QByteArrayList conflictRecordPaths();
@@ -230,6 +245,12 @@ public:
*/
void clearFileTable();
+ /**
+ * Set the 'ItemTypeVirtualFileDownload' to all the files that have the ItemTypeVirtualFile flag
+ * within the directory specified path path
+ */
+ void markVirtualFileForDownloadRecursively(const QByteArray &path);
+
private:
int getFileRecordCount();
bool updateDatabaseStructure();
@@ -239,7 +260,7 @@ private:
void commitInternal(const QString &context, bool startTrans = true);
void startTransaction();
void commitTransaction();
- QStringList tableColumns(const QString &table);
+ QVector<QByteArray> tableColumns(const QByteArray &table);
bool checkConnect();
// Same as forceRemoteDiscoveryNextSync but without acquiring the lock
@@ -256,48 +277,56 @@ private:
int _transaction;
bool _metadataTableIsEmpty;
- // NOTE! when adding a query, don't forget to reset it in SyncJournalDb::close
- QScopedPointer<SqlQuery> _getFileRecordQuery;
- QScopedPointer<SqlQuery> _getFileRecordQueryByInode;
- QScopedPointer<SqlQuery> _getFileRecordQueryByFileId;
- QScopedPointer<SqlQuery> _getFilesBelowPathQuery;
- QScopedPointer<SqlQuery> _getAllFilesQuery;
- QScopedPointer<SqlQuery> _setFileRecordQuery;
- QScopedPointer<SqlQuery> _setFileRecordChecksumQuery;
- QScopedPointer<SqlQuery> _setFileRecordLocalMetadataQuery;
- QScopedPointer<SqlQuery> _getDownloadInfoQuery;
- QScopedPointer<SqlQuery> _setDownloadInfoQuery;
- QScopedPointer<SqlQuery> _deleteDownloadInfoQuery;
- QScopedPointer<SqlQuery> _getUploadInfoQuery;
- QScopedPointer<SqlQuery> _setUploadInfoQuery;
- QScopedPointer<SqlQuery> _deleteUploadInfoQuery;
- QScopedPointer<SqlQuery> _deleteFileRecordPhash;
- QScopedPointer<SqlQuery> _deleteFileRecordRecursively;
- QScopedPointer<SqlQuery> _getErrorBlacklistQuery;
- QScopedPointer<SqlQuery> _setErrorBlacklistQuery;
- QScopedPointer<SqlQuery> _getSelectiveSyncListQuery;
- QScopedPointer<SqlQuery> _getChecksumTypeIdQuery;
- QScopedPointer<SqlQuery> _getChecksumTypeQuery;
- QScopedPointer<SqlQuery> _insertChecksumTypeQuery;
- QScopedPointer<SqlQuery> _getDataFingerprintQuery;
- QScopedPointer<SqlQuery> _setDataFingerprintQuery1;
- QScopedPointer<SqlQuery> _setDataFingerprintQuery2;
- QScopedPointer<SqlQuery> _getConflictRecordQuery;
- QScopedPointer<SqlQuery> _setConflictRecordQuery;
- QScopedPointer<SqlQuery> _deleteConflictRecordQuery;
-
- /* This is the list of paths we called avoidReadFromDbOnNextSync on.
- * It means that they should not be written to the DB in any case since doing
- * that would write the etag and would void the purpose of avoidReadFromDbOnNextSync
+ SqlQuery _getFileRecordQuery;
+ SqlQuery _getFileRecordQueryByInode;
+ SqlQuery _getFileRecordQueryByFileId;
+ SqlQuery _getFilesBelowPathQuery;
+ SqlQuery _getAllFilesQuery;
+ SqlQuery _setFileRecordQuery;
+ SqlQuery _setFileRecordChecksumQuery;
+ SqlQuery _setFileRecordLocalMetadataQuery;
+ SqlQuery _getDownloadInfoQuery;
+ SqlQuery _setDownloadInfoQuery;
+ SqlQuery _deleteDownloadInfoQuery;
+ SqlQuery _getUploadInfoQuery;
+ SqlQuery _setUploadInfoQuery;
+ SqlQuery _deleteUploadInfoQuery;
+ SqlQuery _deleteFileRecordPhash;
+ SqlQuery _deleteFileRecordRecursively;
+ SqlQuery _getErrorBlacklistQuery;
+ SqlQuery _setErrorBlacklistQuery;
+ SqlQuery _getSelectiveSyncListQuery;
+ SqlQuery _getChecksumTypeIdQuery;
+ SqlQuery _getChecksumTypeQuery;
+ SqlQuery _insertChecksumTypeQuery;
+ SqlQuery _getDataFingerprintQuery;
+ SqlQuery _setDataFingerprintQuery1;
+ SqlQuery _setDataFingerprintQuery2;
+ SqlQuery _getConflictRecordQuery;
+ SqlQuery _setConflictRecordQuery;
+ SqlQuery _deleteConflictRecordQuery;
+
+ /* Storing etags to these folders, or their parent folders, is filtered out.
+ *
+ * When avoidReadFromDbOnNextSync() is called some etags to _invalid_ in the
+ * database. If this is done during a sync run, a later propagation job might
+ * undo that by writing the correct etag to the database instead. This filter
+ * will prevent this write and instead guarantee the _invalid_ etag stays in
+ * place.
+ *
+ * The list is cleared on close() (end of sync run) and explicitly with
+ * clearEtagStorageFilter() (start of sync run).
+ *
+ * The contained paths have a trailing /.
*/
- QList<QByteArray> _avoidReadFromDbOnNextSyncFilter;
+ QList<QByteArray> _etagStorageFilter;
/** The journal mode to use for the db.
*
* Typically WAL initially, but may be set to other modes via environment
* variable, for specific filesystems, or when WAL fails in a particular way.
*/
- QString _journalMode;
+ QByteArray _journalMode;
};
bool OCSYNC_EXPORT
diff --git a/src/common/syncjournalfilerecord.cpp b/src/common/syncjournalfilerecord.cpp
index 607d2e6db..c22623b66 100644
--- a/src/common/syncjournalfilerecord.cpp
+++ b/src/common/syncjournalfilerecord.cpp
@@ -29,9 +29,20 @@ SyncJournalFileRecord::SyncJournalFileRecord()
{
}
-QByteArray SyncJournalFileRecord::numericFileId() const
+QByteArray SyncJournalFileRecord::legacyDeriveNumericFileId() const
{
- // Use the id up until the first non-numeric character
+ // The id property which is stored in _fileId is
+ // leftpad_with_zero(fileid, 8) + instanceid
+ // so if it starts with a 0 we know the first 8 bytes
+ // can be taken.
+ if (_fileId.startsWith('0')) {
+ return _fileId.left(8);
+ }
+
+ // Otherwise we don't know exactly how long it is,
+ // use every digit until the first letter. The instanceid of
+ // oc >= 6 starts with "oc". This will break for older instances
+ // that have a digit as the first character of the instance id.
for (int i = 0; i < _fileId.size(); ++i) {
if (_fileId[i] < '0' || _fileId[i] > '9') {
return _fileId.left(i);
diff --git a/src/common/syncjournalfilerecord.h b/src/common/syncjournalfilerecord.h
index b09006365..6310e6121 100644
--- a/src/common/syncjournalfilerecord.h
+++ b/src/common/syncjournalfilerecord.h
@@ -45,13 +45,18 @@ public:
return !_path.isEmpty();
}
- /** Returns the numeric part of the full id in _fileId.
+ /** Returns a guess for the numeric part of the full id in _fileId.
*
- * On the server this is sometimes known as the internal file id.
+ * On the server this is sometimes known as the internal file id, the "fileid" DAV property.
*
- * It is used in the construction of private links.
+ * It is used in the fallback construction of private links.
+ *
+ * New code should not use this function: Request the fileid property from the server.
+ * In the future we might store the fileid instead of the id, but the migration is complex
+ * if we don't want to store both.
*/
- QByteArray numericFileId() const;
+ QByteArray legacyDeriveNumericFileId() const;
+
QDateTime modDateTime() const { return Utility::qDateTimeFromTime_t(_modtime); }
QByteArray _path;
@@ -109,23 +114,23 @@ public:
QString _file;
QString _renameTarget;
+ /// The last X-Request-ID of the request that failled
+ QByteArray _requestId;
+
bool isValid() const;
};
/** Represents a conflict in the conflicts table.
*
- * In the following the "conflict file" is the file with the "_conflict-"
- * tag and the base file is the file that its a conflict for. So if
- * a/foo.txt is the base file, its conflict file could be
- * a/foo_conflict-1234.txt.
+ * In the following the "conflict file" is the file that has the conflict
+ * tag in the filename, and the base file is the file that it's a conflict for.
+ * So if "a/foo.txt" is the base file, its conflict file could be
+ * "a/foo (conflicted copy 1234).txt".
*/
class OCSYNC_EXPORT ConflictRecord
{
public:
- /** Path to the _conflict- file
- *
- * So if a/foo.txt has a conflict, this path would point to
- * a/foo_conflict-1234.txt.
+ /** Path to the file with the conflict tag in the name
*
* The path is sync-folder relative.
*/
@@ -146,6 +151,17 @@ public:
*/
QByteArray baseEtag;
+ /**
+ * The path of the original file at the time the conflict was created
+ *
+ * Note that in nearly all cases one should query the db by baseFileId and
+ * thus retrieve the *current* base path instead!
+ *
+ * maybe be empty if not available
+ */
+ QByteArray initialBasePath;
+
+
bool isValid() const { return !path.isEmpty(); }
};
}
diff --git a/src/common/utility.cpp b/src/common/utility.cpp
index 29308ea84..d2a46bb7c 100644
--- a/src/common/utility.cpp
+++ b/src/common/utility.cpp
@@ -254,15 +254,17 @@ void Utility::usleep(int usec)
QThread::usleep(usec);
}
-bool Utility::fsCasePreserving()
-{
-#ifdef WITH_TESTING
+// This can be overriden from the tests
+OCSYNC_EXPORT bool fsCasePreserving_override = []()-> bool {
QByteArray env = qgetenv("OWNCLOUD_TEST_CASE_PRESERVING");
if (!env.isEmpty())
return env.toInt();
-#endif
+ return Utility::isWindows() || Utility::isMac();
+}();
- return isWindows() || isMac();
+bool Utility::fsCasePreserving()
+{
+ return fsCasePreserving_override;
}
bool Utility::fileNamesEqual(const QString &fn1, const QString &fn2)
@@ -542,18 +544,29 @@ QUrl Utility::concatUrlPath(const QUrl &url, const QString &concatPath,
return tmpUrl;
}
-QString Utility::makeConflictFileName(const QString &fn, const QDateTime &dt)
+QString Utility::makeConflictFileName(
+ const QString &fn, const QDateTime &dt, const QString &user)
{
QString conflictFileName(fn);
- // Add _conflict-XXXX before the extension.
+ // Add conflict tag before the extension.
int dotLocation = conflictFileName.lastIndexOf('.');
// If no extension, add it at the end (take care of cases like foo/.hidden or foo.bar/file)
if (dotLocation <= conflictFileName.lastIndexOf('/') + 1) {
dotLocation = conflictFileName.size();
}
- QString timeString = dt.toString("yyyyMMdd-hhmmss");
- conflictFileName.insert(dotLocation, "_conflict-" + timeString);
+ QString conflictMarker = QStringLiteral(" (conflicted copy ");
+ if (!user.isEmpty()) {
+ // Don't allow parens in the user name, to ensure
+ // we can find the beginning and end of the conflict tag.
+ const auto userName = sanitizeForFileName(user).replace('(', '_').replace(')', '_');
+ conflictMarker.append(userName);
+ conflictMarker.append(' ');
+ }
+ conflictMarker.append(dt.toString("yyyy-MM-dd hhmmss"));
+ conflictMarker.append(')');
+
+ conflictFileName.insert(dotLocation, conflictMarker);
return conflictFileName;
}
@@ -566,13 +579,28 @@ bool Utility::isConflictFile(const char *name)
bname = name;
}
- return std::strstr(bname, "_conflict-");
+ // Old pattern
+ if (std::strstr(bname, "_conflict-"))
+ return true;
+
+ // New pattern
+ if (std::strstr(bname, "(conflicted copy"))
+ return true;
+
+ return false;
}
bool Utility::isConflictFile(const QString &name)
{
auto bname = name.midRef(name.lastIndexOf('/') + 1);
- return bname.contains("_conflict-", Utility::fsCasePreserving() ? Qt::CaseInsensitive : Qt::CaseSensitive);
+
+ if (bname.contains(QStringLiteral("_conflict-")))
+ return true;
+
+ if (bname.contains(QStringLiteral("(conflicted copy")))
+ return true;
+
+ return false;
}
QByteArray Utility::conflictFileBaseName(const QByteArray &conflictName)
@@ -580,19 +608,44 @@ QByteArray Utility::conflictFileBaseName(const QByteArray &conflictName)
// This function must be able to deal with conflict files for conflict files.
// To do this, we scan backwards, for the outermost conflict marker and
// strip only that to generate the conflict file base name.
- int from = conflictName.size();
- while (from != -1) {
- auto start = conflictName.lastIndexOf("_conflict-", from);
- if (start == -1)
- return "";
- from = start - 1;
-
- auto end = conflictName.indexOf('.', start);
- if (end == -1)
- end = conflictName.size();
- return conflictName.left(start) + conflictName.mid(end);
+ auto startOld = conflictName.lastIndexOf("_conflict-");
+
+ // A single space before "(conflicted copy" is considered part of the tag
+ auto startNew = conflictName.lastIndexOf("(conflicted copy");
+ if (startNew > 0 && conflictName[startNew - 1] == ' ')
+ startNew -= 1;
+
+ // The rightmost tag is relevant
+ auto tagStart = qMax(startOld, startNew);
+ if (tagStart == -1)
+ return "";
+
+ // Find the end of the tag
+ auto tagEnd = conflictName.size();
+ auto dot = conflictName.lastIndexOf('.'); // dot could be part of user name for new tag!
+ if (dot > tagStart)
+ tagEnd = dot;
+ if (tagStart == startNew) {
+ auto paren = conflictName.indexOf(')', tagStart);
+ if (paren != -1)
+ tagEnd = paren + 1;
+ }
+ return conflictName.left(tagStart) + conflictName.mid(tagEnd);
+}
+
+QString Utility::sanitizeForFileName(const QString &name)
+{
+ const auto invalid = QStringLiteral("/?<>\\:*|\"");
+ QString result;
+ result.reserve(name.size());
+ for (const auto c : name) {
+ if (!invalid.contains(c)
+ && c.category() != QChar::Other_Control
+ && c.category() != QChar::Other_Format) {
+ result.append(c);
+ }
}
- return "";
+ return result;
}
} // namespace OCC
diff --git a/src/common/utility.h b/src/common/utility.h
index 7247673ce..5e1ff930e 100644
--- a/src/common/utility.h
+++ b/src/common/utility.h
@@ -182,9 +182,24 @@ namespace Utility {
with the given parent. If no parent is specified, the caller must destroy the settings */
OCSYNC_EXPORT std::unique_ptr<QSettings> settingsWithGroup(const QString &group, QObject *parent = 0);
+ /** Sanitizes a string that shall become part of a filename.
+ *
+ * Filters out reserved characters like
+ * - unicode control and format characters
+ * - reserved characters: /, ?, <, >, \, :, *, |, and "
+ *
+ * Warning: This does not sanitize the whole resulting string, so
+ * - unix reserved filenames ('.', '..')
+ * - trailing periods and spaces
+ * - windows reserved filenames ('CON' etc)
+ * will pass unchanged.
+ */
+ OCSYNC_EXPORT QString sanitizeForFileName(const QString &name);
+
/** Returns a file name based on \a fn that's suitable for a conflict.
*/
- OCSYNC_EXPORT QString makeConflictFileName(const QString &fn, const QDateTime &dt);
+ OCSYNC_EXPORT QString makeConflictFileName(
+ const QString &fn, const QDateTime &dt, const QString &user);
/** Returns whether a file name indicates a conflict file
*/
diff --git a/src/crashreporter/CMakeLists.txt b/src/crashreporter/CMakeLists.txt
index 693fd9efd..072e1fb6c 100644
--- a/src/crashreporter/CMakeLists.txt
+++ b/src/crashreporter/CMakeLists.txt
@@ -1,9 +1,6 @@
PROJECT( CrashReporter )
cmake_policy(SET CMP0017 NEW)
-list(APPEND crashreporter_SOURCES main.cpp)
-list(APPEND crashreporter_RC resources.qrc)
-
# TODO: differentiate release channel
# if(BUILD_RELEASE)
# set(CRASHREPORTER_RELEASE_CHANNEL "release")
@@ -11,9 +8,27 @@ list(APPEND crashreporter_RC resources.qrc)
set(CRASHREPORTER_RELEASE_CHANNEL "nightly")
# endif()
+# Theme
+if(DEFINED OEM_THEME_DIR AND EXISTS "${OEM_THEME_DIR}/theme/colored")
+ set(CRASHREPORTER_ICON_DIR "${OEM_THEME_DIR}/theme/colored")
+else()
+ set(CRASHREPORTER_ICON_DIR "${CMAKE_SOURCE_DIR}/theme/colored")
+endif()
+
+set(CRASHREPORTER_ICON_FILENAME "${APPLICATION_ICON_NAME}-icon.png")
+set(CRASHREPORTER_ICON ":/${CRASHREPORTER_ICON_FILENAME}")
+set(CRASHREPORTER_ICON_SIZE "128")
+set(CRASHREPORTER_ICON_PATH "${CRASHREPORTER_ICON_DIR}/${CRASHREPORTER_ICON_SIZE}-${CRASHREPORTER_ICON_FILENAME}")
+
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources.qrc.in
+ ${CMAKE_CURRENT_BINARY_DIR}/resources.qrc)
+
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/CrashReporterConfig.h.in
${CMAKE_CURRENT_BINARY_DIR}/CrashReporterConfig.h)
+# Sources
+list(APPEND crashreporter_SOURCES main.cpp)
+list(APPEND crashreporter_RC "${CMAKE_CURRENT_BINARY_DIR}/resources.qrc")
if(NOT BUILD_LIBRARIES_ONLY)
@@ -21,15 +36,15 @@ if(NOT BUILD_LIBRARIES_ONLY)
${crashreporter_SOURCES}
${crashreporter_HEADERS_MOC}
${crashreporter_UI_HEADERS}
- ${crashreporter_RC_RCC}
+ ${crashreporter_RC}
)
find_package(Qt5 REQUIRED COMPONENTS Widgets)
target_include_directories(${CRASHREPORTER_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
set_target_properties(${CRASHREPORTER_EXECUTABLE} PROPERTIES AUTOMOC ON)
+ set_target_properties(${CRASHREPORTER_EXECUTABLE} PROPERTIES AUTORCC ON)
set_target_properties(${CRASHREPORTER_EXECUTABLE} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${BIN_OUTPUT_DIRECTORY} )
- set_target_properties(${CRASHREPORTER_EXECUTABLE} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}/${APPLICATION_EXECUTABLE}" )
target_link_libraries(${CRASHREPORTER_EXECUTABLE}
crashreporter-gui
Qt5::Core Qt5::Widgets
diff --git a/src/crashreporter/resources.qrc b/src/crashreporter/resources.qrc
deleted file mode 100644
index 830281e77..000000000
--- a/src/crashreporter/resources.qrc
+++ /dev/null
@@ -1,5 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file alias="owncloud-icon.png">../../theme/colored/owncloud-icon-128.png</file>
- </qresource>
-</RCC>
diff --git a/src/crashreporter/resources.qrc.in b/src/crashreporter/resources.qrc.in
new file mode 100644
index 000000000..8afaf4327
--- /dev/null
+++ b/src/crashreporter/resources.qrc.in
@@ -0,0 +1,5 @@
+<RCC>
+ <qresource prefix="/">
+ <file alias="@CRASHREPORTER_ICON_FILENAME@">@CRASHREPORTER_ICON_PATH@</file>
+ </qresource>
+</RCC>
diff --git a/src/csync/CMakeLists.txt b/src/csync/CMakeLists.txt
index 26d66e655..008eb818a 100644
--- a/src/csync/CMakeLists.txt
+++ b/src/csync/CMakeLists.txt
@@ -69,36 +69,35 @@ endif()
configure_file(csync_version.h.in ${CMAKE_CURRENT_BINARY_DIR}/csync_version.h)
-set(CSYNC_LIBRARY ocsync)
-add_library(${CSYNC_LIBRARY} SHARED ${common_SOURCES} ${csync_SRCS})
+add_library("${csync_NAME}" SHARED ${common_SOURCES} ${csync_SRCS})
target_include_directories(
- ${CSYNC_LIBRARY}
+ "${csync_NAME}"
PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/std
)
find_package(SQLite3 3.8.0 REQUIRED)
if (USE_OUR_OWN_SQLITE3)
# make sure that the path for the local sqlite3 is before the system one
- target_include_directories(${CSYNC_LIBRARY} BEFORE PRIVATE ${SQLITE3_INCLUDE_DIR})
+ target_include_directories("${csync_NAME}" BEFORE PRIVATE ${SQLITE3_INCLUDE_DIR})
else()
- target_include_directories(${CSYNC_LIBRARY} PRIVATE ${SQLITE3_INCLUDE_DIR})
+ target_include_directories("${csync_NAME}" PRIVATE ${SQLITE3_INCLUDE_DIR})
endif()
-generate_export_header(${CSYNC_LIBRARY}
+generate_export_header("${csync_NAME}"
EXPORT_MACRO_NAME OCSYNC_EXPORT
EXPORT_FILE_NAME ocsynclib.h
)
-target_link_libraries(${CSYNC_LIBRARY}
+target_link_libraries("${csync_NAME}"
${CSYNC_REQUIRED_LIBRARIES}
${SQLITE3_LIBRARIES}
Qt5::Core Qt5::Concurrent
)
if(ZLIB_FOUND)
- target_link_libraries(${CSYNC_LIBRARY} ZLIB::ZLIB)
+ target_link_libraries("${csync_NAME}" ZLIB::ZLIB)
endif(ZLIB_FOUND)
@@ -106,11 +105,11 @@ endif(ZLIB_FOUND)
if (APPLE)
find_library(FOUNDATION_LIBRARY NAMES Foundation)
find_library(CORESERVICES_LIBRARY NAMES CoreServices)
- target_link_libraries(${CSYNC_LIBRARY} ${FOUNDATION_LIBRARY} ${CORESERVICES_LIBRARY})
+ target_link_libraries("${csync_NAME}" ${FOUNDATION_LIBRARY} ${CORESERVICES_LIBRARY})
endif()
set_target_properties(
- ${CSYNC_LIBRARY}
+ "${csync_NAME}"
PROPERTIES
VERSION
${LIBRARY_VERSION}
@@ -122,7 +121,7 @@ set_target_properties(
if(BUILD_OWNCLOUD_OSX_BUNDLE)
INSTALL(
TARGETS
- ${CSYNC_LIBRARY}
+ "${csync_NAME}"
LIBRARY DESTINATION
${LIB_INSTALL_DIR}
ARCHIVE DESTINATION
@@ -133,13 +132,13 @@ if(BUILD_OWNCLOUD_OSX_BUNDLE)
else()
INSTALL(
TARGETS
- ${CSYNC_LIBRARY}
+ "${csync_NAME}"
LIBRARY DESTINATION
- ${CMAKE_INSTALL_LIBDIR}/${APPLICATION_EXECUTABLE}
+ ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION
- ${CMAKE_INSTALL_LIBDIR}/${APPLICATION_EXECUTABLE}
+ ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION
- ${CMAKE_INSTALL_BINDIR}/${APPLICATION_EXECUTABLE}
+ ${CMAKE_INSTALL_BINDIR}
)
endif()
diff --git a/src/csync/config_csync.h.cmake b/src/csync/config_csync.h.cmake
index d1a64cb95..9a8043f1b 100644
--- a/src/csync/config_csync.h.cmake
+++ b/src/csync/config_csync.h.cmake
@@ -17,4 +17,3 @@
#cmakedefine HAVE___MINGW_ASPRINTF 1
#cmakedefine HAVE_ASPRINTF 1
-#cmakedefine WITH_TESTING 1
diff --git a/src/csync/csync.cpp b/src/csync/csync.cpp
index 992e60f21..469ea1919 100644
--- a/src/csync/csync.cpp
+++ b/src/csync/csync.cpp
@@ -126,12 +126,7 @@ int csync_update(CSYNC *ctx) {
}
int csync_reconcile(CSYNC *ctx) {
- int rc = -1;
-
- if (ctx == NULL) {
- errno = EBADF;
- return -1;
- }
+ Q_ASSERT(ctx);
ctx->status_code = CSYNC_STATUS_OK;
/* Reconciliation for local replica */
@@ -140,54 +135,31 @@ int csync_reconcile(CSYNC *ctx) {
ctx->current = LOCAL_REPLICA;
- rc = csync_reconcile_updates(ctx);
+ csync_reconcile_updates(ctx);
qCInfo(lcCSync) << "Reconciliation for local replica took " << timer.elapsed() / 1000.
<< "seconds visiting " << ctx->local.files.size() << " files.";
- if (rc < 0) {
- if (!CSYNC_STATUS_IS_OK(ctx->status_code)) {
- ctx->status_code = csync_errno_to_status( errno, CSYNC_STATUS_RECONCILE_ERROR );
- }
- return rc;
- }
-
/* Reconciliation for remote replica */
timer.restart();
ctx->current = REMOTE_REPLICA;
- rc = csync_reconcile_updates(ctx);
+ csync_reconcile_updates(ctx);
qCInfo(lcCSync) << "Reconciliation for remote replica took " << timer.elapsed() / 1000.
<< "seconds visiting " << ctx->remote.files.size() << " files.";
- if (rc < 0) {
- if (!CSYNC_STATUS_IS_OK(ctx->status_code)) {
- ctx->status_code = csync_errno_to_status(errno, CSYNC_STATUS_RECONCILE_ERROR );
- }
- return rc;
- }
-
ctx->status |= CSYNC_STATUS_RECONCILE;
-
- rc = 0;
- return rc;
+ return 0;
}
/*
* local visitor which calls the user visitor with repacked stat info.
*/
-static int _csync_treewalk_visitor(csync_file_stat_t *cur, CSYNC * ctx) {
- int rc = 0;
- csync_treewalk_visit_func *visitor = NULL;
- _csync_treewalk_context *twctx = NULL;
+static int _csync_treewalk_visitor(csync_file_stat_t *cur, CSYNC * ctx, const csync_treewalk_visit_func &visitor) {
csync_s::FileMap *other_tree = nullptr;
- if (ctx == NULL) {
- return -1;
- }
-
/* we need the opposite tree! */
switch (ctx->current) {
case LOCAL_REPLICA:
@@ -220,80 +192,41 @@ static int _csync_treewalk_visitor(csync_file_stat_t *cur, CSYNC * ctx) {
ctx->status_code = CSYNC_STATUS_OK;
- twctx = (_csync_treewalk_context*) ctx->callbacks.userdata;
- if (twctx == NULL) {
- ctx->status_code = CSYNC_STATUS_PARAM_ERROR;
- return -1;
- }
-
- if (twctx->instruction_filter > 0 &&
- !(twctx->instruction_filter & cur->instruction) ) {
- return 0;
- }
-
- visitor = (csync_treewalk_visit_func*)(twctx->user_visitor);
- if (visitor != NULL) {
- rc = (*visitor)(cur, other, twctx->userdata);
-
- return rc;
- }
- ctx->status_code = CSYNC_STATUS_PARAM_ERROR;
- return -1;
+ Q_ASSERT(visitor);
+ return visitor(cur, other);
}
/*
* treewalk function, called from its wrappers below.
- *
- * it encapsulates the user visitor function, the filter and the userdata
- * into a treewalk_context structure and calls the rb treewalk function,
- * which calls the local _csync_treewalk_visitor in this module.
- * The user visitor is called from there.
*/
-static int _csync_walk_tree(CSYNC *ctx, csync_s::FileMap *tree, csync_treewalk_visit_func *visitor, int filter)
+static int _csync_walk_tree(CSYNC *ctx, csync_s::FileMap &tree, const csync_treewalk_visit_func &visitor)
{
- _csync_treewalk_context tw_ctx;
- int rc = 0;
-
- tw_ctx.userdata = ctx->callbacks.userdata;
- tw_ctx.user_visitor = visitor;
- tw_ctx.instruction_filter = filter;
-
- ctx->callbacks.userdata = &tw_ctx;
-
- for (auto &pair : *tree) {
- if (_csync_treewalk_visitor(pair.second.get(), ctx) < 0) {
- rc = -1;
- break;
+ for (auto &pair : tree) {
+ if (_csync_treewalk_visitor(pair.second.get(), ctx, visitor) < 0) {
+ return -1;
}
}
-
- if( rc < 0 ) {
- if( ctx->status_code == CSYNC_STATUS_OK )
- ctx->status_code = csync_errno_to_status(errno, CSYNC_STATUS_TREE_ERROR);
- }
- ctx->callbacks.userdata = tw_ctx.userdata;
-
- return rc;
+ return 0;
}
/*
* wrapper function for treewalk on the remote tree
*/
-int csync_walk_remote_tree(CSYNC *ctx, csync_treewalk_visit_func *visitor, int filter)
+int csync_walk_remote_tree(CSYNC *ctx, const csync_treewalk_visit_func &visitor)
{
ctx->status_code = CSYNC_STATUS_OK;
ctx->current = REMOTE_REPLICA;
- return _csync_walk_tree(ctx, &ctx->remote.files, visitor, filter);
+ return _csync_walk_tree(ctx, ctx->remote.files, visitor);
}
/*
* wrapper function for treewalk on the local tree
*/
-int csync_walk_local_tree(CSYNC *ctx, csync_treewalk_visit_func *visitor, int filter)
+int csync_walk_local_tree(CSYNC *ctx, const csync_treewalk_visit_func &visitor)
{
ctx->status_code = CSYNC_STATUS_OK;
ctx->current = LOCAL_REPLICA;
- return _csync_walk_tree(ctx, &ctx->local.files, visitor, filter);
+ return _csync_walk_tree(ctx, ctx->local.files, visitor);
}
int csync_s::reinitialize() {
@@ -310,11 +243,8 @@ int csync_s::reinitialize() {
renames.folder_renamed_from.clear();
renames.folder_renamed_to.clear();
- local_discovery_style = LocalDiscoveryStyle::FilesystemOnly;
- locally_touched_dirs.clear();
-
status = CSYNC_STATUS_INIT;
- SAFE_FREE(error_string);
+ error_string.clear();
rc = 0;
return rc;
@@ -322,7 +252,6 @@ int csync_s::reinitialize() {
csync_s::~csync_s() {
SAFE_FREE(local.uri);
- SAFE_FREE(error_string);
}
void *csync_get_userdata(CSYNC *ctx) {
@@ -368,11 +297,6 @@ CSYNC_STATUS csync_get_status(CSYNC *ctx) {
return ctx->status_code;
}
-const char *csync_get_status_string(CSYNC *ctx)
-{
- return csync_vio_get_status_string(ctx);
-}
-
void csync_request_abort(CSYNC *ctx)
{
if (ctx != NULL) {
diff --git a/src/csync/csync.h b/src/csync/csync.h
index e913a726a..1969f104f 100644
--- a/src/csync/csync.h
+++ b/src/csync/csync.h
@@ -40,6 +40,7 @@
#include <stdint.h>
#include <sys/types.h>
#include <config_csync.h>
+#include <functional>
#include <memory>
#include <QByteArray>
#include "common/remotepermissions.h"
@@ -64,40 +65,17 @@ enum csync_status_codes_e {
CSYNC_STATUS_ERROR = 1024, /* don't use this code,
*/
CSYNC_STATUS_UNSUCCESSFUL, /* Unspecific problem happend */
- CSYNC_STATUS_NO_LOCK, /* OBSOLETE does not happen anymore */
CSYNC_STATUS_STATEDB_LOAD_ERROR, /* Statedb can not be loaded. */
- CSYNC_STATUS_STATEDB_CORRUPTED, /* Statedb is corrupted */
- CSYNC_STATUS_NO_MODULE, /* URL passed to csync does not start with owncloud:// or ownclouds:// */
- CSYNC_STATUS_TIMESKEW, /* OBSOLETE */
- CSYNC_STATUS_FILESYSTEM_UNKNOWN, /* UNUSED */
- CSYNC_STATUS_TREE_ERROR, /* csync trees could not be created */
- CSYNC_STATUS_PARAM_ERROR, /* parameter is zero where not expected */
CSYNC_STATUS_UPDATE_ERROR, /* general update or discovery error */
- CSYNC_STATUS_RECONCILE_ERROR, /* general reconcile error */
- CSYNC_STATUS_PROPAGATE_ERROR, /* OBSOLETE */
- CSYNC_STATUS_REMOTE_ACCESS_ERROR, /* UNUSED */
- CSYNC_STATUS_REMOTE_CREATE_ERROR, /* UNUSED */
- CSYNC_STATUS_REMOTE_STAT_ERROR, /* UNUSED */
- CSYNC_STATUS_LOCAL_CREATE_ERROR, /* UNUSED */
- CSYNC_STATUS_LOCAL_STAT_ERROR, /* UNUSED */
- CSYNC_STATUS_PROXY_ERROR, /* UNUSED */
- CSYNC_STATUS_LOOKUP_ERROR, /* Neon fails to find proxy. Almost OBSOLETE */
- CSYNC_STATUS_SERVER_AUTH_ERROR, /* UNUSED */
- CSYNC_STATUS_PROXY_AUTH_ERROR, /* UNUSED */
- CSYNC_STATUS_CONNECT_ERROR, /* neon driven connection failed */
CSYNC_STATUS_TIMEOUT, /* UNUSED */
CSYNC_STATUS_HTTP_ERROR, /* UNUSED */
CSYNC_STATUS_PERMISSION_DENIED, /* */
CSYNC_STATUS_NOT_FOUND,
CSYNC_STATUS_FILE_EXISTS,
CSYNC_STATUS_OUT_OF_SPACE,
- CSYNC_STATUS_QUOTA_EXCEEDED, /* UNUSED */
CSYNC_STATUS_SERVICE_UNAVAILABLE,
CSYNC_STATUS_STORAGE_UNAVAILABLE,
CSYNC_STATUS_FILE_SIZE_ERROR,
- CSYNC_STATUS_CONTEXT_LOST,
- CSYNC_STATUS_MERGE_FILETREE_ERROR,
- CSYNC_STATUS_CSYNC_STATUS_ERROR,
CSYNC_STATUS_OPENDIR_ERROR,
CSYNC_STATUS_READDIR_ERROR,
CSYNC_STATUS_OPEN_ERROR,
@@ -159,7 +137,9 @@ enum ItemType {
ItemTypeFile = 0,
ItemTypeSoftLink = 1,
ItemTypeDirectory = 2,
- ItemTypeSkip = 3
+ ItemTypeSkip = 3,
+ ItemTypeVirtualFile = 4,
+ ItemTypeVirtualFileDownload = 5
};
@@ -305,38 +285,27 @@ CSYNC_STATUS OCSYNC_EXPORT csync_get_status(CSYNC *ctx);
/* Used for special modes or debugging */
int OCSYNC_EXPORT csync_set_status(CSYNC *ctx, int status);
-typedef int csync_treewalk_visit_func(csync_file_stat_t *cur, csync_file_stat_t *other, void*);
+using csync_treewalk_visit_func = std::function<int(csync_file_stat_t *cur, csync_file_stat_t *other)>;
/**
* @brief Walk the local file tree and call a visitor function for each file.
*
* @param ctx The csync context.
* @param visitor A callback function to handle the file info.
- * @param filter A filter, built from or'ed csync_instructions_e
*
* @return 0 on success, less than 0 if an error occurred.
*/
-int OCSYNC_EXPORT csync_walk_local_tree(CSYNC *ctx, csync_treewalk_visit_func *visitor, int filter);
+int OCSYNC_EXPORT csync_walk_local_tree(CSYNC *ctx, const csync_treewalk_visit_func &visitor);
/**
* @brief Walk the remote file tree and call a visitor function for each file.
*
* @param ctx The csync context.
* @param visitor A callback function to handle the file info.
- * @param filter A filter, built from and'ed csync_instructions_e
*
* @return 0 on success, less than 0 if an error occurred.
*/
-int OCSYNC_EXPORT csync_walk_remote_tree(CSYNC *ctx, csync_treewalk_visit_func *visitor, int filter);
-
-/**
- * @brief Get the csync status string.
- *
- * @param ctx The csync context.
- *
- * @return A const pointer to a string with more precise status info.
- */
-const char OCSYNC_EXPORT *csync_get_status_string(CSYNC *ctx);
+int OCSYNC_EXPORT csync_walk_remote_tree(CSYNC *ctx, const csync_treewalk_visit_func &visitor);
/**
* @brief Aborts the current sync run as soon as possible. Can be called from another thread.
diff --git a/src/csync/csync_exclude.cpp b/src/csync/csync_exclude.cpp
index c52b1ac91..b0255eb41 100644
--- a/src/csync/csync_exclude.cpp
+++ b/src/csync/csync_exclude.cpp
@@ -33,9 +33,12 @@
#include "csync_misc.h"
#include "common/utility.h"
+#include "../version.h"
#include <QString>
#include <QFileInfo>
+#include <QFile>
+#include <QDir>
/** Expands C-like escape sequences (in place)
@@ -217,8 +220,8 @@ static CSYNC_EXCLUDE_TYPE _csync_excluded_common(const char *path, bool excludeC
}
#endif
- /* We create a desktop.ini on Windows for the sidebar icon, make sure we don't sync them. */
- if (blen == 11) {
+ /* We create a Desktop.ini on Windows for the sidebar icon, make sure we don't sync it. */
+ if (blen == 11 && path == bname) {
rc = csync_fnmatch("Desktop.ini", bname, 0);
if (rc == 0) {
match = CSYNC_FILE_SILENTLY_EXCLUDED;
@@ -240,6 +243,7 @@ static CSYNC_EXCLUDE_TYPE _csync_excluded_common(const char *path, bool excludeC
using namespace OCC;
ExcludedFiles::ExcludedFiles()
+ : _clientVersion(MIRALL_VERSION_MAJOR, MIRALL_VERSION_MINOR, MIRALL_VERSION_PATCH)
{
// Windows used to use PathMatchSpec which allows *foo to match abc/deffoo.
_wildcardsMatchSlash = Utility::isWindows();
@@ -278,6 +282,11 @@ void ExcludedFiles::setWildcardsMatchSlash(bool onoff)
prepare();
}
+void ExcludedFiles::setClientVersion(ExcludedFiles::Version version)
+{
+ _clientVersion = version;
+}
+
bool ExcludedFiles::reloadExcludeFiles()
{
_allExcludes.clear();
@@ -290,6 +299,10 @@ bool ExcludedFiles::reloadExcludeFiles()
}
while (!f.atEnd()) {
QByteArray line = f.readLine().trimmed();
+ if (line.startsWith("#!version")) {
+ if (!versionDirectiveKeepNextLine(line))
+ f.readLine();
+ }
if (line.isEmpty() || line.startsWith('#'))
continue;
csync_exclude_expand_escapes(line);
@@ -301,6 +314,32 @@ bool ExcludedFiles::reloadExcludeFiles()
return success;
}
+bool ExcludedFiles::versionDirectiveKeepNextLine(const QByteArray &directive) const
+{
+ if (!directive.startsWith("#!version"))
+ return true;
+ QByteArrayList args = directive.split(' ');
+ if (args.size() != 3)
+ return true;
+ QByteArray op = args[1];
+ QByteArrayList argVersions = args[2].split('.');
+ if (argVersions.size() != 3)
+ return true;
+
+ auto argVersion = std::make_tuple(argVersions[0].toInt(), argVersions[1].toInt(), argVersions[2].toInt());
+ if (op == "<=")
+ return _clientVersion <= argVersion;
+ if (op == "<")
+ return _clientVersion < argVersion;
+ if (op == ">")
+ return _clientVersion > argVersion;
+ if (op == ">=")
+ return _clientVersion >= argVersion;
+ if (op == "==")
+ return _clientVersion == argVersion;
+ return true;
+}
+
bool ExcludedFiles::isExcluded(
const QString &filePath,
const QString &basePath,
diff --git a/src/csync/csync_exclude.h b/src/csync/csync_exclude.h
index 249ec7bff..e2eaf04c5 100644
--- a/src/csync/csync_exclude.h
+++ b/src/csync/csync_exclude.h
@@ -66,6 +66,8 @@ class OCSYNC_EXPORT ExcludedFiles : public QObject
{
Q_OBJECT
public:
+ typedef std::tuple<int, int, int> Version;
+
ExcludedFiles();
~ExcludedFiles();
@@ -115,6 +117,11 @@ public:
void setWildcardsMatchSlash(bool onoff);
/**
+ * Sets the client version, only used for testing.
+ */
+ void setClientVersion(Version version);
+
+ /**
* Generate a hook for traversal exclude pattern matching
* that csync can use.
*
@@ -132,6 +139,23 @@ public slots:
private:
/**
+ * Returns true if the version directive indicates the next line
+ * should be skipped.
+ *
+ * A version directive has the form "#!version <op> <version>"
+ * where <op> can be <, <=, ==, >, >= and <version> can be any version
+ * like 2.5.0.
+ *
+ * Example:
+ *
+ * #!version < 2.5.0
+ * myexclude
+ *
+ * Would enable the "myexclude" pattern only for versions before 2.5.0.
+ */
+ bool versionDirectiveKeepNextLine(const QByteArray &directive) const;
+
+ /**
* @brief Match the exclude pattern against the full path.
*
* @param Path is folder-relative, should not start with a /.
@@ -216,6 +240,12 @@ private:
*/
bool _wildcardsMatchSlash = false;
+ /**
+ * The client version. Used to evaluate version-dependent excludes,
+ * see versionDirectiveKeepNextLine().
+ */
+ Version _clientVersion;
+
friend class ExcludedFilesTest;
};
diff --git a/src/csync/csync_macros.h b/src/csync/csync_macros.h
index f128b434d..8bb3ae707 100644
--- a/src/csync/csync_macros.h
+++ b/src/csync/csync_macros.h
@@ -32,19 +32,8 @@
* should always be larger than the highest system errno. */
#define CSYNC_CUSTOM_ERRNO_BASE 10000
-#define ERRNO_GENERAL_ERROR CSYNC_CUSTOM_ERRNO_BASE+2
-#define ERRNO_LOOKUP_ERROR CSYNC_CUSTOM_ERRNO_BASE+3
-#define ERRNO_USER_UNKNOWN_ON_SERVER CSYNC_CUSTOM_ERRNO_BASE+4
-#define ERRNO_PROXY_AUTH CSYNC_CUSTOM_ERRNO_BASE+5
-#define ERRNO_CONNECT CSYNC_CUSTOM_ERRNO_BASE+6
-#define ERRNO_TIMEOUT CSYNC_CUSTOM_ERRNO_BASE+7
-#define ERRNO_PRECONDITION CSYNC_CUSTOM_ERRNO_BASE+8
-#define ERRNO_RETRY CSYNC_CUSTOM_ERRNO_BASE+9
-#define ERRNO_REDIRECT CSYNC_CUSTOM_ERRNO_BASE+10
#define ERRNO_WRONG_CONTENT CSYNC_CUSTOM_ERRNO_BASE+11
-#define ERRNO_ERROR_STRING CSYNC_CUSTOM_ERRNO_BASE+13
#define ERRNO_SERVICE_UNAVAILABLE CSYNC_CUSTOM_ERRNO_BASE+14
-#define ERRNO_USER_ABORT CSYNC_CUSTOM_ERRNO_BASE+16
#define ERRNO_STORAGE_UNAVAILABLE CSYNC_CUSTOM_ERRNO_BASE+17
#define ERRNO_FORBIDDEN CSYNC_CUSTOM_ERRNO_BASE+18
diff --git a/src/csync/csync_misc.cpp b/src/csync/csync_misc.cpp
index 7945c428f..5bdb4ba29 100644
--- a/src/csync/csync_misc.cpp
+++ b/src/csync/csync_misc.cpp
@@ -78,24 +78,6 @@ CSYNC_STATUS csync_errno_to_status(int error, CSYNC_STATUS default_status)
status = CSYNC_STATUS_OK;
break;
/* The custom errnos first. */
- case ERRNO_GENERAL_ERROR:
- status = CSYNC_STATUS_UNSUCCESSFUL;
- break;
- case ERRNO_LOOKUP_ERROR: /* In Neon: Server or proxy hostname lookup failed */
- status = CSYNC_STATUS_LOOKUP_ERROR;
- break;
- case ERRNO_USER_UNKNOWN_ON_SERVER: /* Neon: User authentication on server failed. */
- status = CSYNC_STATUS_SERVER_AUTH_ERROR;
- break;
- case ERRNO_PROXY_AUTH:
- status = CSYNC_STATUS_PROXY_AUTH_ERROR; /* Neon: User authentication on proxy failed */
- break;
- case ERRNO_CONNECT:
- status = CSYNC_STATUS_CONNECT_ERROR; /* Network: Connection error */
- break;
- case ERRNO_TIMEOUT:
- status = CSYNC_STATUS_TIMEOUT; /* Network: Timeout error */
- break;
case ERRNO_SERVICE_UNAVAILABLE:
status = CSYNC_STATUS_SERVICE_UNAVAILABLE; /* Service temporarily down */
break;
@@ -105,9 +87,6 @@ CSYNC_STATUS csync_errno_to_status(int error, CSYNC_STATUS default_status)
case EFBIG:
status = CSYNC_STATUS_FILE_SIZE_ERROR; /* File larger than 2MB */
break;
- case ERRNO_PRECONDITION:
- case ERRNO_RETRY:
- case ERRNO_REDIRECT:
case ERRNO_WRONG_CONTENT:
status = CSYNC_STATUS_HTTP_ERROR;
break;
@@ -125,14 +104,12 @@ CSYNC_STATUS csync_errno_to_status(int error, CSYNC_STATUS default_status)
case EEXIST: /* File exists */
status = CSYNC_STATUS_FILE_EXISTS;
break;
- case EINVAL:
- status = CSYNC_STATUS_PARAM_ERROR;
- break;
case ENOSPC:
status = CSYNC_STATUS_OUT_OF_SPACE;
break;
/* All the remaining basic errnos: */
+ case EINVAL: /* Invalid argument */
case EIO: /* I/O error */
case ESRCH: /* No such process */
case EINTR: /* Interrupted system call */
@@ -162,7 +139,6 @@ CSYNC_STATUS csync_errno_to_status(int error, CSYNC_STATUS default_status)
case EMLINK: /* Too many links */
case EPIPE: /* Broken pipe */
- case ERRNO_ERROR_STRING:
default:
status = default_status;
}
diff --git a/src/csync/csync_private.h b/src/csync/csync_private.h
index f73a1b2d5..f173a3fd4 100644
--- a/src/csync/csync_private.h
+++ b/src/csync/csync_private.h
@@ -180,7 +180,10 @@ struct OCSYNC_EXPORT csync_s {
/* csync error code */
enum csync_status_codes_e status_code = CSYNC_STATUS_OK;
- char *error_string = nullptr;
+ /* Some additional string information which is added to the error message corresponding to the error code in errno.
+ * Usually a filename
+ */
+ QString error_string;
int status = CSYNC_STATUS_INIT;
volatile bool abort = false;
@@ -190,20 +193,22 @@ struct OCSYNC_EXPORT csync_s {
*/
bool read_remote_from_db = false;
- LocalDiscoveryStyle local_discovery_style = LocalDiscoveryStyle::FilesystemOnly;
-
- /**
- * List of folder-relative directory paths that should be scanned on the
- * filesystem if the local_discovery_style suggests it.
- *
- * Their parents will be scanned too. The paths don't start with a /.
- */
- std::set<QByteArray> locally_touched_dirs;
+ std::function<bool(const QByteArray &)> should_discover_locally_fn;
bool ignore_hidden_files = true;
bool upload_conflict_files = false;
+ /**
+ * Whether new remote files should start out as virtual.
+ */
+ bool new_files_are_virtual = false;
+
+ /**
+ * The suffix to use for virtual files.
+ */
+ QByteArray virtual_file_suffix;
+
csync_s(const char *localUri, OCC::SyncJournalDb *statedb);
~csync_s();
int reinitialize();
@@ -216,17 +221,6 @@ struct OCSYNC_EXPORT csync_s {
csync_s &operator=(const csync_s &) = delete;
};
-/*
- * context for the treewalk function
- */
-struct _csync_treewalk_context_s
-{
- csync_treewalk_visit_func *user_visitor;
- int instruction_filter;
- void *userdata;
-};
-typedef struct _csync_treewalk_context_s _csync_treewalk_context;
-
void set_errno_from_http_errcode( int err );
/**
diff --git a/src/csync/csync_reconcile.cpp b/src/csync/csync_reconcile.cpp
index ce1beb142..02812b468 100644
--- a/src/csync/csync_reconcile.cpp
+++ b/src/csync/csync_reconcile.cpp
@@ -92,7 +92,7 @@ static csync_file_stat_t *_csync_check_ignored(csync_s::FileMap *tree, const Byt
* (timestamp is newer), it is not overwritten. If both files, on the
* source and the destination, have been changed, the newer file wins.
*/
-static int _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) {
+static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) {
csync_s::FileMap *our_tree = nullptr;
csync_s::FileMap *other_tree = nullptr;
@@ -110,7 +110,7 @@ static int _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) {
break;
}
- csync_file_stat_t *other = other_tree->findFile(cur->path);;
+ csync_file_stat_t *other = other_tree->findFile(cur->path);
if (!other) {
/* Check the renamed path as well. */
@@ -122,6 +122,31 @@ static int _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) {
/* If it is ignored, other->instruction will be IGNORE so this one will also be ignored */
}
+ // If the user adds a file locally check whether a virtual file for that name exists.
+ // If so, go to "potential conflict" mode by switching the remote entry to be a
+ // real file.
+ if (!other
+ && ctx->current == LOCAL_REPLICA
+ && cur->instruction == CSYNC_INSTRUCTION_NEW
+ && cur->type != ItemTypeVirtualFile) {
+ // Check if we have a virtual file entry in the remote tree
+ auto virtualFilePath = cur->path;
+ virtualFilePath.append(ctx->virtual_file_suffix);
+ other = other_tree->findFile(virtualFilePath);
+ if (!other) {
+ /* Check the renamed path as well. */
+ other = other_tree->findFile(csync_rename_adjust_parent_path(ctx, virtualFilePath));
+ }
+ if (other && other->type == ItemTypeVirtualFile) {
+ qCInfo(lcReconcile) << "Found virtual file for local" << cur->path << "in remote tree";
+ other->path = cur->path;
+ other->type = ItemTypeVirtualFileDownload;
+ other->instruction = CSYNC_INSTRUCTION_EVAL;
+ } else {
+ other = nullptr;
+ }
+ }
+
/* file only found on current replica */
if (!other) {
switch(cur->instruction) {
@@ -141,6 +166,34 @@ static int _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) {
cur->instruction = CSYNC_INSTRUCTION_NEW;
break;
}
+ /* If the local virtual file is gone, it should be reestablished.
+ * Unless the base file is seen in the local tree now. */
+ if (cur->type == ItemTypeVirtualFile
+ && ctx->current == REMOTE_REPLICA
+ && cur->path.endsWith(ctx->virtual_file_suffix)
+ && !other_tree->findFile(cur->path.left(cur->path.size() - ctx->virtual_file_suffix.size()))) {
+ cur->instruction = CSYNC_INSTRUCTION_NEW;
+ break;
+ }
+
+ /* If a virtual file is supposed to be downloaded, the local tree
+ * will see "foo.owncloud" NONE while the remote might see "foo".
+ * In the common case of remote NEW we don't want to trigger the REMOVE
+ * that would normally be done for foo.owncloud since the download for
+ * "foo" will take care of it.
+ * If it was removed remotely, or moved remotely, the REMOVE is what we want.
+ */
+ if (cur->type == ItemTypeVirtualFileDownload
+ && ctx->current == LOCAL_REPLICA
+ && cur->path.endsWith(ctx->virtual_file_suffix)) {
+ auto actualOther = other_tree->findFile(cur->path.left(cur->path.size() - ctx->virtual_file_suffix.size()));
+ if (actualOther
+ && (actualOther->instruction == CSYNC_INSTRUCTION_NEW
+ || actualOther->instruction == CSYNC_INSTRUCTION_CONFLICT)) {
+ cur->instruction = CSYNC_INSTRUCTION_NONE;
+ break;
+ }
+ }
cur->instruction = CSYNC_INSTRUCTION_REMOVE;
break;
case CSYNC_INSTRUCTION_EVAL_RENAME: {
@@ -157,7 +210,7 @@ static int _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) {
/* First, check that the file is NOT in our tree (another file with the same name was added) */
if (our_tree->findFile(basePath)) {
other = nullptr;
- qCDebug(lcReconcile, "Origin found in our tree : %s", basePath.constData());
+ qCInfo(lcReconcile, "Origin found in our tree : %s", basePath.constData());
} else {
/* Find the potential rename source file in the other tree.
* If the renamed file could not be found in the opposite tree, that is because it
@@ -165,7 +218,7 @@ static int _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) {
* The journal is cleaned up later after propagation.
*/
other = other_tree->findFile(basePath);
- qCDebug(lcReconcile, "Rename origin in other tree (%s) %s",
+ qCInfo(lcReconcile, "Rename origin in other tree (%s) %s",
basePath.constData(), other ? "found" : "not found");
}
@@ -176,7 +229,7 @@ static int _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) {
// Some other EVAL_RENAME already claimed other.
// We do nothing: maybe a different candidate for
// other is found as well?
- qCDebug(lcReconcile, "Other has already been renamed to %s",
+ qCInfo(lcReconcile, "Other has already been renamed to %s",
other->rename_path.constData());
} else if (cur->type == ItemTypeDirectory
// The local replica is reconciled first, so the remote tree would
@@ -188,13 +241,17 @@ static int _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) {
|| other->instruction == CSYNC_INSTRUCTION_NONE
|| other->instruction == CSYNC_INSTRUCTION_UPDATE_METADATA
|| other->instruction == CSYNC_INSTRUCTION_REMOVE) {
- qCDebug(lcReconcile, "Switching %s to RENAME to %s",
+ qCInfo(lcReconcile, "Switching %s to RENAME to %s",
other->path.constData(), cur->path.constData());
other->instruction = CSYNC_INSTRUCTION_RENAME;
other->rename_path = cur->path;
if( !cur->file_id.isEmpty() ) {
other->file_id = cur->file_id;
}
+ if (ctx->current == LOCAL_REPLICA) {
+ // Keep the local mtime.
+ other->modtime = cur->modtime;
+ }
other->inode = cur->inode;
cur->instruction = CSYNC_INSTRUCTION_NONE;
// We have consumed 'other': exit this loop to not consume another one.
@@ -208,7 +265,7 @@ static int _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) {
// Local: The remote reconcile will be able to deal with this.
// Remote: The local replica has already dealt with this.
// See the EVAL_RENAME case when other was found directly.
- qCDebug(lcReconcile, "File in a renamed directory, other side's instruction: %d",
+ qCInfo(lcReconcile, "File in a renamed directory, other side's instruction: %d",
other->instruction);
cur->instruction = CSYNC_INSTRUCTION_NONE;
} else {
@@ -216,7 +273,7 @@ static int _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) {
// and the instruction in the local tree is NEW while cur has EVAL_RENAME
// due to a remote move of the same file. In these scenarios we just
// want the instruction to stay NEW.
- qCDebug(lcReconcile, "Other already has instruction %d",
+ qCInfo(lcReconcile, "Other already has instruction %d",
other->instruction);
}
};
@@ -224,7 +281,7 @@ static int _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) {
if (ctx->current == LOCAL_REPLICA) {
/* use the old name to find the "other" node */
OCC::SyncJournalFileRecord base;
- qCDebug(lcReconcile, "Finding rename origin through inode %" PRIu64 "",
+ qCInfo(lcReconcile, "Finding rename origin through inode %" PRIu64 "",
cur->inode);
ctx->statedb->getFileRecordByInode(cur->inode, &base);
renameCandidateProcessing(base._path);
@@ -237,7 +294,7 @@ static int _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) {
// line.
auto basePath = csync_rename_adjust_full_path_source(ctx, cur->path);
if (basePath != cur->path) {
- qCDebug(lcReconcile, "Trying rename origin by csync_rename mapping %s",
+ qCInfo(lcReconcile, "Trying rename origin by csync_rename mapping %s",
basePath.constData());
// We go through getFileRecordsByFileId to ensure the basePath
// computed in this way also has the expected fileid.
@@ -250,7 +307,7 @@ static int _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) {
// Also feed all the other files with the same fileid if necessary
if (!processedRename) {
- qCDebug(lcReconcile, "Finding rename origin through file ID %s",
+ qCInfo(lcReconcile, "Finding rename origin through file ID %s",
cur->file_id.constData());
ctx->statedb->getFileRecordsByFileId(cur->file_id,
[&](const OCC::SyncJournalFileRecord &base) { renameCandidateProcessing(base._path); });
@@ -317,7 +374,8 @@ static int _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) {
auto remoteNode = ctx->current == REMOTE_REPLICA ? cur : other;
auto localNode = ctx->current == REMOTE_REPLICA ? other : cur;
remoteNode->instruction = CSYNC_INSTRUCTION_NONE;
- localNode->instruction = up._modtime == localNode->modtime ? CSYNC_INSTRUCTION_UPDATE_METADATA : CSYNC_INSTRUCTION_SYNC;
+ localNode->instruction = up._modtime == localNode->modtime && up._size == localNode->size ?
+ CSYNC_INSTRUCTION_UPDATE_METADATA : CSYNC_INSTRUCTION_SYNC;
// Update the etag and other server metadata in the journal already
// (We can't use a typical CSYNC_INSTRUCTION_UPDATE_METADATA because
@@ -369,7 +427,10 @@ static int _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) {
cur->instruction = CSYNC_INSTRUCTION_UPDATE_METADATA;
other->instruction = CSYNC_INSTRUCTION_NONE;
} else {
- cur->instruction = CSYNC_INSTRUCTION_SYNC;
+ if (cur->instruction != CSYNC_INSTRUCTION_NEW
+ && cur->instruction != CSYNC_INSTRUCTION_SYNC) {
+ cur->instruction = CSYNC_INSTRUCTION_SYNC;
+ }
other->instruction = CSYNC_INSTRUCTION_NONE;
}
break;
@@ -388,6 +449,17 @@ static int _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) {
if (cur->instruction == CSYNC_INSTRUCTION_EVAL)
cur->instruction = CSYNC_INSTRUCTION_NEW;
break;
+ case CSYNC_INSTRUCTION_NONE:
+ // NONE/NONE on virtual files might become a REMOVE if the base file
+ // is found in the local tree.
+ if (cur->type == ItemTypeVirtualFile
+ && other->instruction == CSYNC_INSTRUCTION_NONE
+ && ctx->current == LOCAL_REPLICA
+ && cur->path.endsWith(ctx->virtual_file_suffix)
+ && ctx->local.files.findFile(cur->path.left(cur->path.size() - ctx->virtual_file_suffix.size()))) {
+ cur->instruction = CSYNC_INSTRUCTION_REMOVE;
+ }
+ break;
default:
break;
}
@@ -434,11 +506,9 @@ static int _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx) {
cur->path.constData());
}
}
-
- return 0;
}
-int csync_reconcile_updates(CSYNC *ctx) {
+void csync_reconcile_updates(CSYNC *ctx) {
csync_s::FileMap *tree = nullptr;
switch (ctx->current) {
@@ -453,12 +523,8 @@ int csync_reconcile_updates(CSYNC *ctx) {
}
for (auto &pair : *tree) {
- if (_csync_merge_algorithm_visitor(pair.second.get(), ctx) < 0) {
- ctx->status_code = CSYNC_STATUS_RECONCILE_ERROR;
- return -1;
- }
+ _csync_merge_algorithm_visitor(pair.second.get(), ctx);
}
- return 0;
}
/* vim: set ts=8 sw=2 et cindent: */
diff --git a/src/csync/csync_reconcile.h b/src/csync/csync_reconcile.h
index f333adba6..4b69250d0 100644
--- a/src/csync/csync_reconcile.h
+++ b/src/csync/csync_reconcile.h
@@ -46,11 +46,9 @@
*
* @param ctx The csync context to use.
*
- * @return 0 on success, < 0 on error.
- *
* @todo Add an argument to set the algorithm to use.
*/
-int OCSYNC_EXPORT csync_reconcile_updates(CSYNC *ctx);
+void OCSYNC_EXPORT csync_reconcile_updates(CSYNC *ctx);
/**
* }@
diff --git a/src/csync/csync_update.cpp b/src/csync/csync_update.cpp
index 9ce636476..6b5f2fc1c 100644
--- a/src/csync/csync_update.cpp
+++ b/src/csync/csync_update.cpp
@@ -47,6 +47,7 @@
#include "common/asserts.h"
#include <QtCore/QTextCodec>
+#include <QtCore/QFile>
// Needed for PRIu64 on MinGW in C++ mode.
#define __STDC_FORMAT_MACROS
@@ -108,15 +109,9 @@ static bool _csync_mtime_equal(time_t a, time_t b)
* See doc/dev/sync-algorithm.md for an overview.
*/
static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> fs) {
+ Q_ASSERT(fs);
OCC::SyncJournalFileRecord base;
CSYNC_EXCLUDE_TYPE excluded = CSYNC_NOT_EXCLUDED;
-
- if (fs == NULL) {
- errno = EINVAL;
- ctx->status_code = CSYNC_STATUS_PARAM_ERROR;
- return -1;
- }
-
if (fs->type == ItemTypeSkip) {
excluded =CSYNC_FILE_EXCLUDE_STAT_FAILED;
} else {
@@ -131,12 +126,12 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
* This code should probably be in csync_exclude, but it does not have the fs parameter.
* Keep it here for now */
if (ctx->ignore_hidden_files && (fs->is_hidden)) {
- qCDebug(lcUpdate, "file excluded because it is a hidden file: %s", fs->path.constData());
+ qCInfo(lcUpdate, "file excluded because it is a hidden file: %s", fs->path.constData());
excluded = CSYNC_FILE_EXCLUDE_HIDDEN;
}
} else {
/* File is ignored because it's matched by a user- or system exclude pattern. */
- qCDebug(lcUpdate, "%s excluded (%d)", fs->path.constData(), excluded);
+ qCInfo(lcUpdate, "%s excluded (%d)", fs->path.constData(), excluded);
if (excluded == CSYNC_FILE_EXCLUDE_AND_REMOVE) {
return 1;
}
@@ -161,7 +156,7 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
*/
QTextEncoder encoder(localCodec, QTextCodec::ConvertInvalidToNull);
if (encoder.fromUnicode(QString::fromUtf8(fs->path)).contains('\0')) {
- qCDebug(lcUpdate, "cannot encode %s to local encoding %d",
+ qCInfo(lcUpdate, "cannot encode %s to local encoding %d",
fs->path.constData(), localCodec->mibEnum());
excluded = CSYNC_FILE_EXCLUDE_CANNOT_ENCODE;
}
@@ -169,7 +164,7 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
if (fs->type == ItemTypeFile ) {
if (fs->modtime == 0) {
- qCDebug(lcUpdate, "file: %s - mtime is zero!", fs->path.constData());
+ qCInfo(lcUpdate, "file: %s - mtime is zero!", fs->path.constData());
}
}
@@ -192,19 +187,64 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
return -1;
}
+ // The db entry might be for a virtual file, so look for that on the
+ // remote side. If we find one, change the current fs to look like a
+ // virtual file too, because that's what one would see if the remote
+ // db was filled from the database.
+ if (ctx->current == REMOTE_REPLICA && !base.isValid() && fs->type == ItemTypeFile) {
+ auto virtualFilePath = fs->path;
+ virtualFilePath.append(ctx->virtual_file_suffix);
+ ctx->statedb->getFileRecord(virtualFilePath, &base);
+ if (base.isValid() && base._type == ItemTypeVirtualFile) {
+ fs->type = ItemTypeVirtualFile;
+ fs->path = virtualFilePath;
+ } else {
+ base = OCC::SyncJournalFileRecord();
+ }
+ }
+
if(base.isValid()) { /* there is an entry in the database */
/* we have an update! */
qCInfo(lcUpdate, "Database entry found, compare: %" PRId64 " <-> %" PRId64
", etag: %s <-> %s, inode: %" PRId64 " <-> %" PRId64
- ", size: %" PRId64 " <-> %" PRId64 ", perms: %x <-> %x, ignore: %d",
+ ", size: %" PRId64 " <-> %" PRId64
+ ", perms: %x <-> %x"
+ ", type: %d <-> %d"
+ ", checksum: %s <-> %s"
+ ", ignore: %d",
((int64_t) fs->modtime), ((int64_t) base._modtime),
fs->etag.constData(), base._etag.constData(), (uint64_t) fs->inode, (uint64_t) base._inode,
- (uint64_t) fs->size, (uint64_t) base._fileSize, *reinterpret_cast<short*>(&fs->remotePerm), *reinterpret_cast<short*>(&base._remotePerm), base._serverHasIgnoredFiles );
+ (uint64_t) fs->size, (uint64_t) base._fileSize,
+ *reinterpret_cast<short*>(&fs->remotePerm), *reinterpret_cast<short*>(&base._remotePerm),
+ fs->type, base._type,
+ fs->checksumHeader.constData(), base._checksumHeader.constData(),
+ base._serverHasIgnoredFiles );
+
+ // If the db suggests a virtual file should be downloaded,
+ // treat the file as new on the remote.
+ if (ctx->current == REMOTE_REPLICA && base._type == ItemTypeVirtualFileDownload) {
+ fs->instruction = CSYNC_INSTRUCTION_NEW;
+ fs->type = ItemTypeVirtualFileDownload;
+ goto out;
+ }
+
+ // If what the db thinks is a virtual file is actually a file/dir,
+ // treat it as new locally.
+ if (ctx->current == LOCAL_REPLICA
+ && (base._type == ItemTypeVirtualFile || base._type == ItemTypeVirtualFileDownload)
+ && fs->type != ItemTypeVirtualFile) {
+ fs->instruction = CSYNC_INSTRUCTION_EVAL;
+ goto out;
+ }
+
if (ctx->current == REMOTE_REPLICA && fs->etag != base._etag) {
fs->instruction = CSYNC_INSTRUCTION_EVAL;
- // Preserve the EVAL flag later on if the type has changed.
- if (base._type != fs->type) {
+ if (fs->type == ItemTypeVirtualFile) {
+ // If the local thing is a virtual file, we just update the metadata
+ fs->instruction = CSYNC_INSTRUCTION_UPDATE_METADATA;
+ } else if (base._type != fs->type) {
+ // Preserve the EVAL flag later on if the type has changed.
fs->child_modified = true;
}
@@ -229,7 +269,7 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
checksumIdentical = fs->checksumHeader == base._checksumHeader;
}
if (checksumIdentical) {
- qCDebug(lcUpdate, "NOTE: Checksums are identical, file did not actually change: %s", fs->path.constData());
+ qCInfo(lcUpdate, "NOTE: Checksums are identical, file did not actually change: %s", fs->path.constData());
fs->instruction = CSYNC_INSTRUCTION_UPDATE_METADATA;
goto out;
}
@@ -253,7 +293,7 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
* The metadata comparison ensure that we fetch all the file id or permission when
* upgrading owncloud
*/
- qCDebug(lcUpdate, "Reading from database: %s", fs->path.constData());
+ qCInfo(lcUpdate, "Reading from database: %s", fs->path.constData());
ctx->remote.read_from_db = true;
}
/* If it was remembered in the db that the remote dir has ignored files, store
@@ -264,7 +304,7 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
}
if (metadata_differ) {
/* file id or permissions has changed. Which means we need to update them in the DB. */
- qCDebug(lcUpdate, "Need to update metadata for: %s", fs->path.constData());
+ qCInfo(lcUpdate, "Need to update metadata for: %s", fs->path.constData());
fs->instruction = CSYNC_INSTRUCTION_UPDATE_METADATA;
} else {
fs->instruction = CSYNC_INSTRUCTION_NONE;
@@ -272,7 +312,7 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
} else {
/* check if it's a file and has been renamed */
if (ctx->current == LOCAL_REPLICA) {
- qCDebug(lcUpdate, "Checking for rename based on inode # %" PRId64 "", (uint64_t) fs->inode);
+ qCInfo(lcUpdate, "Checking for rename based on inode # %" PRId64 "", (uint64_t) fs->inode);
OCC::SyncJournalFileRecord base;
if(!ctx->statedb->getFileRecordByInode(fs->inode, &base)) {
@@ -299,13 +339,13 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
_rel_to_abs(ctx, fs->path), base._checksumHeader,
ctx->callbacks.checksum_userdata);
if (!fs->checksumHeader.isEmpty()) {
- qCDebug(lcUpdate, "checking checksum of potential rename %s %s <-> %s", fs->path.constData(), fs->checksumHeader.constData(), base._checksumHeader.constData());
+ qCInfo(lcUpdate, "checking checksum of potential rename %s %s <-> %s", fs->path.constData(), fs->checksumHeader.constData(), base._checksumHeader.constData());
isRename = fs->checksumHeader == base._checksumHeader;
}
}
if (isRename) {
- qCDebug(lcUpdate, "pot rename detected based on inode # %" PRId64 "", (uint64_t) fs->inode);
+ qCInfo(lcUpdate, "pot rename detected based on inode # %" PRId64 "", (uint64_t) fs->inode);
/* inode found so the file has been renamed */
fs->instruction = CSYNC_INSTRUCTION_EVAL_RENAME;
if (fs->type == ItemTypeDirectory) {
@@ -315,6 +355,8 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
goto out;
} else {
+ qCInfo(lcUpdate, "Checking for rename based on fileid %s", fs->file_id.constData());
+
/* Remote Replica Rename check */
fs->instruction = CSYNC_INSTRUCTION_NEW;
@@ -325,10 +367,19 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
if (!base.isValid())
return;
+ if (base._type == ItemTypeVirtualFileDownload) {
+ // Remote rename of a virtual file we have locally scheduled
+ // for download. We just consider this NEW but mark it for download.
+ fs->type = ItemTypeVirtualFileDownload;
+ done = true;
+ return;
+ }
+
// Some things prohibit rename detection entirely.
// Since we don't do the same checks again in reconcile, we can't
// just skip the candidate, but have to give up completely.
- if (base._type != fs->type) {
+ if (base._type != fs->type
+ && base._type != ItemTypeVirtualFile) {
qCWarning(lcUpdate, "file types different, not a rename");
done = true;
return;
@@ -340,6 +391,14 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
return;
}
+ // Now we know there is a sane rename candidate.
+
+ // Rename of a virtual file
+ if (base._type == ItemTypeVirtualFile && fs->type == ItemTypeFile) {
+ fs->type = ItemTypeVirtualFile;
+ fs->path.append(ctx->virtual_file_suffix);
+ }
+
// Record directory renames
if (fs->type == ItemTypeDirectory) {
// If the same folder was already renamed by a different entry,
@@ -351,7 +410,7 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
csync_rename_record(ctx, base._path, fs->path);
}
- qCDebug(lcUpdate, "remote rename detected based on fileid %s --> %s", base._path.constData(), fs->path.constData());
+ qCInfo(lcUpdate, "remote rename detected based on fileid %s --> %s", base._path.constData(), fs->path.constData());
fs->instruction = CSYNC_INSTRUCTION_EVAL_RENAME;
done = true;
};
@@ -369,6 +428,15 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
return 1;
}
}
+
+ // Turn new remote files into virtual files if the option is enabled.
+ if (ctx->new_files_are_virtual
+ && fs->instruction == CSYNC_INSTRUCTION_NEW
+ && fs->type == ItemTypeFile) {
+ fs->type = ItemTypeVirtualFile;
+ fs->path.append(ctx->virtual_file_suffix);
+ }
+
goto out;
}
}
@@ -459,11 +527,11 @@ int csync_walker(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> fs) {
}
break;
case ItemTypeSoftLink:
- qCDebug(lcUpdate, "symlink: %s - not supported", fs->path.constData());
+ qCInfo(lcUpdate, "symlink: %s - not supported", fs->path.constData());
break;
default:
+ qCInfo(lcUpdate, "item: %s - item type %d not iterated", fs->path.constData(), fs->type);
return 0;
- break;
}
rc = _csync_detect_update(ctx, std::move(fs));
@@ -471,7 +539,7 @@ int csync_walker(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> fs) {
return rc;
}
-static bool fill_tree_from_db(CSYNC *ctx, const char *uri)
+static bool fill_tree_from_db(CSYNC *ctx, const char *uri, bool singleFile = false)
{
int64_t count = 0;
QByteArray skipbase;
@@ -486,7 +554,7 @@ static bool fill_tree_from_db(CSYNC *ctx, const char *uri)
* their correct etags again and we don't run into this case.
*/
if (rec._etag == "_invalid_") {
- qCDebug(lcUpdate, "%s selective sync excluded", rec._path.constData());
+ qCInfo(lcUpdate, "%s selective sync excluded", rec._path.constData());
skipbase = rec._path;
skipbase += '/';
return;
@@ -526,9 +594,19 @@ static bool fill_tree_from_db(CSYNC *ctx, const char *uri)
++count;
};
- if (!ctx->statedb->getFilesBelowPath(uri, rowCallback)) {
- ctx->status_code = CSYNC_STATUS_STATEDB_LOAD_ERROR;
- return false;
+ if (singleFile) {
+ OCC::SyncJournalFileRecord record;
+ if (ctx->statedb->getFileRecord(QByteArray(uri), &record) && record.isValid()) {
+ rowCallback(record);
+ } else {
+ ctx->status_code = CSYNC_STATUS_STATEDB_LOAD_ERROR;
+ return false;
+ }
+ } else {
+ if (!ctx->statedb->getFilesBelowPath(uri, rowCallback)) {
+ ctx->status_code = CSYNC_STATUS_STATEDB_LOAD_ERROR;
+ return false;
+ }
}
qInfo(lcUpdate, "%" PRId64 " entries read below path %s from db.", count, uri);
@@ -569,23 +647,12 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
bool do_read_from_db = (ctx->current == REMOTE_REPLICA && ctx->remote.read_from_db);
const char *db_uri = uri;
- if (ctx->current == LOCAL_REPLICA
- && ctx->local_discovery_style == LocalDiscoveryStyle::DatabaseAndFilesystem) {
+ if (ctx->current == LOCAL_REPLICA && ctx->should_discover_locally_fn) {
const char *local_uri = uri + strlen(ctx->local.uri);
if (*local_uri == '/')
++local_uri;
db_uri = local_uri;
- do_read_from_db = true;
-
- // Minor bug: local_uri doesn't have a trailing /. Example: Assume it's "d/foo"
- // and we want to check whether we should read from the db. Assume "d/foo a" is
- // in locally_touched_dirs. Then this check will say no, don't read from the db!
- // (because "d/foo" < "d/foo a" < "d/foo/bar")
- // C++14: Could skip the conversion to QByteArray here.
- auto it = ctx->locally_touched_dirs.lower_bound(QByteArray(local_uri));
- if (it != ctx->locally_touched_dirs.end() && it->startsWith(local_uri)) {
- do_read_from_db = false;
- }
+ do_read_from_db = !ctx->should_discover_locally_fn(QByteArray(local_uri));
}
if (!depth) {
@@ -612,7 +679,6 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
ctx->status_code = CSYNC_STATUS_ABORTED;
goto error;
}
- int asp = 0;
/* permission denied */
ctx->status_code = csync_errno_to_status(errno, CSYNC_STATUS_OPENDIR_ERROR);
if (errno == EACCES) {
@@ -621,8 +687,7 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
return 0;
}
} else if(errno == ENOENT) {
- asp = asprintf( &ctx->error_string, "%s", uri);
- ASSERT(asp >= 0);
+ ctx->error_string = QString::fromUtf8(uri);
}
// 403 Forbidden can be sent by the server if the file firewall is active.
// A file or directory should be ignored and sync must continue. See #3490
@@ -649,11 +714,25 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
goto error;
}
- while ((dirent = csync_vio_readdir(ctx, dh))) {
+ while (true) {
+ // Get the next item in the directory
+ errno = 0;
+ dirent = csync_vio_readdir(ctx, dh);
+ if (!dirent) {
+ if (errno != 0) {
+ // Note: Windows vio converts any error into EACCES
+ qCWarning(lcUpdate, "readdir failed for file in %s - errno %d", uri, errno);
+ goto error;
+ }
+
+ // Normal case: End of items in directory
+ break;
+ }
+
/* Conversion error */
if (dirent->path.isEmpty() && !dirent->original_path.isEmpty()) {
ctx->status_code = CSYNC_STATUS_INVALID_CHARACTERS;
- ctx->error_string = c_strdup(dirent->original_path);
+ ctx->error_string = QString::fromUtf8(dirent->original_path);
dirent->original_path.clear();
goto error;
}
@@ -676,6 +755,52 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
fullpath = QByteArray() % uri % '/' % filename;
}
+ // When encountering virtual files, read the relevant
+ // entry from the db instead.
+ if (ctx->current == LOCAL_REPLICA
+ && dirent->type == ItemTypeFile
+ && filename.endsWith(ctx->virtual_file_suffix)) {
+ QByteArray db_uri = fullpath.mid(strlen(ctx->local.uri) + 1);
+
+ if( ! fill_tree_from_db(ctx, db_uri.constData(), true) ) {
+ // If we find what looks to be a spurious "abc.owncloud" the base file "abc"
+ // might have been renamed to that. Make sure that the base file is not
+ // deleted from the server.
+ OCC::SyncJournalFileRecord record;
+ QByteArray base_uri = db_uri;
+ base_uri.chop(ctx->virtual_file_suffix.size());
+ ctx->statedb->getFileRecord(base_uri, &record);
+ if (record.isValid()
+ && record._inode == dirent->inode
+ && record._fileSize == dirent->size
+ && record._modtime == dirent->modtime) {
+ qCInfo(lcUpdate) << "Base file was renamed to virtual file:" << filename;
+
+ // Let sync recreate the placeholder file to ensure it has the right size.
+ // WARNING: Side effect on database during update phase:
+ // Makes local/remote discovery order dependent!
+ ctx->statedb->deleteFileRecord(base_uri);
+ record._path = db_uri;
+ record._type = ItemTypeVirtualFile;
+ ctx->statedb->setFileRecord(record);
+
+ QFile::remove(fullpath);
+ } else {
+ // Remove the spurious file if it looks like a placeholder file
+ // (we know placeholder files contain " ")
+ if (dirent->size <= 1) {
+ QFile::remove(fullpath);
+ qCWarning(lcUpdate) << "Wiping virtual file without db entry for" << filename;
+ } else {
+ qCWarning(lcUpdate) << "Virtual file without db entry for" << filename
+ << "but looks odd, keeping";
+ }
+ }
+ }
+
+ continue;
+ }
+
/* if the filename starts with a . we consider it a hidden file
* For windows, the hidden state is also discovered within the vio
* local stat function.
@@ -689,10 +814,7 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
// Now process to have a relative path to the sync root for the local replica, or to the data root on the remote.
dirent->path = fullpath;
if (ctx->current == LOCAL_REPLICA) {
- if (dirent->path.size() <= (int)strlen(ctx->local.uri)) {
- ctx->status_code = CSYNC_STATUS_PARAM_ERROR;
- goto error;
- }
+ ASSERT(dirent->path.startsWith(ctx->local.uri)); // path is relative to uri
// "len + 1" to include the slash in-between.
dirent->path = dirent->path.mid(strlen(ctx->local.uri) + 1);
}
@@ -746,7 +868,7 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
}
csync_vio_closedir(ctx, dh);
- qCDebug(lcUpdate, " <= Closing walk for %s with read_from_db %d", uri, read_from_db);
+ qCInfo(lcUpdate, " <= Closing walk for %s with read_from_db %d", uri, read_from_db);
return rc;
diff --git a/src/csync/csync_util.cpp b/src/csync/csync_util.cpp
index 761537bb8..53c6e00ee 100644
--- a/src/csync/csync_util.cpp
+++ b/src/csync/csync_util.cpp
@@ -194,6 +194,6 @@ time_t oc_httpdate_parse( const char *date ) {
bool csync_is_collision_safe_hash(const QByteArray &checksum_header)
{
- return checksum_header.startsWith("SHA1:")
+ return checksum_header.startsWith("SHA")
|| checksum_header.startsWith("MD5:");
}
diff --git a/src/csync/vio/csync_vio.cpp b/src/csync/vio/csync_vio.cpp
index 3e9403c0e..88f75467a 100644
--- a/src/csync/vio/csync_vio.cpp
+++ b/src/csync/vio/csync_vio.cpp
@@ -40,7 +40,7 @@ csync_vio_handle_t *csync_vio_opendir(CSYNC *ctx, const char *name) {
break;
case LOCAL_REPLICA:
if( ctx->callbacks.update_callback ) {
- ctx->callbacks.update_callback(ctx->current, name, ctx->callbacks.update_callback_userdata);
+ ctx->callbacks.update_callback(/*local=*/true, name, ctx->callbacks.update_callback_userdata);
}
return csync_vio_local_opendir(name);
break;
@@ -90,9 +90,3 @@ std::unique_ptr<csync_file_stat_t> csync_vio_readdir(CSYNC *ctx, csync_vio_handl
return NULL;
}
-char *csync_vio_get_status_string(CSYNC *ctx) {
- if(ctx->error_string) {
- return ctx->error_string;
- }
- return 0;
-}
diff --git a/src/csync/vio/csync_vio.h b/src/csync/vio/csync_vio.h
index 7d3a2e0b4..007d068e8 100644
--- a/src/csync/vio/csync_vio.h
+++ b/src/csync/vio/csync_vio.h
@@ -35,8 +35,4 @@ typedef struct fhandle_s {
csync_vio_handle_t *csync_vio_opendir(CSYNC *ctx, const char *name);
int csync_vio_closedir(CSYNC *ctx, csync_vio_handle_t *dhandle);
std::unique_ptr<csync_file_stat_t> csync_vio_readdir(CSYNC *ctx, csync_vio_handle_t *dhandle);
-
-char *csync_vio_get_status_string(CSYNC *ctx);
-
-
#endif /* _CSYNC_VIO_H */
diff --git a/src/csync/vio/csync_vio_local_win.cpp b/src/csync/vio/csync_vio_local_win.cpp
index 1c9a5907f..9ec585a43 100644
--- a/src/csync/vio/csync_vio_local_win.cpp
+++ b/src/csync/vio/csync_vio_local_win.cpp
@@ -156,6 +156,7 @@ std::unique_ptr<csync_file_stat_t> csync_vio_local_readdir(csync_vio_handle_t *d
// might be error, check!
int dwError = GetLastError();
if (dwError != ERROR_NO_MORE_FILES) {
+ qCWarning(lcCSyncVIOLocal, "FindNextFile error %d", dwError);
errno = EACCES; // no more files is fine. Otherwise EACCESS
}
return nullptr;
@@ -181,7 +182,7 @@ std::unique_ptr<csync_file_stat_t> csync_vio_local_readdir(csync_vio_handle_t *d
}
} else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DEVICE
|| handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE
- || handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY) {
+ ) {
file_stat->type = ItemTypeSkip;
} else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
file_stat->type = ItemTypeDirectory;
diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt
index bc50ebbb7..3648981e3 100644
--- a/src/gui/CMakeLists.txt
+++ b/src/gui/CMakeLists.txt
@@ -47,6 +47,8 @@ set(client_SRCS
accountmanager.cpp
accountsettings.cpp
application.cpp
+ clientproxy.cpp
+ connectionvalidator.cpp
folder.cpp
folderman.cpp
folderstatusmodel.cpp
@@ -137,7 +139,7 @@ IF( APPLE )
if(SPARKLE_FOUND)
# Define this, we need to check in updater.cpp
add_definitions( -DHAVE_SPARKLE )
- list(APPEND updater_SRCS updater/sparkleupdater_mac.mm)
+ list(APPEND updater_SRCS updater/sparkleupdater_mac.mm updater/sparkleupdater.h)
endif()
ENDIF()
@@ -214,18 +216,12 @@ endif()
# list(APPEND CMAKE_MODULE_PATH ${ECM_MODULE_PATH})
include(ECMAddAppIcon)
-# For historical reasons we can not use the application_shortname
-# for ownCloud but must rather set it manually.
-if (NOT DEFINED APPLICATION_ICON_NAME)
- set(APPLICATION_ICON_NAME ${APPLICATION_SHORTNAME})
-endif()
-
file(GLOB_RECURSE OWNCLOUD_ICONS "${theme_dir}/colored/*-${APPLICATION_ICON_NAME}-icon*")
if(APPLE)
file(GLOB_RECURSE OWNCLOUD_SIDEBAR_ICONS "${theme_dir}/colored/*-${APPLICATION_ICON_NAME}-sidebar*")
MESSAGE(STATUS "OWNCLOUD_SIDEBAR_ICONS: ${APPLICATION_ICON_NAME}: ${OWNCLOUD_SIDEBAR_ICONS}")
endif()
-ecm_add_app_icon(final_src ICONS "${OWNCLOUD_ICONS}" SIDEBAR_ICONS "${OWNCLOUD_SIDEBAR_ICONS}" OUTFILE_BASE "${APPLICATION_ICON_NAME}")
+ecm_add_app_icon(final_src ICONS "${OWNCLOUD_ICONS}" SIDEBAR_ICONS "${OWNCLOUD_SIDEBAR_ICONS}" OUTFILE_BASENAME "${APPLICATION_ICON_NAME}")
if(UNIX AND NOT APPLE)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIE")
@@ -278,9 +274,6 @@ target_include_directories(updater PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
set_target_properties( ${APPLICATION_EXECUTABLE} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${BIN_OUTPUT_DIRECTORY}
)
-# Only relevant for Linux? On OS X it by default properly checks in the bundle directory next to the exe
-set_target_properties( ${APPLICATION_EXECUTABLE} PROPERTIES
- INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}/${APPLICATION_EXECUTABLE};${CMAKE_INSTALL_RPATH}" )
target_link_libraries( ${APPLICATION_EXECUTABLE} Qt5::Widgets Qt5::Network Qt5::Xml)
target_link_libraries( ${APPLICATION_EXECUTABLE} ${synclib_NAME} )
@@ -349,5 +342,15 @@ if(NOT BUILD_OWNCLOUD_OSX_BUNDLE AND NOT WIN32)
configure_file(${CMAKE_SOURCE_DIR}/mirall.desktop.in
${CMAKE_CURRENT_BINARY_DIR}/${APPLICATION_EXECUTABLE}.desktop)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${APPLICATION_EXECUTABLE}.desktop DESTINATION ${DATADIR}/applications )
+
+ configure_file(owncloud.xml.in ${APPLICATION_EXECUTABLE}.xml)
+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${APPLICATION_EXECUTABLE}.xml DESTINATION ${DATADIR}/mime/packages )
+
+ find_package(ECM 1.2.0 CONFIG)
+ set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
+ find_package(SharedMimeInfo)
+ if(SharedMimeInfo_FOUND)
+ update_xdg_mimetypes( ${DATADIR}/mime/packages )
+ endif(SharedMimeInfo_FOUND)
endif()
diff --git a/src/gui/accountmanager.cpp b/src/gui/accountmanager.cpp
index 38a0ff185..1933d794c 100644
--- a/src/gui/accountmanager.cpp
+++ b/src/gui/accountmanager.cpp
@@ -33,6 +33,10 @@ static const char caCertsKeyC[] = "CaCertificates";
static const char accountsC[] = "Accounts";
static const char versionC[] = "version";
static const char serverVersionC[] = "serverVersion";
+
+// The maximum versions that this client can read
+static const int maxAccountsVersion = 2;
+static const int maxAccountVersion = 1;
}
@@ -48,6 +52,9 @@ AccountManager *AccountManager::instance()
bool AccountManager::restore()
{
+ QStringList skipSettingsKeys;
+ backwardMigrationSettingsKeys(&skipSettingsKeys, &skipSettingsKeys);
+
auto settings = ConfigFile::settingsWithGroup(QLatin1String(accountsC));
if (settings->status() != QSettings::NoError) {
qCWarning(lcAccountManager) << "Could not read settings from" << settings->fileName()
@@ -55,6 +62,12 @@ bool AccountManager::restore()
return false;
}
+ if (skipSettingsKeys.contains(settings->group())) {
+ // Should not happen: bad container keys should have been deleted
+ qCWarning(lcAccountManager) << "Accounts structure is too new, ignoring";
+ return true;
+ }
+
// If there are no accounts, check the old format.
if (settings->childGroups().isEmpty()
&& !settings->contains(QLatin1String(versionC))) {
@@ -64,11 +77,16 @@ bool AccountManager::restore()
foreach (const auto &accountId, settings->childGroups()) {
settings->beginGroup(accountId);
- if (auto acc = loadAccountHelper(*settings)) {
- acc->_id = accountId;
- if (auto accState = AccountState::loadFromSettings(acc, *settings)) {
- addAccountState(accState);
+ if (!skipSettingsKeys.contains(settings->group())) {
+ if (auto acc = loadAccountHelper(*settings)) {
+ acc->_id = accountId;
+ if (auto accState = AccountState::loadFromSettings(acc, *settings)) {
+ addAccountState(accState);
+ }
}
+ } else {
+ qCInfo(lcAccountManager) << "Account" << accountId << "is too new, ignoring";
+ _additionalBlockedAccountIds.insert(accountId);
}
settings->endGroup();
}
@@ -76,6 +94,24 @@ bool AccountManager::restore()
return true;
}
+void AccountManager::backwardMigrationSettingsKeys(QStringList *deleteKeys, QStringList *ignoreKeys)
+{
+ auto settings = ConfigFile::settingsWithGroup(QLatin1String(accountsC));
+ const int accountsVersion = settings->value(QLatin1String(versionC)).toInt();
+ if (accountsVersion <= maxAccountsVersion) {
+ foreach (const auto &accountId, settings->childGroups()) {
+ settings->beginGroup(accountId);
+ const int accountVersion = settings->value(QLatin1String(versionC), 1).toInt();
+ if (accountVersion > maxAccountVersion) {
+ ignoreKeys->append(settings->group());
+ }
+ settings->endGroup();
+ }
+ } else {
+ deleteKeys->append(settings->group());
+ }
+}
+
bool AccountManager::restoreFromLegacySettings()
{
qCInfo(lcAccountManager) << "Migrate: restoreFromLegacySettings, checking settings group"
@@ -136,7 +172,7 @@ bool AccountManager::restoreFromLegacySettings()
void AccountManager::save(bool saveCredentials)
{
auto settings = ConfigFile::settingsWithGroup(QLatin1String(accountsC));
- settings->setValue(QLatin1String(versionC), 2);
+ settings->setValue(QLatin1String(versionC), maxAccountsVersion);
foreach (const auto &acc, _accounts) {
settings->beginGroup(acc->account()->id());
saveAccountHelper(acc->account().data(), *settings, saveCredentials);
@@ -174,6 +210,7 @@ void AccountManager::saveAccountState(AccountState *a)
void AccountManager::saveAccountHelper(Account *acc, QSettings &settings, bool saveCredentials)
{
+ settings.setValue(QLatin1String(versionC), maxAccountVersion);
settings.setValue(QLatin1String(urlC), acc->_url.toString());
settings.setValue(QLatin1String(serverVersionC), acc->_serverVersion);
if (acc->_credentials) {
@@ -324,7 +361,6 @@ AccountPtr AccountManager::createAccount()
return acc;
}
-
void AccountManager::shutdown()
{
auto accountsCopy = _accounts;
@@ -341,6 +377,8 @@ bool AccountManager::isAccountIdAvailable(const QString &id) const
return false;
}
}
+ if (_additionalBlockedAccountIds.contains(id))
+ return false;
return true;
}
diff --git a/src/gui/accountmanager.h b/src/gui/accountmanager.h
index a2c13bec2..2acce1c62 100644
--- a/src/gui/accountmanager.h
+++ b/src/gui/accountmanager.h
@@ -77,6 +77,12 @@ public:
*/
static AccountPtr createAccount();
+ /**
+ * Returns the list of settings keys that can't be read because
+ * they are from the future.
+ */
+ static void backwardMigrationSettingsKeys(QStringList *deleteKeys, QStringList *ignoreKeys);
+
private:
// saving and loading Account to settings
void saveAccountHelper(Account *account, QSettings &settings, bool saveCredentials = true);
@@ -105,5 +111,7 @@ Q_SIGNALS:
private:
AccountManager() {}
QList<AccountStatePtr> _accounts;
+ /// Account ids from settings that weren't read
+ QSet<QString> _additionalBlockedAccountIds;
};
}
diff --git a/src/gui/accountsettings.cpp b/src/gui/accountsettings.cpp
index 7f4b262f4..96475c467 100644
--- a/src/gui/accountsettings.cpp
+++ b/src/gui/accountsettings.cpp
@@ -96,7 +96,7 @@ protected:
auto pos = folderList->mapFromGlobal(QCursor::pos());
auto index = folderList->indexAt(pos);
if (model->classify(index) == FolderStatusModel::RootFolder
- && (FolderStatusDelegate::errorsListRect(folderList->visualRect(index)).contains(pos)
+ && (FolderStatusDelegate::errorsListRect(folderList->visualRect(index), index).contains(pos)
|| FolderStatusDelegate::optionsButtonRect(folderList->visualRect(index),folderList->layoutDirection()).contains(pos))) {
shape = Qt::PointingHandCursor;
}
@@ -162,7 +162,7 @@ AccountSettings::AccountSettings(AccountState *accountState, QWidget *parent)
QAction *syncNowWithRemoteDiscovery = new QAction(this);
syncNowWithRemoteDiscovery->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_F6));
- connect(syncNowWithRemoteDiscovery, &QAction::triggered, this, &AccountSettings::slotScheduleCurrentFolderForceRemoteDiscovery);
+ connect(syncNowWithRemoteDiscovery, &QAction::triggered, this, &AccountSettings::slotScheduleCurrentFolderForceFullDiscovery);
addAction(syncNowWithRemoteDiscovery);
@@ -287,6 +287,9 @@ void AccountSettings::slotCustomContextMenuRequested(const QPoint &pos)
bool folderPaused = _model->data(index, FolderStatusDelegate::FolderSyncPaused).toBool();
bool folderConnected = _model->data(index, FolderStatusDelegate::FolderAccountConnected).toBool();
auto folderMan = FolderMan::instance();
+ QPointer<Folder> folder = folderMan->folder(alias);
+ if (!folder)
+ return;
QMenu *menu = new QMenu(tv);
@@ -295,7 +298,7 @@ void AccountSettings::slotCustomContextMenuRequested(const QPoint &pos)
QAction *ac = menu->addAction(tr("Open folder"));
connect(ac, &QAction::triggered, this, &AccountSettings::slotOpenCurrentFolder);
- if (!ui->_folderList->isExpanded(index)) {
+ if (!ui->_folderList->isExpanded(index) && !folder->useVirtualFiles()) {
ac = menu->addAction(tr("Choose what to sync"));
ac->setEnabled(folderConnected);
connect(ac, &QAction::triggered, this, &AccountSettings::doExpand);
@@ -340,7 +343,7 @@ void AccountSettings::slotFolderListClicked(const QModelIndex &indx)
slotCustomContextMenuRequested(pos);
return;
}
- if (FolderStatusDelegate::errorsListRect(tv->visualRect(indx)).contains(pos)) {
+ if (FolderStatusDelegate::errorsListRect(tv->visualRect(indx), indx).contains(pos)) {
emit showIssuesList(_model->data(indx, FolderStatusDelegate::FolderAliasRole).toString());
return;
}
@@ -378,6 +381,7 @@ void AccountSettings::slotFolderWizardAccepted()
folderWizard->field(QLatin1String("sourceFolder")).toString());
definition.targetPath = FolderDefinition::prepareTargetPath(
folderWizard->property("targetPath").toString());
+ definition.useVirtualFiles = folderWizard->property("useVirtualFiles").toBool();
{
QDir dir(definition.localPath);
@@ -562,10 +566,11 @@ void AccountSettings::slotScheduleCurrentFolder()
}
}
-void AccountSettings::slotScheduleCurrentFolderForceRemoteDiscovery()
+void AccountSettings::slotScheduleCurrentFolderForceFullDiscovery()
{
FolderMan *folderMan = FolderMan::instance();
if (auto folder = folderMan->folder(selectedFolderAlias())) {
+ folder->slotNextSyncFullLocalDiscovery();
folder->journalDb()->forceRemoteDiscoveryNextSync();
folderMan->scheduleFolder(folder);
}
@@ -650,7 +655,7 @@ void AccountSettings::slotAccountStateChanged()
if (state == AccountState::Connected) {
QStringList errors;
if (account->serverVersionUnsupported()) {
- errors << tr("The server version %1 is old and unsupported! Proceed at your own risk.").arg(account->serverVersion());
+ errors << tr("The server version %1 is unsupported! Proceed at your own risk.").arg(account->serverVersion());
}
showConnectionLabel(tr("Connected to %1.").arg(serverWithUser), errors);
} else if (state == AccountState::ServiceUnavailable) {
@@ -694,9 +699,6 @@ void AccountSettings::slotAccountStateChanged()
if (ui->_folderList->isExpanded(_model->index(i)))
ui->_folderList->setExpanded(_model->index(i), false);
}
- } else if (_model->isDirty()) {
- // If we connect and have pending changes, show the list.
- doExpand();
}
// Disabling expansion of folders might require hiding the selective
@@ -755,8 +757,6 @@ AccountSettings::~AccountSettings()
void AccountSettings::refreshSelectiveSyncStatus()
{
- bool shouldBeVisible = _model->isDirty() && _accountState->isConnected();
-
QString msg;
int cnt = 0;
foreach (Folder *folder, FolderMan::instance()->map().values()) {
@@ -787,10 +787,20 @@ void AccountSettings::refreshSelectiveSyncStatus()
}
}
+ // Some selective sync ui (either normal editing or big folder) will show
+ // if this variable ends up true.
+ bool shouldBeVisible = false;
+
if (msg.isEmpty()) {
+ // Show the ui if the model is dirty only
+ shouldBeVisible = _model->isDirty() && _accountState->isConnected();
+
ui->selectiveSyncButtons->setVisible(true);
ui->bigFolderUi->setVisible(false);
} else {
+ // There's a reason the big folder ui should be shown
+ shouldBeVisible = _accountState->isConnected();
+
ConfigFile cfg;
QString info = !cfg.confirmExternalStorage()
? tr("There are folders that were not synchronized because they are too big: ")
@@ -801,7 +811,6 @@ void AccountSettings::refreshSelectiveSyncStatus()
ui->selectiveSyncNotification->setText(info + msg);
ui->selectiveSyncButtons->setVisible(false);
ui->bigFolderUi->setVisible(true);
- shouldBeVisible = true;
}
ui->selectiveSyncApply->setEnabled(_model->isDirty() || !msg.isEmpty());
@@ -811,6 +820,7 @@ void AccountSettings::refreshSelectiveSyncStatus()
if (shouldBeVisible) {
ui->selectiveSyncStatus->setMaximumHeight(0);
ui->selectiveSyncStatus->setVisible(true);
+ doExpand();
}
auto anim = new QPropertyAnimation(ui->selectiveSyncStatus, "maximumHeight", ui->selectiveSyncStatus);
anim->setEndValue(shouldBeVisible ? hint.height() : 0);
diff --git a/src/gui/accountsettings.h b/src/gui/accountsettings.h
index eaef07eb4..80096a5a0 100644
--- a/src/gui/accountsettings.h
+++ b/src/gui/accountsettings.h
@@ -73,7 +73,7 @@ protected slots:
void slotAddFolder();
void slotEnableCurrentFolder();
void slotScheduleCurrentFolder();
- void slotScheduleCurrentFolderForceRemoteDiscovery();
+ void slotScheduleCurrentFolderForceFullDiscovery();
void slotForceSyncCurrentFolder();
void slotRemoveCurrentFolder();
void slotOpenCurrentFolder(); // sync folder
diff --git a/src/gui/accountstate.cpp b/src/gui/accountstate.cpp
index cf72e4236..88b03307f 100644
--- a/src/gui/accountstate.cpp
+++ b/src/gui/accountstate.cpp
@@ -76,11 +76,6 @@ QStringList AccountState::connectionErrors() const
return _connectionErrors;
}
-QString AccountState::connectionStatusString(ConnectionStatus status)
-{
- return ConnectionValidator::statusString(status);
-}
-
AccountState::State AccountState::state() const
{
return _state;
@@ -237,7 +232,7 @@ void AccountState::checkConnectivity()
void AccountState::slotConnectionValidatorResult(ConnectionValidator::Status status, const QStringList &errors)
{
if (isSignedOut()) {
- qCWarning(lcAccountState) << "Signed out, ignoring" << connectionStatusString(status) << _account->url().toString();
+ qCWarning(lcAccountState) << "Signed out, ignoring" << status << _account->url().toString();
return;
}
@@ -260,8 +255,8 @@ void AccountState::slotConnectionValidatorResult(ConnectionValidator::Status sta
if (_connectionStatus != status) {
qCInfo(lcAccountState) << "AccountState connection status change: "
- << connectionStatusString(_connectionStatus) << "->"
- << connectionStatusString(status);
+ << _connectionStatus << "->"
+ << status;
_connectionStatus = status;
}
_connectionErrors = errors;
@@ -319,10 +314,10 @@ void AccountState::slotInvalidCredentials()
if (account()->credentials()->ready()) {
account()->credentials()->invalidateToken();
- if (auto creds = qobject_cast<HttpCredentials *>(account()->credentials())) {
- if (creds->refreshAccessToken())
- return;
- }
+ }
+ if (auto creds = qobject_cast<HttpCredentials *>(account()->credentials())) {
+ if (creds->refreshAccessToken())
+ return;
}
account()->credentials()->askFromUser();
}
diff --git a/src/gui/accountstate.h b/src/gui/accountstate.h
index 0ee6ec96a..c877e605d 100644
--- a/src/gui/accountstate.h
+++ b/src/gui/accountstate.h
@@ -94,7 +94,6 @@ public:
ConnectionStatus connectionStatus() const;
QStringList connectionErrors() const;
- static QString connectionStatusString(ConnectionStatus status);
State state() const;
static QString stateString(State state);
diff --git a/src/gui/activitydata.h b/src/gui/activitydata.h
index 40cd35e05..7d14600c1 100644
--- a/src/gui/activitydata.h
+++ b/src/gui/activitydata.h
@@ -58,9 +58,10 @@ public:
QString _file;
QUrl _link;
QDateTime _dateTime;
- QString _accName;
+ QString _accName; /* display name of the account involved */
- QVector<ActivityLink> _links;
+ QVector<ActivityLink> _links; /* These links are transformed into buttons that
+ * call links as reactions on the activity */
/**
* @brief Sort operator to sort the list youngest first.
* @param val
diff --git a/src/gui/activityitemdelegate.cpp b/src/gui/activityitemdelegate.cpp
index ee59e422d..7c02b97fd 100644
--- a/src/gui/activityitemdelegate.cpp
+++ b/src/gui/activityitemdelegate.cpp
@@ -135,7 +135,7 @@ void ActivityItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
const QString elidedAction = fm.elidedText(actionText, Qt::ElideRight, actionTextBox.width());
painter->drawText(actionTextBox, elidedAction);
- int atPos = accountRole.indexOf(QLatin1Char('@'));
+ int atPos = accountRole.lastIndexOf(QLatin1Char('@'));
if (atPos > -1) {
accountRole.remove(0, atPos + 1);
}
diff --git a/src/gui/activitywidget.cpp b/src/gui/activitywidget.cpp
index e47e0262b..993313e96 100644
--- a/src/gui/activitywidget.cpp
+++ b/src/gui/activitywidget.cpp
@@ -84,6 +84,11 @@ ActivityWidget::ActivityWidget(QWidget *parent)
connect(_model, &ActivityListModel::activityJobStatusCode,
this, &ActivityWidget::slotAccountActivityStatus);
+ connect(AccountManager::instance(), &AccountManager::accountRemoved, this, [this](AccountState *ast) {
+ if (_accountsWithoutActivities.remove(ast->account()->displayName()))
+ showLabels();
+ });
+
_copyBtn = _ui->_dialogButtonBox->addButton(tr("Copy"), QDialogButtonBox::ActionRole);
_copyBtn->setToolTip(tr("Copy the activity list to the clipboard."));
connect(_copyBtn, &QAbstractButton::clicked, this, &ActivityWidget::copyToClipboard);
@@ -291,7 +296,7 @@ void ActivityWidget::slotBuildNotificationDisplay(const ActivityList &list)
// store the name of the account that sends the notification to be
// able to add it to the tray notification
// remove the user name from the account as that is not accurate here.
- int indx = host.indexOf(QChar('@'));
+ int indx = host.lastIndexOf(QChar('@'));
if (indx > -1) {
host.remove(0, 1 + indx);
}
diff --git a/src/gui/activitywidget.h b/src/gui/activitywidget.h
index 89fd6c08c..1195e7ffb 100644
--- a/src/gui/activitywidget.h
+++ b/src/gui/activitywidget.h
@@ -92,7 +92,7 @@ private slots:
void slotNotifyNetworkError(QNetworkReply *);
void slotNotifyServerFinished(const QString &reply, int replyCode);
void endNotificationRequest(NotificationWidget *widget, int replyCode);
- void scheduleWidgetToRemove(NotificationWidget *widget, int milliseconds = 4500);
+ void scheduleWidgetToRemove(NotificationWidget *widget, int milliseconds = 100);
void slotCheckToCleanWidgets();
private:
diff --git a/src/gui/application.cpp b/src/gui/application.cpp
index 6280c04aa..359c676f6 100644
--- a/src/gui/application.cpp
+++ b/src/gui/application.cpp
@@ -37,6 +37,7 @@
#include "updater/ocupdater.h"
#include "owncloudsetupwizard.h"
#include "version.h"
+#include "csync_exclude.h"
#include "config.h"
@@ -71,7 +72,7 @@ namespace {
" --logexpire <hours> : removes logs older than <hours> hours.\n"
" (to be used with --logdir)\n"
" --logflush : flush the log file after every write.\n"
- " --logdebug : also output debug-level messages in the log (equivalent to setting the env var QT_LOGGING_RULES=\"qt.*=true;*.debug=true\").\n"
+ " --logdebug : also output debug-level messages in the log.\n"
" --confdir <dirname> : Use the given configuration folder.\n";
QString applicationTrPath()
@@ -94,6 +95,66 @@ namespace {
// ----------------------------------------------------------------------------------
+bool Application::configVersionMigration()
+{
+ QStringList deleteKeys, ignoreKeys;
+ AccountManager::backwardMigrationSettingsKeys(&deleteKeys, &ignoreKeys);
+ FolderMan::backwardMigrationSettingsKeys(&deleteKeys, &ignoreKeys);
+
+ ConfigFile configFile;
+
+ // Did the client version change?
+ // (The client version is adjusted further down)
+ bool versionChanged = configFile.clientVersionString() != MIRALL_VERSION_STRING;
+
+ // We want to message the user either for destructive changes,
+ // or if we're ignoring something and the client version changed.
+ bool warningMessage = !deleteKeys.isEmpty() || (!ignoreKeys.isEmpty() && versionChanged);
+
+ if (!versionChanged && !warningMessage)
+ return true;
+
+ const auto backupFile = configFile.backup();
+
+ if (warningMessage) {
+ QString boldMessage;
+ if (!deleteKeys.isEmpty()) {
+ boldMessage = tr("Continuing will mean <b>deleting these settings</b>.");
+ } else {
+ boldMessage = tr("Continuing will mean <b>ignoring these settings</b>.");
+ }
+
+ QMessageBox box(
+ QMessageBox::Warning,
+ APPLICATION_SHORTNAME,
+ tr("Some settings were configured in newer versions of this client and "
+ "use features that are not available in this version.<br>"
+ "<br>"
+ "%1<br>"
+ "<br>"
+ "The current configuration file was already backed up to <i>%2</i>.")
+ .arg(boldMessage, backupFile));
+ box.addButton(tr("Quit"), QMessageBox::AcceptRole);
+ auto continueBtn = box.addButton(tr("Continue"), QMessageBox::DestructiveRole);
+
+ box.exec();
+ if (box.clickedButton() != continueBtn) {
+ QTimer::singleShot(0, qApp, SLOT(quit()));
+ return false;
+ }
+
+ auto settings = ConfigFile::settingsWithGroup("foo");
+ settings->endGroup();
+
+ // Wipe confusing keys from the future, ignore the others
+ for (const auto &badKey : deleteKeys)
+ settings->remove(badKey);
+ }
+
+ configFile.setClientVersionString(MIRALL_VERSION_STRING);
+ return true;
+}
+
Application::Application(int &argc, char **argv)
: SharedTools::QtSingleApplication(Theme::instance()->appName(), argc, argv)
, _gui(0)
@@ -125,7 +186,8 @@ Application::Application(int &argc, char **argv)
setAttribute(Qt::AA_UseHighDpiPixmaps, true);
auto confDir = ConfigFile().configPath();
- if (!QFileInfo(confDir).exists()) {
+ if (confDir.endsWith('/')) confDir.chop(1); // macOS 10.11.x does not like trailing slash for rename/move.
+ if (!QFileInfo(confDir).isDir()) {
// Migrate from version <= 2.4
setApplicationName(_theme->appNameGUI());
#ifndef QT_WARNING_DISABLE_DEPRECATED // Was added in Qt 5.9
@@ -136,6 +198,7 @@ Application::Application(int &argc, char **argv)
// We need to use the deprecated QDesktopServices::storageLocation because of its Qt4
// behavior of adding "data" to the path
QString oldDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation);
+ if (oldDir.endsWith('/')) oldDir.chop(1); // macOS 10.11.x does not like trailing slash for rename/move.
QT_WARNING_POP
setApplicationName(_theme->appName());
if (QFileInfo(oldDir).isDir()) {
@@ -167,8 +230,12 @@ Application::Application(int &argc, char **argv)
setupLogging();
setupTranslations();
- // The timeout is initialized with an environment variable, if not, override with the value from the config
+ if (!configVersionMigration()) {
+ return;
+ }
+
ConfigFile cfg;
+ // The timeout is initialized with an environment variable, if not, override with the value from the config
if (!AbstractNetworkJob::httpTimeout)
AbstractNetworkJob::httpTimeout = cfg.timeout();
@@ -202,14 +269,16 @@ Application::Application(int &argc, char **argv)
_theme->setSystrayUseMonoIcons(cfg.monoIcons());
connect(_theme, &Theme::systrayUseMonoIconsChanged, this, &Application::slotUseMonoIconsChanged);
- FolderMan::instance()->setupFolders();
- _proxy.setupQtProxyFromConfig(); // folders have to be defined first, than we set up the Qt proxy.
-
+ // Setting up the gui class will allow tray notifications for the
+ // setup that follows, like folder setup
_gui = new ownCloudGui(this);
if (_showLogWindow) {
_gui->slotToggleLogBrowser(); // _showLogWindow is set in parseOptions.
}
+ FolderMan::instance()->setupFolders();
+ _proxy.setupQtProxyFromConfig(); // folders have to be defined first, than we set up the Qt proxy.
+
// Enable word wrapping of QInputDialog (#4197)
setStyleSheet("QInputDialog QLabel { qproperty-wordWrap:1; }");
@@ -362,7 +431,9 @@ void Application::slotownCloudWizardDone(int res)
shouldSetAutoStart = shouldSetAutoStart
&& QCoreApplication::applicationDirPath().startsWith("/Applications/");
#endif
- Utility::setLaunchOnStartup(_theme->appName(), _theme->appNameGUI(), shouldSetAutoStart);
+ if (shouldSetAutoStart) {
+ Utility::setLaunchOnStartup(_theme->appName(), _theme->appNameGUI(), true);
+ }
_gui->slotShowSettings();
}
@@ -371,13 +442,17 @@ void Application::slotownCloudWizardDone(int res)
void Application::setupLogging()
{
// might be called from second instance
- Logger::instance()->setLogFile(_logFile);
- Logger::instance()->setLogDir(_logDir);
- Logger::instance()->setLogExpire(_logExpire);
- Logger::instance()->setLogFlush(_logFlush);
- Logger::instance()->setLogDebug(_logDebug);
+ auto logger = Logger::instance();
+ logger->setLogFile(_logFile);
+ logger->setLogDir(_logDir);
+ logger->setLogExpire(_logExpire);
+ logger->setLogFlush(_logFlush);
+ logger->setLogDebug(_logDebug);
+ if (!logger->isLoggingToFile() && ConfigFile().automaticLogDir()) {
+ logger->setupTemporaryFolderLogDir();
+ }
- Logger::instance()->enterNextLogFile();
+ logger->enterNextLogFile();
qCInfo(lcApplication) << QString::fromLatin1("################## %1 locale:[%2] ui_lang:[%3] version:[%4] os:[%5]").arg(_theme->appName()).arg(QLocale::system().name()).arg(property("ui_lang").toString()).arg(_theme->version()).arg(Utility::platformName());
}
@@ -456,6 +531,9 @@ void Application::parseOptions(const QStringList &options)
_debugMode = true;
} else if (option == QLatin1String("--version")) {
_versionOnly = true;
+ } else if (option.endsWith(QStringLiteral(APPLICATION_DOTVIRTUALFILE_SUFFIX))) {
+ // virtual file, open it after the Folder were created (if the app is not terminated)
+ QTimer::singleShot(0, this, [this, option] { openVirtualFile(option); });
} else {
showHint("Unrecognized option '" + option.toStdString() + "'");
}
@@ -464,20 +542,12 @@ void Application::parseOptions(const QStringList &options)
// Helpers for displaying messages. Note that there is no console on Windows.
#ifdef Q_OS_WIN
-// Format as <pre> HTML
-static inline void toHtml(QString &t)
-{
- t.replace(QLatin1Char('&'), QLatin1String("&amp;"));
- t.replace(QLatin1Char('<'), QLatin1String("&lt;"));
- t.replace(QLatin1Char('>'), QLatin1String("&gt;"));
- t.insert(0, QLatin1String("<html><pre>"));
- t.append(QLatin1String("</pre></html>"));
-}
-
-static void displayHelpText(QString t) // No console on Windows.
+static void displayHelpText(const QString &t) // No console on Windows.
{
- toHtml(t);
- QMessageBox::information(0, Theme::instance()->appNameGUI(), t);
+ QString spaces(80, ' '); // Add a line of non-wrapped space to make the messagebox wide enough.
+ QString text = QLatin1String("<qt><pre style='white-space:pre-wrap'>")
+ + t.toHtmlEscaped() + QLatin1String("</pre><pre>") + spaces + QLatin1String("</pre></qt>");
+ QMessageBox::information(0, Theme::instance()->appNameGUI(), text);
}
#else
@@ -621,5 +691,43 @@ void Application::showSettingsDialog()
_gui->slotShowSettings();
}
+void Application::openVirtualFile(const QString &filename)
+{
+ QString virtualFileExt = QStringLiteral(APPLICATION_DOTVIRTUALFILE_SUFFIX);
+ if (!filename.endsWith(virtualFileExt)) {
+ qWarning(lcApplication) << "Can only handle file ending in .owncloud. Unable to open" << filename;
+ return;
+ }
+ QString relativePath;
+ auto folder = FolderMan::instance()->folderForPath(filename, &relativePath);
+ if (!folder) {
+ qWarning(lcApplication) << "Can't find sync folder for" << filename;
+ // TODO: show a QMessageBox for errors
+ return;
+ }
+ folder->downloadVirtualFile(relativePath);
+ QString normalName = filename.left(filename.size() - virtualFileExt.size());
+ auto con = QSharedPointer<QMetaObject::Connection>::create();
+ *con = QObject::connect(folder, &Folder::syncFinished, [con, normalName] {
+ QObject::disconnect(*con);
+ if (QFile::exists(normalName)) {
+ QDesktopServices::openUrl(QUrl::fromLocalFile(normalName));
+ }
+ });
+}
+
+bool Application::event(QEvent *event)
+{
+#ifdef Q_OS_MAC
+ if (event->type() == QEvent::FileOpen) {
+ QFileOpenEvent *openEvent = static_cast<QFileOpenEvent *>(event);
+ qCDebug(lcApplication) << "QFileOpenEvent" << openEvent->file();
+ // virtual file, open it after the Folder were created (if the app is not terminated)
+ QString fn = openEvent->file();
+ QTimer::singleShot(0, this, [this, fn] { openVirtualFile(fn); });
+ }
+#endif
+ return SharedTools::QtSingleApplication::event(event);
+}
} // namespace OCC
diff --git a/src/gui/application.h b/src/gui/application.h
index c61f7645e..2aa69e577 100644
--- a/src/gui/application.h
+++ b/src/gui/application.h
@@ -72,11 +72,17 @@ public slots:
// TODO: this should not be public
void slotownCloudWizardDone(int);
void slotCrash();
+ /**
+ * Will download a virtual file, and open the result.
+ * The argument is the filename of the virtual file (including the extension)
+ */
+ void openVirtualFile(const QString &filename);
protected:
void parseOptions(const QStringList &);
void setupTranslations();
void setupLogging();
+ bool event(QEvent *event);
signals:
void folderRemoved();
@@ -94,6 +100,12 @@ protected slots:
private:
void setHelp();
+ /**
+ * Maybe a newer version of the client was used with this config file:
+ * if so, backup, confirm with user and remove the config that can't be read.
+ */
+ bool configVersionMigration();
+
QPointer<ownCloudGui> _gui;
Theme *_theme;
diff --git a/src/libsync/clientproxy.cpp b/src/gui/clientproxy.cpp
index e87f04b7c..e87f04b7c 100644
--- a/src/libsync/clientproxy.cpp
+++ b/src/gui/clientproxy.cpp
diff --git a/src/libsync/clientproxy.h b/src/gui/clientproxy.h
index 169e1fb6e..6552d5e0f 100644
--- a/src/libsync/clientproxy.h
+++ b/src/gui/clientproxy.h
@@ -32,7 +32,7 @@ class ConfigFile;
* @brief The ClientProxy class
* @ingroup libsync
*/
-class OWNCLOUDSYNC_EXPORT ClientProxy : public QObject
+class ClientProxy : public QObject
{
Q_OBJECT
public:
@@ -61,7 +61,7 @@ private:
QUrl _url;
};
-OWNCLOUDSYNC_EXPORT QString printQNetworkProxy(const QNetworkProxy &proxy);
+QString printQNetworkProxy(const QNetworkProxy &proxy);
}
#endif // CLIENTPROXY_H
diff --git a/src/libsync/connectionvalidator.cpp b/src/gui/connectionvalidator.cpp
index cf5dd865d..3f702903d 100644
--- a/src/libsync/connectionvalidator.cpp
+++ b/src/gui/connectionvalidator.cpp
@@ -40,35 +40,6 @@ ConnectionValidator::ConnectionValidator(AccountPtr account, QObject *parent)
{
}
-QString ConnectionValidator::statusString(Status stat)
-{
- switch (stat) {
- case Undefined:
- return QLatin1String("Undefined");
- case Connected:
- return QLatin1String("Connected");
- case NotConfigured:
- return QLatin1String("Not configured");
- case ServerVersionMismatch:
- return QLatin1String("Server Version Mismatch");
- case CredentialsNotReady:
- return QLatin1String("Credentials not ready");
- case CredentialsWrong:
- return QLatin1String("Credentials Wrong");
- case SslError:
- return QLatin1String("SSL Error");
- case StatusNotFound:
- return QLatin1String("Status not found");
- case ServiceUnavailable:
- return QLatin1String("Service unavailable");
- case MaintenanceMode:
- return QLatin1String("Maintenance mode");
- case Timeout:
- return QLatin1String("Timeout");
- }
- return QLatin1String("status undeclared.");
-}
-
void ConnectionValidator::checkServerAndAuth()
{
if (!_account) {
@@ -304,19 +275,20 @@ bool ConnectionValidator::setAndCheckServerVersion(const QString &version)
qCInfo(lcConnectionValidator) << _account->url() << "has server version" << version;
_account->setServerVersion(version);
- // We cannot deal with servers < 5.0.0
+ // We cannot deal with servers < 7.0.0
if (_account->serverVersionInt()
- && _account->serverVersionInt() < Account::makeServerVersion(5, 0, 0)) {
+ && _account->serverVersionInt() < Account::makeServerVersion(7, 0, 0)) {
_errors.append(tr("The configured server for this client is too old"));
_errors.append(tr("Please update to the latest server and restart the client."));
reportResult(ServerVersionMismatch);
return false;
}
- // We attempt to work with servers >= 5.0.0 but warn users.
+ // We attempt to work with servers >= 7.0.0 but warn users.
// Check usages of Account::serverVersionUnsupported() for details.
#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)
// Record that the server supports HTTP/2
+ // Actual decision if we should use HTTP/2 is done in AccessManager::createRequest
if (auto job = qobject_cast<AbstractNetworkJob *>(sender())) {
if (auto reply = job->reply()) {
_account->setHttp2Supported(
diff --git a/src/libsync/connectionvalidator.h b/src/gui/connectionvalidator.h
index 017cd8c63..e85bb398d 100644
--- a/src/libsync/connectionvalidator.h
+++ b/src/gui/connectionvalidator.h
@@ -75,7 +75,7 @@ namespace OCC {
\endcode
*/
-class OWNCLOUDSYNC_EXPORT ConnectionValidator : public QObject
+class ConnectionValidator : public QObject
{
Q_OBJECT
public:
@@ -94,8 +94,7 @@ public:
MaintenanceMode, // maintenance enabled in status.php
Timeout // actually also used for other errors on the authed request
};
-
- static QString statusString(Status);
+ Q_ENUM(Status);
// How often should the Application ask this object to check for the connection?
enum { DefaultCallingIntervalMsec = 32 * 1000 };
@@ -109,7 +108,7 @@ public slots:
void checkAuthentication();
signals:
- void connectionResult(ConnectionValidator::Status status, QStringList errors);
+ void connectionResult(ConnectionValidator::Status status, const QStringList &errors);
protected slots:
void slotCheckServerAndAuth();
diff --git a/src/gui/creds/oauth.cpp b/src/gui/creds/oauth.cpp
index 4980b8db9..6d2a6023c 100644
--- a/src/gui/creds/oauth.cpp
+++ b/src/gui/creds/oauth.cpp
@@ -22,6 +22,7 @@
#include <QJsonDocument>
#include "theme.h"
#include "networkjobs.h"
+#include "creds/httpcredentials.h"
namespace OCC {
@@ -85,6 +86,8 @@ void OAuth::start()
QString basicAuth = QString("%1:%2").arg(
Theme::instance()->oauthClientId(), Theme::instance()->oauthClientSecret());
req.setRawHeader("Authorization", "Basic " + basicAuth.toUtf8().toBase64());
+ // We just added the Authorization header, don't let HttpCredentialsAccessManager tamper with it
+ req.setAttribute(HttpCredentials::DontAddCredentialsAttribute, true);
auto requestBody = new QBuffer;
QUrlQuery arguments(QString(
@@ -150,7 +153,6 @@ void OAuth::start()
});
}
});
- QTimer::singleShot(5 * 60 * 1000, this, [this] { result(Error); });
}
QUrl OAuth::authorisationLink() const
diff --git a/src/gui/folder.cpp b/src/gui/folder.cpp
index 332d0a35c..178285957 100644
--- a/src/gui/folder.cpp
+++ b/src/gui/folder.cpp
@@ -30,6 +30,7 @@
#include "socketapi.h"
#include "theme.h"
#include "filesystem.h"
+#include "localdiscoverytracker.h"
#include "creds/abstractcredentials.h"
@@ -41,6 +42,8 @@
#include <QMessageBox>
#include <QPushButton>
+static const char versionC[] = "version";
+
namespace OCC {
Q_LOGGING_CATEGORY(lcFolder, "gui.folder", QtInfoMsg)
@@ -107,6 +110,15 @@ Folder::Folder(const FolderDefinition &definition,
_scheduleSelfTimer.setInterval(SyncEngine::minimumFileAgeForUpload);
connect(&_scheduleSelfTimer, &QTimer::timeout,
this, &Folder::slotScheduleThisFolder);
+
+ connect(ProgressDispatcher::instance(), &ProgressDispatcher::folderConflicts,
+ this, &Folder::slotFolderConflicts);
+
+ _localDiscoveryTracker.reset(new LocalDiscoveryTracker);
+ connect(_engine.data(), &SyncEngine::finished,
+ _localDiscoveryTracker.data(), &LocalDiscoveryTracker::slotSyncFinished);
+ connect(_engine.data(), &SyncEngine::itemCompleted,
+ _localDiscoveryTracker.data(), &LocalDiscoveryTracker::slotItemCompleted);
}
Folder::~Folder()
@@ -119,6 +131,10 @@ void Folder::checkLocalPath()
{
const QFileInfo fi(_definition.localPath);
_canonicalLocalPath = fi.canonicalFilePath();
+#ifdef Q_OS_MAC
+ // Workaround QTBUG-55896 (Should be fixed in Qt 5.8)
+ _canonicalLocalPath = _canonicalLocalPath.normalized(QString::NormalizationForm_C);
+#endif
if (_canonicalLocalPath.isEmpty()) {
qCWarning(lcFolder) << "Broken symlink:" << _definition.localPath;
_canonicalLocalPath = _definition.localPath;
@@ -458,8 +474,7 @@ void Folder::slotWatchedPathChanged(const QString &path)
// We do this before checking for our own sync-related changes to make
// extra sure to not miss relevant changes.
auto relativePathBytes = relativePath.toUtf8();
- _localDiscoveryPaths.insert(relativePathBytes);
- qCDebug(lcFolder) << "local discovery: inserted" << relativePath << "due to file watcher";
+ _localDiscoveryTracker->addTouchedPath(relativePathBytes);
// The folder watcher fires a lot of bogus notifications during
// a sync operation, both for actual user files and the database
@@ -485,6 +500,8 @@ void Folder::slotWatchedPathChanged(const QString &path)
return; // probably a spurious notification
}
+ warnOnNewExcludedItem(record, relativePath);
+
emit watchedFileChangedExternally(path);
// Also schedule this folder for a sync, but only after some delay:
@@ -492,20 +509,40 @@ void Folder::slotWatchedPathChanged(const QString &path)
scheduleThisFolderSoon();
}
+void Folder::downloadVirtualFile(const QString &_relativepath)
+{
+ qCInfo(lcFolder) << "Download virtual file: " << _relativepath;
+ auto relativepath = _relativepath.toUtf8();
+
+ // Set in the database that we should download the file
+ SyncJournalFileRecord record;
+ _journal.getFileRecord(relativepath, &record);
+ if (!record.isValid())
+ return;
+ if (record._type == ItemTypeVirtualFile) {
+ record._type = ItemTypeVirtualFileDownload;
+ _journal.setFileRecord(record);
+ // Make sure we go over that file during the discovery
+ _journal.avoidReadFromDbOnNextSync(relativepath);
+ } else if (record._type == ItemTypeDirectory) {
+ _journal.markVirtualFileForDownloadRecursively(relativepath);
+ } else {
+ qCWarning(lcFolder) << "Invalid existing record " << record._type << " for file " << _relativepath;
+ }
+
+ // Schedule a sync (Folder man will start the sync in a few ms)
+ slotScheduleThisFolder();
+}
+
void Folder::saveToSettings() const
{
// Remove first to make sure we don't get duplicates
removeFromSettings();
auto settings = _accountState->settings();
+ QString settingsGroup = QStringLiteral("Multifolders");
- // The folder is saved to backwards-compatible "Folders"
- // section only if it has the migrate flag set (i.e. was in
- // there before) or if the folder is the only one for the
- // given target path.
- // This ensures that older clients will not read a configuration
- // where two folders for different accounts point at the same
- // local folders.
+ // True if the folder path appears in only one account
bool oneAccountOnly = true;
foreach (Folder *other, FolderMan::instance()->map()) {
if (other != this && other->cleanPath() == this->cleanPath()) {
@@ -514,13 +551,25 @@ void Folder::saveToSettings() const
}
}
- bool compatible = _saveBackwardsCompatible || oneAccountOnly;
-
- if (compatible) {
- settings->beginGroup(QLatin1String("Folders"));
- } else {
- settings->beginGroup(QLatin1String("Multifolders"));
+ if (_definition.useVirtualFiles) {
+ // If virtual files are enabled, save the folder to a group
+ // that will not be read by older (<2.5.0) clients.
+ // The name is from when virtual files were called placeholders.
+ settingsGroup = QStringLiteral("FoldersWithPlaceholders");
+ } else if (_saveBackwardsCompatible || oneAccountOnly) {
+ // The folder is saved to backwards-compatible "Folders"
+ // section only if it has the migrate flag set (i.e. was in
+ // there before) or if the folder is the only one for the
+ // given target path.
+ // This ensures that older clients will not read a configuration
+ // where two folders for different accounts point at the same
+ // local folders.
+ settingsGroup = QStringLiteral("Folders");
}
+
+ settings->beginGroup(settingsGroup);
+ // Note: Each of these groups might have a "version" tag, but that's
+ // currently unused.
FolderDefinition::save(*settings, _definition);
settings->sync();
@@ -535,6 +584,9 @@ void Folder::removeFromSettings() const
settings->endGroup();
settings->beginGroup(QLatin1String("Multifolders"));
settings->remove(FolderMan::escapeAlias(_definition.alias));
+ settings->endGroup();
+ settings->beginGroup(QLatin1String("FoldersWithPlaceholders"));
+ settings->remove(FolderMan::escapeAlias(_definition.alias));
}
bool Folder::isFileExcludedAbsolute(const QString &fullPath) const
@@ -634,26 +686,23 @@ void Folder::startSync(const QStringList &pathList)
}
return interval;
}();
- if (_folderWatcher && _folderWatcher->isReliable() && _timeSinceLastFullLocalDiscovery.isValid()
- && (fullLocalDiscoveryInterval.count() < 0
- || _timeSinceLastFullLocalDiscovery.hasExpired(fullLocalDiscoveryInterval.count()))) {
+ bool hasDoneFullLocalDiscovery = _timeSinceLastFullLocalDiscovery.isValid();
+ bool periodicFullLocalDiscoveryNow =
+ fullLocalDiscoveryInterval.count() >= 0 // negative means we don't require periodic full runs
+ && _timeSinceLastFullLocalDiscovery.hasExpired(fullLocalDiscoveryInterval.count());
+ if (_folderWatcher && _folderWatcher->isReliable()
+ && hasDoneFullLocalDiscovery
+ && !periodicFullLocalDiscoveryNow) {
qCInfo(lcFolder) << "Allowing local discovery to read from the database";
- _engine->setLocalDiscoveryOptions(LocalDiscoveryStyle::DatabaseAndFilesystem, _localDiscoveryPaths);
-
- if (lcFolder().isDebugEnabled()) {
- QByteArrayList paths;
- for (auto &path : _localDiscoveryPaths)
- paths.append(path);
- qCDebug(lcFolder) << "local discovery paths: " << paths;
- }
-
- _previousLocalDiscoveryPaths = std::move(_localDiscoveryPaths);
+ _engine->setLocalDiscoveryOptions(
+ LocalDiscoveryStyle::DatabaseAndFilesystem,
+ _localDiscoveryTracker->localDiscoveryPaths());
+ _localDiscoveryTracker->startSyncPartialDiscovery();
} else {
qCInfo(lcFolder) << "Forbidding local discovery to read from the database";
_engine->setLocalDiscoveryOptions(LocalDiscoveryStyle::FilesystemOnly);
- _previousLocalDiscoveryPaths.clear();
+ _localDiscoveryTracker->startSyncFullDiscovery();
}
- _localDiscoveryPaths.clear();
_engine->setIgnoreHiddenFiles(_definition.ignoreHiddenFiles);
@@ -671,6 +720,8 @@ void Folder::setSyncOptions()
opt._newBigFolderSizeLimit = newFolderLimit.first ? newFolderLimit.second * 1000LL * 1000LL : -1; // convert from MB to B
opt._confirmExternalStorage = cfgFile.confirmExternalStorage();
opt._moveFilesToTrash = cfgFile.moveToTrash();
+ opt._newFilesAreVirtual = _definition.useVirtualFiles;
+ opt._virtualFileSuffix = QStringLiteral(APPLICATION_DOTVIRTUALFILE_SUFFIX);
QByteArray chunkSizeEnv = qgetenv("OWNCLOUD_CHUNK_SIZE");
if (!chunkSizeEnv.isEmpty()) {
@@ -797,23 +848,14 @@ void Folder::slotSyncFinished(bool success)
journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList, QStringList());
}
- // bug: This function uses many different criteria for "sync was successful" - investigate!
if ((_syncResult.status() == SyncResult::Success
|| _syncResult.status() == SyncResult::Problem)
&& success) {
if (_engine->lastLocalDiscoveryStyle() == LocalDiscoveryStyle::FilesystemOnly) {
_timeSinceLastFullLocalDiscovery.start();
}
- qCDebug(lcFolder) << "Sync success, forgetting last sync's local discovery path list";
- } else {
- // On overall-failure we can't forget about last sync's local discovery
- // paths yet, reuse them for the next sync again.
- // C++17: Could use std::set::merge().
- _localDiscoveryPaths.insert(
- _previousLocalDiscoveryPaths.begin(), _previousLocalDiscoveryPaths.end());
- qCDebug(lcFolder) << "Sync failed, keeping last sync's local discovery path list";
}
- _previousLocalDiscoveryPaths.clear();
+
emit syncStateChange();
@@ -888,25 +930,6 @@ void Folder::slotItemCompleted(const SyncFileItemPtr &item)
_folderWatcher->removePath(path() + item->_file);
}
- // Success and failure of sync items adjust what the next sync is
- // supposed to do.
- //
- // For successes, we want to wipe the file from the list to ensure we don't
- // rediscover it even if this overall sync fails.
- //
- // For failures, we want to add the file to the list so the next sync
- // will be able to retry it.
- if (item->_status == SyncFileItem::Success
- || item->_status == SyncFileItem::FileIgnored
- || item->_status == SyncFileItem::Restoration
- || item->_status == SyncFileItem::Conflict) {
- if (_previousLocalDiscoveryPaths.erase(item->_file.toUtf8()))
- qCDebug(lcFolder) << "local discovery: wiped" << item->_file;
- } else {
- _localDiscoveryPaths.insert(item->_file.toUtf8());
- qCDebug(lcFolder) << "local discovery: inserted" << item->_file << "due to sync failure";
- }
-
_syncResult.processCompletedItem(item);
_fileLog->logItem(*item);
@@ -964,6 +987,63 @@ void Folder::slotNextSyncFullLocalDiscovery()
_timeSinceLastFullLocalDiscovery.invalidate();
}
+void Folder::slotFolderConflicts(const QString &folder, const QStringList &conflictPaths)
+{
+ if (folder != _definition.alias)
+ return;
+ auto &r = _syncResult;
+
+ // If the number of conflicts is too low, adjust it upwards
+ if (conflictPaths.size() > r.numNewConflictItems() + r.numOldConflictItems())
+ r.setNumOldConflictItems(conflictPaths.size() - r.numNewConflictItems());
+}
+
+void Folder::warnOnNewExcludedItem(const SyncJournalFileRecord &record, const QStringRef &path)
+{
+ // Never warn for items in the database
+ if (record.isValid())
+ return;
+
+ // Don't warn for items that no longer exist.
+ // Note: This assumes we're getting file watcher notifications
+ // for folders only on creation and deletion - if we got a notification
+ // on content change that would create spurious warnings.
+ QFileInfo fi(_canonicalLocalPath + path);
+ if (!fi.exists())
+ return;
+
+ bool ok = false;
+ auto blacklist = _journal.getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok);
+ if (!ok)
+ return;
+ if (!blacklist.contains(path + "/"))
+ return;
+
+ const auto message = fi.isDir()
+ ? tr("The folder %1 was created but was excluded from synchronization previously. "
+ "Data inside it will not be synchronized.")
+ .arg(fi.filePath())
+ : tr("The file %1 was created but was excluded from synchronization previously. "
+ "It will not be synchronized.")
+ .arg(fi.filePath());
+
+ Logger::instance()->postOptionalGuiLog(Theme::instance()->appNameGUI(), message);
+}
+
+void Folder::slotWatcherUnreliable(const QString &message)
+{
+ qCWarning(lcFolder) << "Folder watcher for" << path() << "became unreliable:" << message;
+ auto fullMessage =
+ tr("Changes in synchronized folders could not be tracked reliably.\n"
+ "\n"
+ "This means that the synchronization client might not upload local changes "
+ "immediately and will instead only scan for local changes and upload them "
+ "occasionally (every two hours by default).\n"
+ "\n"
+ "%1").arg(message);
+ Logger::instance()->postGuiLog(Theme::instance()->appNameGUI(), fullMessage);
+}
+
void Folder::scheduleThisFolderSoon()
{
if (!_scheduleSelfTimer.isActive()) {
@@ -983,11 +1063,14 @@ void Folder::registerFolderWatcher()
if (!QDir(path()).exists())
return;
- _folderWatcher.reset(new FolderWatcher(path(), this));
+ _folderWatcher.reset(new FolderWatcher(this));
connect(_folderWatcher.data(), &FolderWatcher::pathChanged,
this, &Folder::slotWatchedPathChanged);
connect(_folderWatcher.data(), &FolderWatcher::lostChanges,
this, &Folder::slotNextSyncFullLocalDiscovery);
+ connect(_folderWatcher.data(), &FolderWatcher::becameUnreliable,
+ this, &Folder::slotWatcherUnreliable);
+ _folderWatcher->init(path());
}
void Folder::slotAboutToRemoveAllFiles(SyncFileItem::Direction dir, bool *cancel)
@@ -1053,6 +1136,8 @@ void FolderDefinition::save(QSettings &settings, const FolderDefinition &folder)
settings.setValue(QLatin1String("targetPath"), folder.targetPath);
settings.setValue(QLatin1String("paused"), folder.paused);
settings.setValue(QLatin1String("ignoreHiddenFiles"), folder.ignoreHiddenFiles);
+ settings.setValue(QLatin1String("usePlaceholders"), folder.useVirtualFiles);
+ settings.setValue(QLatin1String(versionC), maxSettingsVersion());
// Happens only on Windows when the explorer integration is enabled.
if (!folder.navigationPaneClsid.isNull())
@@ -1073,6 +1158,7 @@ bool FolderDefinition::load(QSettings &settings, const QString &alias,
folder->paused = settings.value(QLatin1String("paused")).toBool();
folder->ignoreHiddenFiles = settings.value(QLatin1String("ignoreHiddenFiles"), QVariant(true)).toBool();
folder->navigationPaneClsid = settings.value(QLatin1String("navigationPaneClsid")).toUuid();
+ folder->useVirtualFiles = settings.value(QLatin1String("usePlaceholders")).toBool();
settings.endGroup();
// Old settings can contain paths with native separators. In the rest of the
diff --git a/src/gui/folder.h b/src/gui/folder.h
index 2305231a3..892165e10 100644
--- a/src/gui/folder.h
+++ b/src/gui/folder.h
@@ -20,7 +20,6 @@
#include "syncresult.h"
#include "progressdispatcher.h"
#include "common/syncjournaldb.h"
-#include "clientproxy.h"
#include "networkjobs.h"
#include <csync.h>
@@ -40,6 +39,7 @@ class SyncEngine;
class AccountState;
class SyncRunFileLog;
class FolderWatcher;
+class LocalDiscoveryTracker;
/**
* @brief The FolderDefinition class
@@ -66,6 +66,8 @@ public:
bool paused;
/// whether the folder syncs hidden files
bool ignoreHiddenFiles;
+ /// New files are downloaded as virtual files
+ bool useVirtualFiles = false;
/// The CLSID where this folder appears in registry for the Explorer navigation pane entry.
QUuid navigationPaneClsid;
@@ -76,6 +78,9 @@ public:
static bool load(QSettings &settings, const QString &alias,
FolderDefinition *folder);
+ /// The highest version in the settings that load() can read
+ static int maxSettingsVersion() { return 1; }
+
/// Ensure / as separator and trailing /.
static QString prepareLocalPath(const QString &path);
@@ -237,6 +242,9 @@ public:
*/
void registerFolderWatcher();
+ /** new files are downloaded as virtual files */
+ bool useVirtualFiles() { return _definition.useVirtualFiles; }
+
signals:
void syncStateChange();
void syncStarted();
@@ -283,6 +291,15 @@ public slots:
*/
void slotWatchedPathChanged(const QString &path);
+ /**
+ * Mark a virtual file as being ready for download, and start a sync.
+ * relativePath is the patch to the file (including the extension)
+ */
+ void downloadVirtualFile(const QString &relativepath);
+
+ /** Ensures that the next sync performs a full local discovery. */
+ void slotNextSyncFullLocalDiscovery();
+
private slots:
void slotSyncStarted();
void slotSyncFinished(bool);
@@ -311,8 +328,18 @@ private slots:
*/
void slotScheduleThisFolder();
- /** Ensures that the next sync performs a full local discovery. */
- void slotNextSyncFullLocalDiscovery();
+ /** Adjust sync result based on conflict data from IssuesWidget.
+ *
+ * This is pretty awkward, but IssuesWidget just keeps better track
+ * of conflicts across partial local discovery.
+ */
+ void slotFolderConflicts(const QString &folder, const QStringList &conflictPaths);
+
+ /** Warn users if they create a file or folder that is selective-sync excluded */
+ void warnOnNewExcludedItem(const SyncJournalFileRecord &record, const QStringRef &path);
+
+ /** Warn users about an unreliable folder watcher */
+ void slotWatcherUnreliable(const QString &message);
private:
bool reloadExcludes();
@@ -360,8 +387,6 @@ private:
SyncJournalDb _journal;
- ClientProxy _clientProxy;
-
QScopedPointer<SyncRunFileLog> _fileLog;
QTimer _scheduleSelfTimer;
@@ -384,20 +409,9 @@ private:
QScopedPointer<FolderWatcher> _folderWatcher;
/**
- * The paths that should be checked by the next local discovery.
- *
- * Mostly a collection of files the filewatchers have reported as touched.
- * Also includes files that have had errors in the last sync run.
- */
- std::set<QByteArray> _localDiscoveryPaths;
-
- /**
- * The paths that the current sync run used for local discovery.
- *
- * For failing syncs, this list will be merged into _localDiscoveryPaths
- * again when the sync is done to make sure everything is retried.
+ * Keeps track of locally dirty files so we can skip local discovery sometimes.
*/
- std::set<QByteArray> _previousLocalDiscoveryPaths;
+ QScopedPointer<LocalDiscoveryTracker> _localDiscoveryTracker;
};
}
diff --git a/src/gui/folderman.cpp b/src/gui/folderman.cpp
index e34c91ff7..769bd9a17 100644
--- a/src/gui/folderman.cpp
+++ b/src/gui/folderman.cpp
@@ -37,6 +37,10 @@
#include <QtCore>
#include <QMutableSetIterator>
#include <QSet>
+#include <QNetworkProxy>
+
+static const char versionC[] = "version";
+static const int maxFoldersVersion = 1;
namespace OCC {
@@ -161,6 +165,9 @@ int FolderMan::setupFolders()
{
unloadAndDeleteAllFolders();
+ QStringList skipSettingsKeys;
+ backwardMigrationSettingsKeys(&skipSettingsKeys, &skipSettingsKeys);
+
auto settings = ConfigFile::settingsWithGroup(QLatin1String("Accounts"));
const auto accountsWithSettings = settings->childGroups();
if (accountsWithSettings.isEmpty()) {
@@ -180,14 +187,24 @@ int FolderMan::setupFolders()
}
settings->beginGroup(id);
- settings->beginGroup(QLatin1String("Folders"));
- setupFoldersHelper(*settings, account, true);
- settings->endGroup();
+ // The "backwardsCompatible" flag here is related to migrating old
+ // database locations
+ auto process = [&](const QString &groupName, bool backwardsCompatible = false) {
+ settings->beginGroup(groupName);
+ if (skipSettingsKeys.contains(settings->group())) {
+ // Should not happen: bad container keys should have been deleted
+ qCWarning(lcFolderMan) << "Folder structure" << groupName << "is too new, ignoring";
+ } else {
+ setupFoldersHelper(*settings, account, backwardsCompatible, skipSettingsKeys);
+ }
+ settings->endGroup();
+ };
- // See Folder::saveToSettings for details about why this exists.
- settings->beginGroup(QLatin1String("Multifolders"));
- setupFoldersHelper(*settings, account, false);
- settings->endGroup();
+ process(QStringLiteral("Folders"), true);
+
+ // See Folder::saveToSettings for details about why these exists.
+ process(QStringLiteral("Multifolders"));
+ process(QStringLiteral("FoldersWithPlaceholders"));
settings->endGroup(); // <account>
}
@@ -197,9 +214,19 @@ int FolderMan::setupFolders()
return _folderMap.size();
}
-void FolderMan::setupFoldersHelper(QSettings &settings, AccountStatePtr account, bool backwardsCompatible)
+void FolderMan::setupFoldersHelper(QSettings &settings, AccountStatePtr account, bool backwardsCompatible, const QStringList &ignoreKeys)
{
foreach (const auto &folderAlias, settings.childGroups()) {
+ // Skip folders with too-new version
+ settings.beginGroup(folderAlias);
+ if (ignoreKeys.contains(settings.group())) {
+ qCInfo(lcFolderMan) << "Folder" << folderAlias << "is too new, ignoring";
+ _additionalBlockedFolderAliases.insert(folderAlias);
+ settings.endGroup();
+ continue;
+ }
+ settings.endGroup();
+
FolderDefinition folderDefinition;
if (FolderDefinition::load(settings, folderAlias, &folderDefinition)) {
auto defaultJournalPath = folderDefinition.defaultJournalPath(account->account());
@@ -265,6 +292,37 @@ int FolderMan::setupFoldersMigration()
return _folderMap.size();
}
+void FolderMan::backwardMigrationSettingsKeys(QStringList *deleteKeys, QStringList *ignoreKeys)
+{
+ auto settings = ConfigFile::settingsWithGroup(QLatin1String("Accounts"));
+
+ auto processSubgroup = [&](const QString &name) {
+ settings->beginGroup(name);
+ const int foldersVersion = settings->value(QLatin1String(versionC), 1).toInt();
+ if (foldersVersion <= maxFoldersVersion) {
+ foreach (const auto &folderAlias, settings->childGroups()) {
+ settings->beginGroup(folderAlias);
+ const int folderVersion = settings->value(QLatin1String(versionC), 1).toInt();
+ if (folderVersion > FolderDefinition::maxSettingsVersion()) {
+ ignoreKeys->append(settings->group());
+ }
+ settings->endGroup();
+ }
+ } else {
+ deleteKeys->append(settings->group());
+ }
+ settings->endGroup();
+ };
+
+ for (const auto &accountId : settings->childGroups()) {
+ settings->beginGroup(accountId);
+ processSubgroup("Folders");
+ processSubgroup("Multifolders");
+ processSubgroup("FoldersWithPlaceholders");
+ settings->endGroup();
+ }
+}
+
bool FolderMan::ensureJournalGone(const QString &journalDbFile)
{
// remove the old journal file
@@ -904,7 +962,9 @@ Folder *FolderMan::addFolderInternal(FolderDefinition folderDefinition,
{
auto alias = folderDefinition.alias;
int count = 0;
- while (folderDefinition.alias.isEmpty() || _folderMap.contains(folderDefinition.alias)) {
+ while (folderDefinition.alias.isEmpty()
+ || _folderMap.contains(folderDefinition.alias)
+ || _additionalBlockedFolderAliases.contains(folderDefinition.alias)) {
// There is already a folder configured with this name and folder names need to be unique
folderDefinition.alias = alias + QString::number(++count);
}
@@ -933,7 +993,7 @@ Folder *FolderMan::addFolderInternal(FolderDefinition folderDefinition,
return folder;
}
-Folder *FolderMan::folderForPath(const QString &path)
+Folder *FolderMan::folderForPath(const QString &path, QString *relativePath)
{
QString absolutePath = QDir::cleanPath(path) + QLatin1Char('/');
@@ -941,10 +1001,16 @@ Folder *FolderMan::folderForPath(const QString &path)
const QString folderPath = folder->cleanPath() + QLatin1Char('/');
if (absolutePath.startsWith(folderPath, (Utility::isWindows() || Utility::isMac()) ? Qt::CaseInsensitive : Qt::CaseSensitive)) {
+ if (relativePath) {
+ *relativePath = absolutePath.mid(folderPath.length());
+ relativePath->chop(1); // we added a '/' above
+ }
return folder;
}
}
+ if (relativePath)
+ relativePath->clear();
return 0;
}
@@ -1240,25 +1306,45 @@ QString FolderMan::trayTooltipStatusString(
return folderMessage;
}
-QString FolderMan::checkPathValidityForNewFolder(const QString &path, const QUrl &serverUrl, bool forNewDirectory) const
+static QString checkPathValidityRecursive(const QString &path)
{
if (path.isEmpty()) {
- return tr("No valid folder selected!");
+ return FolderMan::tr("No valid folder selected!");
}
QFileInfo selFile(path);
if (!selFile.exists()) {
- return checkPathValidityForNewFolder(selFile.dir().path(), serverUrl, true);
+ return checkPathValidityRecursive(selFile.dir().path());
}
if (!selFile.isDir()) {
- return tr("The selected path is not a folder!");
+ return FolderMan::tr("The selected path is not a folder!");
}
if (!selFile.isWritable()) {
- return tr("You have no permission to write to the selected folder!");
+ return FolderMan::tr("You have no permission to write to the selected folder!");
}
+ return QString();
+}
+
+// QFileInfo::canonicalPath returns an empty string if the file does not exist.
+// This function also works with files that does not exist and resolve the symlinks in the
+// parent directories.
+static QString canonicalPath(const QString &path)
+{
+ QFileInfo selFile(path);
+ if (!selFile.exists()) {
+ return canonicalPath(selFile.dir().path()) + '/' + selFile.fileName();
+ }
+ return selFile.canonicalFilePath();
+}
+
+QString FolderMan::checkPathValidityForNewFolder(const QString &path, const QUrl &serverUrl) const
+{
+ QString recursiveValidity = checkPathValidityRecursive(path);
+ if (!recursiveValidity.isEmpty())
+ return recursiveValidity;
// check if the local directory isn't used yet in another ownCloud sync
Qt::CaseSensitivity cs = Qt::CaseSensitive;
@@ -1266,57 +1352,28 @@ QString FolderMan::checkPathValidityForNewFolder(const QString &path, const QUrl
cs = Qt::CaseInsensitive;
}
+ const QString userDir = QDir::cleanPath(canonicalPath(path)) + '/';
for (auto i = _folderMap.constBegin(); i != _folderMap.constEnd(); ++i) {
Folder *f = static_cast<Folder *>(i.value());
- QString folderDir = QDir(f->path()).canonicalPath();
- if (folderDir.isEmpty()) {
- continue;
- }
- if (!folderDir.endsWith(QLatin1Char('/'), cs))
- folderDir.append(QLatin1Char('/'));
+ QString folderDir = QDir::cleanPath(canonicalPath(f->path())) + '/';
- const QString folderDirClean = QDir::cleanPath(folderDir) + '/';
- const QString userDirClean = QDir::cleanPath(path) + '/';
-
- // folderDir follows sym links, path not.
- bool differentPathes = !Utility::fileNamesEqual(QDir::cleanPath(folderDir), QDir::cleanPath(path));
-
- if (!forNewDirectory && differentPathes && folderDirClean.startsWith(userDirClean, cs)) {
+ bool differentPaths = QString::compare(folderDir, userDir, cs) != 0;
+ if (differentPaths && folderDir.startsWith(userDir, cs)) {
return tr("The local folder %1 already contains a folder used in a folder sync connection. "
"Please pick another one!")
.arg(QDir::toNativeSeparators(path));
}
- // QDir::cleanPath keeps links
- // canonicalPath() remove symlinks and uses the symlink targets.
- QString absCleanUserFolder = QDir::cleanPath(QDir(path).canonicalPath()) + '/';
-
- if ((forNewDirectory || differentPathes) && userDirClean.startsWith(folderDirClean, cs)) {
+ if (differentPaths && userDir.startsWith(folderDir, cs)) {
return tr("The local folder %1 is already contained in a folder used in a folder sync connection. "
"Please pick another one!")
.arg(QDir::toNativeSeparators(path));
}
- // both follow symlinks.
- bool cleanUserEqualsCleanFolder = Utility::fileNamesEqual(absCleanUserFolder, folderDirClean);
- if (differentPathes && absCleanUserFolder.startsWith(folderDirClean, cs) && !cleanUserEqualsCleanFolder) {
- return tr("The local folder %1 is a symbolic link. "
- "The link target is already contained in a folder used in a folder sync connection. "
- "Please pick another one!")
- .arg(QDir::toNativeSeparators(path));
- }
-
- if (differentPathes && folderDirClean.startsWith(absCleanUserFolder, cs) && !cleanUserEqualsCleanFolder && !forNewDirectory) {
- return tr("The local folder %1 contains a symbolic link. "
- "The link target contains an already synced folder "
- "Please pick another one!")
- .arg(QDir::toNativeSeparators(path));
- }
-
// if both pathes are equal, the server url needs to be different
// otherwise it would mean that a new connection from the same local folder
// to the same account is added which is not wanted. The account must differ.
- if (serverUrl.isValid() && Utility::fileNamesEqual(absCleanUserFolder, folderDir)) {
+ if (serverUrl.isValid() && !differentPaths) {
QUrl folderUrl = f->accountState()->account()->url();
QString user = f->accountState()->account()->credentials()->user();
folderUrl.setUserName(user);
diff --git a/src/gui/folderman.h b/src/gui/folderman.h
index 3eb6024e2..71108f383 100644
--- a/src/gui/folderman.h
+++ b/src/gui/folderman.h
@@ -68,6 +68,12 @@ public:
int setupFolders();
int setupFoldersMigration();
+ /**
+ * Returns a list of keys that can't be read because they are from
+ * future versions.
+ */
+ static void backwardMigrationSettingsKeys(QStringList *deleteKeys, QStringList *ignoreKeys);
+
OCC::Folder::Map map();
/** Adds a folder for an account, ensures the journal is gone and saves it in the settings.
@@ -77,8 +83,13 @@ public:
/** Removes a folder */
void removeFolder(Folder *);
- /** Returns the folder which the file or directory stored in path is in */
- Folder *folderForPath(const QString &path);
+ /**
+ * Returns the folder which the file or directory stored in path is in
+ *
+ * Optionally, the path relative to the found folder is returned in
+ * relativePath.
+ */
+ Folder *folderForPath(const QString &path, QString *relativePath = nullptr);
/**
* returns a list of local files that exist on the local harddisk for an
@@ -127,11 +138,9 @@ public:
*
* Note that different accounts are allowed to sync to the same folder.
*
- * \a forNewDirectory is internal and is used for recursion.
- *
* @returns an empty string if it is allowed, or an error if it is not allowed
*/
- QString checkPathValidityForNewFolder(const QString &path, const QUrl &serverUrl = QUrl(), bool forNewDirectory = false) const;
+ QString checkPathValidityForNewFolder(const QString &path, const QUrl &serverUrl = QUrl()) const;
/**
* Attempts to find a non-existing, acceptable path for creating a new sync folder.
@@ -293,7 +302,7 @@ private:
// restarts the application (Linux only)
void restartApplication();
- void setupFoldersHelper(QSettings &settings, AccountStatePtr account, bool backwardsCompatible);
+ void setupFoldersHelper(QSettings &settings, AccountStatePtr account, bool backwardsCompatible, const QStringList &ignoreKeys);
QSet<Folder *> _disabledFolders;
Folder::Map _folderMap;
@@ -302,6 +311,9 @@ private:
QPointer<Folder> _lastSyncFolder;
bool _syncEnabled;
+ /// Folder aliases from the settings that weren't read
+ QSet<QString> _additionalBlockedFolderAliases;
+
/// Starts regular etag query jobs
QTimer _etagPollTimer;
/// The currently running etag query
diff --git a/src/gui/folderstatusdelegate.cpp b/src/gui/folderstatusdelegate.cpp
index 2379deb7d..68aac0cd4 100644
--- a/src/gui/folderstatusdelegate.cpp
+++ b/src/gui/folderstatusdelegate.cpp
@@ -38,7 +38,7 @@ namespace OCC {
FolderStatusDelegate::FolderStatusDelegate()
: QStyledItemDelegate()
{
- m_moreIcon = QIcon(QLatin1String(":/client/resources/more.png"));
+ m_moreIcon = QIcon(QLatin1String(":/client/resources/more.svg"));
}
QString FolderStatusDelegate::addFolderText()
@@ -77,16 +77,13 @@ QSize FolderStatusDelegate::sizeHint(const QStyleOptionViewItem &option,
int h = rootFolderHeightWithoutErrors(fm, aliasFm);
// this already includes the bottom margin
- // add some space to show an conflict indicator.
+ // add some space for the message boxes.
int margin = fm.height() / 4;
- if (!qvariant_cast<QStringList>(index.data(FolderConflictMsg)).isEmpty()) {
- QStringList msgs = qvariant_cast<QStringList>(index.data(FolderConflictMsg));
- h += margin + 2 * margin + msgs.count() * fm.height();
- }
- // add some space to show an error condition.
- if (!qvariant_cast<QStringList>(index.data(FolderErrorMsg)).isEmpty()) {
- QStringList errMsgs = qvariant_cast<QStringList>(index.data(FolderErrorMsg));
- h += margin + 2 * margin + errMsgs.count() * fm.height();
+ for (auto role : {FolderConflictMsg, FolderErrorMsg, FolderInfoMsg}) {
+ auto msgs = qvariant_cast<QStringList>(index.data(role));
+ if (!msgs.isEmpty()) {
+ h += margin + 2 * margin + msgs.count() * fm.height();
+ }
}
return QSize(0, h);
@@ -156,6 +153,7 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
QString remotePath = qvariant_cast<QString>(index.data(FolderSecondPathRole));
QStringList conflictTexts = qvariant_cast<QStringList>(index.data(FolderConflictMsg));
QStringList errorTexts = qvariant_cast<QStringList>(index.data(FolderErrorMsg));
+ QStringList infoTexts = qvariant_cast<QStringList>(index.data(FolderInfoMsg));
int overallPercent = qvariant_cast<int>(index.data(SyncProgressOverallPercent));
QString overallString = qvariant_cast<QString>(index.data(SyncProgressOverallString));
@@ -290,6 +288,8 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
drawTextBox(conflictTexts, QColor(0xba, 0xba, 0x4d));
if (!errorTexts.isEmpty())
drawTextBox(errorTexts, QColor(0xbb, 0x4d, 0x4d));
+ if (!infoTexts.isEmpty())
+ drawTextBox(infoTexts, QColor(0x4d, 0xba, 0x4d));
// Sync File Progress Bar: Show it if syncFile is not empty.
if (showProgess) {
@@ -336,7 +336,6 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
{
QStyleOptionToolButton btnOpt;
- //btnOpt.text = QLatin1String("...");
btnOpt.state = option.state;
btnOpt.state &= ~(QStyle::State_Selected | QStyle::State_HasFocus);
btnOpt.state |= QStyle::State_Raised;
@@ -344,7 +343,8 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
btnOpt.subControls = QStyle::SC_ToolButton;
btnOpt.rect = optionsButtonVisualRect;
btnOpt.icon = m_moreIcon;
- btnOpt.iconSize = btnOpt.rect.size();
+ int e = QApplication::style()->pixelMetric(QStyle::PM_ButtonIconSize);
+ btnOpt.iconSize = QSize(e,e);
QApplication::style()->drawComplexControl(QStyle::CC_ToolButton, &btnOpt, painter);
}
}
@@ -364,10 +364,9 @@ QRect FolderStatusDelegate::optionsButtonRect(QRect within, Qt::LayoutDirection
within.setHeight(FolderStatusDelegate::rootFolderHeightWithoutErrors(fm, aliasFm));
QStyleOptionToolButton opt;
- opt.text = QLatin1String("...");
- QSize textSize = fm.size(Qt::TextShowMnemonic, opt.text);
- opt.rect.setSize(textSize);
- QSize size = QApplication::style()->sizeFromContents(QStyle::CT_ToolButton, &opt, textSize).expandedTo(QApplication::globalStrut());
+ int e = QApplication::style()->pixelMetric(QStyle::PM_ButtonIconSize);
+ opt.rect.setSize(QSize(e,e));
+ QSize size = QApplication::style()->sizeFromContents(QStyle::CT_ToolButton, &opt, opt.rect.size()).expandedTo(QApplication::globalStrut());
int margin = QApplication::style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing);
QRect r(QPoint(within.right() - size.width() - margin,
@@ -376,13 +375,22 @@ QRect FolderStatusDelegate::optionsButtonRect(QRect within, Qt::LayoutDirection
return QStyle::visualRect(direction, within, r);
}
-QRect FolderStatusDelegate::errorsListRect(QRect within)
+QRect FolderStatusDelegate::errorsListRect(QRect within, const QModelIndex &index)
{
QFont font = QFont();
QFont aliasFont = makeAliasFont(font);
QFontMetrics fm(font);
QFontMetrics aliasFm(aliasFont);
within.setTop(within.top() + FolderStatusDelegate::rootFolderHeightWithoutErrors(fm, aliasFm));
+ int margin = fm.height() / 4;
+ int h = 0;
+ for (auto role : {FolderConflictMsg, FolderErrorMsg}) {
+ auto msgs = qvariant_cast<QStringList>(index.data(role));
+ if (!msgs.isEmpty()) {
+ h += margin + 2 * margin + msgs.count() * fm.height();
+ }
+ }
+ within.setHeight(h);
return within;
}
diff --git a/src/gui/folderstatusdelegate.h b/src/gui/folderstatusdelegate.h
index 213c822dd..dbb116b08 100644
--- a/src/gui/folderstatusdelegate.h
+++ b/src/gui/folderstatusdelegate.h
@@ -35,6 +35,7 @@ public:
FolderSecondPathRole,
FolderConflictMsg,
FolderErrorMsg,
+ FolderInfoMsg,
FolderSyncPaused,
FolderStatusIconRole,
FolderAccountConnected,
@@ -57,7 +58,7 @@ public:
* return the position of the option button within the item
*/
static QRect optionsButtonRect(QRect within, Qt::LayoutDirection direction);
- static QRect errorsListRect(QRect within);
+ static QRect errorsListRect(QRect within, const QModelIndex &);
static int rootFolderHeightWithoutErrors(const QFontMetrics &fm, const QFontMetrics &aliasFm);
private:
diff --git a/src/gui/folderstatusmodel.cpp b/src/gui/folderstatusmodel.cpp
index 61834cec1..69664efee 100644
--- a/src/gui/folderstatusmodel.cpp
+++ b/src/gui/folderstatusmodel.cpp
@@ -210,6 +210,10 @@ QVariant FolderStatusModel::data(const QModelIndex &index, int role) const
: QStringList();
case FolderStatusDelegate::FolderErrorMsg:
return f->syncResult().errorStrings();
+ case FolderStatusDelegate::FolderInfoMsg:
+ return f->useVirtualFiles()
+ ? QStringList(tr("New files are being created as virtual files."))
+ : QStringList();
case FolderStatusDelegate::SyncRunning:
return f->syncResult().status() == SyncResult::SyncRunning;
case FolderStatusDelegate::HeaderRole:
@@ -245,9 +249,15 @@ QVariant FolderStatusModel::data(const QModelIndex &index, int role) const
} else if (status == SyncResult::Undefined) {
return theme->syncStateIcon(SyncResult::SyncRunning);
} else {
- // keep the previous icon for the prepare phase.
- if (status == SyncResult::Problem) {
- return theme->syncStateIcon(SyncResult::Success);
+ // The "Problem" *result* just means some files weren't
+ // synced, so we show "Success" in these cases. But we
+ // do use the "Problem" *icon* for unresolved conflicts.
+ if (status == SyncResult::Success || status == SyncResult::Problem) {
+ if (f->syncResult().hasUnresolvedConflicts()) {
+ return theme->syncStateIcon(SyncResult::Problem);
+ } else {
+ return theme->syncStateIcon(SyncResult::Success);
+ }
} else {
return theme->syncStateIcon(status);
}
@@ -352,6 +362,8 @@ int FolderStatusModel::rowCount(const QModelIndex &parent) const
auto info = infoForIndex(parent);
if (!info)
return 0;
+ if (info->_folder && info->_folder->useVirtualFiles())
+ return 0;
if (info->hasLabel())
return 1;
return info->_subs.count();
@@ -507,6 +519,9 @@ bool FolderStatusModel::hasChildren(const QModelIndex &parent) const
if (!info)
return false;
+ if (info->_folder && info->_folder->useVirtualFiles())
+ return false;
+
if (!info->_fetched)
return true;
@@ -526,12 +541,16 @@ bool FolderStatusModel::canFetchMore(const QModelIndex &parent) const
return false;
}
auto info = infoForIndex(parent);
- if (!info || info->_fetched || info->_fetching)
+ if (!info || info->_fetched || info->_fetchingJob)
return false;
if (info->_hasError) {
// Keep showing the error to the user, it will be hidden when the account reconnects
return false;
}
+ if (info->_folder && info->_folder->useVirtualFiles()) {
+ // Selective sync is hidden in that case
+ return false;
+ }
return true;
}
@@ -540,10 +559,9 @@ void FolderStatusModel::fetchMore(const QModelIndex &parent)
{
auto info = infoForIndex(parent);
- if (!info || info->_fetched || info->_fetching)
+ if (!info || info->_fetched || info->_fetchingJob)
return;
info->resetSubs(this, parent);
- info->_fetching = true;
QString path = info->_folder->remotePath();
if (info->_path != QLatin1String("/")) {
if (!path.endsWith(QLatin1Char('/'))) {
@@ -552,6 +570,7 @@ void FolderStatusModel::fetchMore(const QModelIndex &parent)
path += info->_path;
}
LsColJob *job = new LsColJob(_accountState->account(), path, this);
+ info->_fetchingJob = job;
job->setProperties(QList<QByteArray>() << "resourcetype"
<< "http://owncloud.org/ns:size"
<< "http://owncloud.org/ns:permissions");
@@ -596,18 +615,18 @@ void FolderStatusModel::slotUpdateDirectories(const QStringList &list)
if (!parentInfo) {
return;
}
- ASSERT(parentInfo->_fetching); // we should only get a result if we were doing a fetch
+ ASSERT(parentInfo->_fetchingJob == job);
ASSERT(parentInfo->_subs.isEmpty());
if (parentInfo->hasLabel()) {
beginRemoveRows(idx, 0, 0);
- parentInfo->_lastErrorString.clear();
parentInfo->_hasError = false;
parentInfo->_fetchingLabel = false;
endRemoveRows();
}
- parentInfo->_fetching = false;
+ parentInfo->_lastErrorString.clear();
+ parentInfo->_fetchingJob = nullptr;
parentInfo->_fetched = true;
QUrl url = parentInfo->_folder->remoteUrl();
@@ -734,10 +753,11 @@ void FolderStatusModel::slotLscolFinishedWithError(QNetworkReply *r)
if (parentInfo) {
qCDebug(lcFolderStatus) << r->errorString();
parentInfo->_lastErrorString = r->errorString();
+ auto error = r->error();
parentInfo->resetSubs(this, idx);
- if (r->error() == QNetworkReply::ContentNotFoundError) {
+ if (error == QNetworkReply::ContentNotFoundError) {
parentInfo->_fetched = true;
} else {
ASSERT(!parentInfo->hasLabel());
@@ -803,7 +823,7 @@ void FolderStatusModel::slotApplySelectiveSync()
auto oldBlackList = folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok);
if (!ok) {
qCWarning(lcFolderStatus) << "Could not read selective sync list from db.";
- return;
+ continue;
}
QStringList blackList = createBlackList(&_folders[i], oldBlackList);
folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, blackList);
@@ -836,6 +856,8 @@ void FolderStatusModel::slotApplySelectiveSync()
foreach (const auto &it, changes) {
folder->journalDb()->avoidReadFromDbOnNextSync(it);
}
+ // Also make sure we see the local file that had been ignored before
+ folder->slotNextSyncFullLocalDiscovery();
FolderMan::instance()->scheduleFolder(folder);
}
}
@@ -873,11 +895,16 @@ void FolderStatusModel::slotSetProgress(const ProgressInfo &progress)
<< FolderStatusDelegate::WarningCount
<< Qt::ToolTipRole;
- if (progress.status() == ProgressInfo::Discovery
- && !progress._currentDiscoveredFolder.isEmpty()) {
- pi->_overallSyncString = tr("Checking for changes in '%1'").arg(progress._currentDiscoveredFolder);
- emit dataChanged(index(folderIndex), index(folderIndex), roles);
- return;
+ if (progress.status() == ProgressInfo::Discovery) {
+ if (!progress._currentDiscoveredRemoteFolder.isEmpty()) {
+ pi->_overallSyncString = tr("Checking for changes in remote '%1'").arg(progress._currentDiscoveredRemoteFolder);
+ emit dataChanged(index(folderIndex), index(folderIndex), roles);
+ return;
+ } else if (!progress._currentDiscoveredLocalFolder.isEmpty()) {
+ pi->_overallSyncString = tr("Checking for changes in local '%1'").arg(progress._currentDiscoveredLocalFolder);
+ emit dataChanged(index(folderIndex), index(folderIndex), roles);
+ return;
+ }
}
if (progress.status() == ProgressInfo::Reconcile) {
@@ -1144,6 +1171,8 @@ void FolderStatusModel::slotSyncAllPendingBigFolders()
foreach (const auto &it, undecidedList) {
folder->journalDb()->avoidReadFromDbOnNextSync(it);
}
+ // Also make sure we see the local file that had been ignored before
+ folder->slotNextSyncFullLocalDiscovery();
FolderMan::instance()->scheduleFolder(folder);
}
@@ -1192,7 +1221,7 @@ void FolderStatusModel::slotShowFetchProgress()
if (it.value().elapsed() > 800) {
auto idx = it.key();
auto *info = infoForIndex(idx);
- if (info && info->_fetching) {
+ if (info && info->_fetchingJob) {
bool add = !info->hasLabel();
if (add) {
beginInsertRows(idx, 0, 0);
@@ -1215,7 +1244,11 @@ bool FolderStatusModel::SubFolderInfo::hasLabel() const
void FolderStatusModel::SubFolderInfo::resetSubs(FolderStatusModel *model, QModelIndex index)
{
_fetched = false;
- _fetching = false;
+ if (_fetchingJob) {
+ disconnect(_fetchingJob, nullptr, model, nullptr);
+ _fetchingJob->deleteLater();
+ _fetchingJob.clear();
+ }
if (hasLabel()) {
model->beginRemoveRows(index, 0, 0);
_fetchingLabel = false;
diff --git a/src/gui/folderstatusmodel.h b/src/gui/folderstatusmodel.h
index 7cdf49c7f..dc451f1e5 100644
--- a/src/gui/folderstatusmodel.h
+++ b/src/gui/folderstatusmodel.h
@@ -20,6 +20,7 @@
#include <QLoggingCategory>
#include <QVector>
#include <QElapsedTimer>
+#include <QPointer>
class QNetworkReply;
namespace OCC {
@@ -28,6 +29,7 @@ Q_DECLARE_LOGGING_CATEGORY(lcFolderStatus)
class Folder;
class ProgressInfo;
+class LsColJob;
/**
* @brief The FolderStatusModel class
@@ -59,7 +61,6 @@ public:
, _size(0)
, _isExternal(false)
, _fetched(false)
- , _fetching(false)
, _hasError(false)
, _fetchingLabel(false)
, _isUndecided(false)
@@ -75,7 +76,7 @@ public:
bool _isExternal;
bool _fetched; // If we did the LSCOL for this folder already
- bool _fetching; // Whether a LSCOL job is currently running
+ QPointer<LsColJob> _fetchingJob; // Currently running LsColJob
bool _hasError; // If the last fetching job ended in an error
QString _lastErrorString;
bool _fetchingLabel; // Whether a 'fetching in progress' label is shown.
diff --git a/src/gui/folderwatcher.cpp b/src/gui/folderwatcher.cpp
index b39c15dcb..1a66fbf7b 100644
--- a/src/gui/folderwatcher.cpp
+++ b/src/gui/folderwatcher.cpp
@@ -38,19 +38,22 @@ namespace OCC {
Q_LOGGING_CATEGORY(lcFolderWatcher, "gui.folderwatcher", QtInfoMsg)
-FolderWatcher::FolderWatcher(const QString &root, Folder *folder)
+FolderWatcher::FolderWatcher(Folder *folder)
: QObject(folder)
, _folder(folder)
{
- _d.reset(new FolderWatcherPrivate(this, root));
-
- _timer.start();
}
FolderWatcher::~FolderWatcher()
{
}
+void FolderWatcher::init(const QString &root)
+{
+ _d.reset(new FolderWatcherPrivate(this, root));
+ _timer.start();
+}
+
bool FolderWatcher::pathIsIgnored(const QString &path)
{
if (path.isEmpty())
diff --git a/src/gui/folderwatcher.h b/src/gui/folderwatcher.h
index ac40a2ea3..fcae5c837 100644
--- a/src/gui/folderwatcher.h
+++ b/src/gui/folderwatcher.h
@@ -55,11 +55,14 @@ class FolderWatcher : public QObject
{
Q_OBJECT
public:
+ // Construct, connect signals, call init()
+ explicit FolderWatcher(Folder *folder = 0L);
+ virtual ~FolderWatcher();
+
/**
* @param root Path of the root of the folder
*/
- FolderWatcher(const QString &root, Folder *folder = 0L);
- virtual ~FolderWatcher();
+ void init(const QString &root);
/**
* Not all backends are recursive by default.
@@ -96,6 +99,12 @@ signals:
*/
void lostChanges();
+ /**
+ * Signals when the watcher became unreliable. The string is a translated
+ * message that can be shown to users.
+ */
+ void becameUnreliable(const QString &message);
+
protected slots:
// called from the implementations to indicate a change in path
void changeDetected(const QString &path);
diff --git a/src/gui/folderwatcher_linux.cpp b/src/gui/folderwatcher_linux.cpp
index 37d79211a..5f6d580b1 100644
--- a/src/gui/folderwatcher_linux.cpp
+++ b/src/gui/folderwatcher_linux.cpp
@@ -81,8 +81,11 @@ void FolderWatcherPrivate::inotifyRegisterPath(const QString &path)
} else {
// If we're running out of memory or inotify watches, become
// unreliable.
- if (errno == ENOMEM || errno == ENOSPC) {
+ if (_parent->_isReliable && (errno == ENOMEM || errno == ENOSPC)) {
_parent->_isReliable = false;
+ emit _parent->becameUnreliable(
+ tr("This problem usually happens when the inotify watches are exhausted. "
+ "Check the FAQ for details."));
}
}
}
diff --git a/src/gui/folderwizard.cpp b/src/gui/folderwizard.cpp
index 549d2095f..ce2def408 100644
--- a/src/gui/folderwizard.cpp
+++ b/src/gui/folderwizard.cpp
@@ -36,6 +36,7 @@
#include <QTreeWidget>
#include <QVBoxLayout>
#include <QEvent>
+#include <QCheckBox>
#include <stdlib.h>
@@ -66,8 +67,10 @@ FolderWizardLocalPath::FolderWizardLocalPath(const AccountPtr &account)
connect(_ui.localFolderChooseBtn, &QAbstractButton::clicked, this, &FolderWizardLocalPath::slotChooseLocalFolder);
_ui.localFolderChooseBtn->setToolTip(tr("Click to select a local folder to sync."));
+ QUrl serverUrl = _account->url();
+ serverUrl.setUserName(_account->credentials()->user());
QString defaultPath = QDir::homePath() + QLatin1Char('/') + Theme::instance()->appName();
- defaultPath = FolderMan::instance()->findGoodPathForNewSyncFolder(defaultPath, account->url());
+ defaultPath = FolderMan::instance()->findGoodPathForNewSyncFolder(defaultPath, serverUrl);
_ui.localFolderLineEdit->setText(QDir::toNativeSeparators(defaultPath));
_ui.localFolderLineEdit->setToolTip(tr("Enter the path to the local folder."));
@@ -481,6 +484,12 @@ FolderWizardSelectiveSync::FolderWizardSelectiveSync(const AccountPtr &account)
QVBoxLayout *layout = new QVBoxLayout(this);
_selectiveSync = new SelectiveSyncWidget(account, this);
layout->addWidget(_selectiveSync);
+
+ if (Theme::instance()->showVirtualFilesOption()) {
+ _virtualFilesCheckBox = new QCheckBox(tr("Use virtual files instead of downloading content immediately (experimental)"));
+ connect(_virtualFilesCheckBox, &QCheckBox::clicked, this, &FolderWizardSelectiveSync::virtualFilesCheckboxClicked);
+ layout->addWidget(_virtualFilesCheckBox);
+ }
}
FolderWizardSelectiveSync::~FolderWizardSelectiveSync()
@@ -508,6 +517,7 @@ void FolderWizardSelectiveSync::initializePage()
bool FolderWizardSelectiveSync::validatePage()
{
wizard()->setProperty("selectiveSyncBlackList", QVariant(_selectiveSync->createBlackList()));
+ wizard()->setProperty("useVirtualFiles", QVariant(_virtualFilesCheckBox && _virtualFilesCheckBox->isChecked()));
return true;
}
@@ -521,6 +531,18 @@ void FolderWizardSelectiveSync::cleanupPage()
QWizardPage::cleanupPage();
}
+void FolderWizardSelectiveSync::virtualFilesCheckboxClicked()
+{
+ // The click has already had an effect on the box, so if it's
+ // checked it was newly activated.
+ if (_virtualFilesCheckBox->isChecked()) {
+ OwncloudWizard::askExperimentalVirtualFilesFeature([this](bool enable) {
+ if (!enable)
+ _virtualFilesCheckBox->setChecked(false);
+ });
+ }
+}
+
// ====================================================================================
diff --git a/src/gui/folderwizard.h b/src/gui/folderwizard.h
index b6f056f56..ce1fc5293 100644
--- a/src/gui/folderwizard.h
+++ b/src/gui/folderwizard.h
@@ -25,6 +25,8 @@
#include "ui_folderwizardsourcepage.h"
#include "ui_folderwizardtargetpage.h"
+class QCheckBox;
+
namespace OCC {
class SelectiveSyncWidget;
@@ -128,8 +130,12 @@ public:
virtual void initializePage() Q_DECL_OVERRIDE;
virtual void cleanupPage() Q_DECL_OVERRIDE;
+private slots:
+ void virtualFilesCheckboxClicked();
+
private:
SelectiveSyncWidget *_selectiveSync;
+ QCheckBox *_virtualFilesCheckBox = nullptr;
};
/**
diff --git a/src/gui/generalsettings.cpp b/src/gui/generalsettings.cpp
index 8f08b1f73..d6a33fed1 100644
--- a/src/gui/generalsettings.cpp
+++ b/src/gui/generalsettings.cpp
@@ -25,6 +25,10 @@
#include "updater/updater.h"
#include "updater/ocupdater.h"
+#ifdef Q_OS_MAC
+// FIXME We should unify those, but Sparkle does everything behind the scene transparently
+#include "updater/sparkleupdater.h"
+#endif
#include "ignorelisteditor.h"
#include "config.h"
@@ -32,6 +36,7 @@
#include <QNetworkProxy>
#include <QDir>
#include <QScopedValueRollback>
+#include <QMessageBox>
namespace OCC {
@@ -49,17 +54,6 @@ GeneralSettings::GeneralSettings(QWidget *parent)
_ui->autostartCheckBox->setChecked(Utility::hasLaunchOnStartup(Theme::instance()->appName()));
connect(_ui->autostartCheckBox, &QAbstractButton::toggled, this, &GeneralSettings::slotToggleLaunchOnStartup);
- // setup about section
- QString about = Theme::instance()->about();
- if (about.isEmpty()) {
- _ui->aboutGroupBox->hide();
- } else {
- _ui->aboutLabel->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextBrowserInteraction);
- _ui->aboutLabel->setText(about);
- _ui->aboutLabel->setWordWrap(true);
- _ui->aboutLabel->setOpenExternalLinks(true);
- }
-
loadMiscSettings();
slotUpdateInfo();
@@ -98,6 +92,18 @@ GeneralSettings::GeneralSettings(QWidget *parent)
// accountAdded means the wizard was finished and the wizard might change some options.
connect(AccountManager::instance(), &AccountManager::accountAdded, this, &GeneralSettings::loadMiscSettings);
+
+ // Only our standard brandings currently support beta channel
+ Theme *theme = Theme::instance();
+ if (theme->appName() != QLatin1String("ownCloud") && theme->appName() != QLatin1String("testpilotcloud") ) {
+#ifdef Q_OS_MAC
+ // Because we don't have any statusString from the SparkleUpdater anyway we can hide the whole thing
+ _ui->updatesGroupBox->hide();
+#else
+ _ui->updateChannelLabel->hide();
+ _ui->updateChannel->hide();
+#endif
+ }
}
GeneralSettings::~GeneralSettings()
@@ -130,22 +136,79 @@ void GeneralSettings::loadMiscSettings()
void GeneralSettings::slotUpdateInfo()
{
- // Note: the sparkle-updater is not an OCUpdater
- OCUpdater *updater = qobject_cast<OCUpdater *>(Updater::instance());
- if (ConfigFile().skipUpdateCheck()) {
- updater = 0; // don't show update info if updates are disabled
+ if (ConfigFile().skipUpdateCheck() || !Updater::instance()) {
+ // updater disabled on compile
+ _ui->updatesGroupBox->setVisible(false);
+ return;
}
- if (updater) {
- connect(updater, &OCUpdater::downloadStateChanged, this, &GeneralSettings::slotUpdateInfo, Qt::UniqueConnection);
- connect(_ui->restartButton, &QAbstractButton::clicked, updater, &OCUpdater::slotStartInstaller, Qt::UniqueConnection);
+ // Note: the sparkle-updater is not an OCUpdater
+ OCUpdater *ocupdater = qobject_cast<OCUpdater *>(Updater::instance());
+ if (ocupdater) {
+ connect(ocupdater, &OCUpdater::downloadStateChanged, this, &GeneralSettings::slotUpdateInfo, Qt::UniqueConnection);
+ connect(_ui->restartButton, &QAbstractButton::clicked, ocupdater, &OCUpdater::slotStartInstaller, Qt::UniqueConnection);
connect(_ui->restartButton, &QAbstractButton::clicked, qApp, &QApplication::quit, Qt::UniqueConnection);
- _ui->updateStateLabel->setText(updater->statusString());
- _ui->restartButton->setVisible(updater->downloadState() == OCUpdater::DownloadComplete);
- } else {
- // can't have those infos from sparkle currently
- _ui->updatesGroupBox->setVisible(false);
+
+ _ui->updateStateLabel->setText(ocupdater->statusString());
+ _ui->restartButton->setVisible(ocupdater->downloadState() == OCUpdater::DownloadComplete);
+
}
+#if defined(Q_OS_MAC) && defined(HAVE_SPARKLE)
+ else if (SparkleUpdater *sparkleUpdater = qobject_cast<SparkleUpdater *>(Updater::instance())) {
+ _ui->updateStateLabel->setText(sparkleUpdater->statusString());
+ _ui->restartButton->setVisible(false);
+ }
+#endif
+
+ // Channel selection
+ _ui->updateChannel->setCurrentIndex(ConfigFile().updateChannel() == "beta" ? 1 : 0);
+ connect(_ui->updateChannel, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
+ this, &GeneralSettings::slotUpdateChannelChanged, Qt::UniqueConnection);
+}
+
+void GeneralSettings::slotUpdateChannelChanged(int index)
+{
+ QString channel = index == 0 ? QStringLiteral("stable") : QStringLiteral("beta");
+ if (channel == ConfigFile().updateChannel())
+ return;
+
+ auto msgBox = new QMessageBox(
+ QMessageBox::Warning,
+ tr("Change update channel?"),
+ tr("The update channel determines which client updates will be offered "
+ "for installation. The \"stable\" channel contains only upgrades that "
+ "are considered reliable, while the versions in the \"beta\" channel "
+ "may contain newer features and bugfixes, but have not yet been tested "
+ "thoroughly."
+ "\n\n"
+ "Note that this selects only what pool upgrades are taken from, and that "
+ "there are no downgrades: So going back from the beta channel to "
+ "the stable channel usually cannot be done immediately and means waiting "
+ "for a stable version that is newer than the currently installed beta "
+ "version."),
+ QMessageBox::NoButton,
+ this);
+ msgBox->addButton(tr("Change update channel"), QMessageBox::AcceptRole);
+ msgBox->addButton(tr("Cancel"), QMessageBox::RejectRole);
+ connect(msgBox, &QMessageBox::finished, msgBox, [this, channel, msgBox](int result) {
+ msgBox->deleteLater();
+ if (result == QMessageBox::AcceptRole) {
+ ConfigFile().setUpdateChannel(channel);
+ if (OCUpdater *updater = qobject_cast<OCUpdater *>(Updater::instance())) {
+ updater->setUpdateUrl(Updater::updateUrl());
+ updater->checkForUpdate();
+ }
+#if defined(Q_OS_MAC) && defined(HAVE_SPARKLE)
+ else if (SparkleUpdater *updater = qobject_cast<SparkleUpdater *>(Updater::instance())) {
+ updater->setUpdateUrl(Updater::updateUrl());
+ updater->checkForUpdate();
+ }
+#endif
+ } else {
+ _ui->updateChannel->setCurrentText(ConfigFile().updateChannel());
+ }
+ });
+ msgBox->open();
}
void GeneralSettings::saveMiscSettings()
diff --git a/src/gui/generalsettings.h b/src/gui/generalsettings.h
index 4e92337e6..21bf6ddc3 100644
--- a/src/gui/generalsettings.h
+++ b/src/gui/generalsettings.h
@@ -45,6 +45,7 @@ private slots:
void slotToggleOptionalDesktopNotifications(bool);
void slotShowInExplorerNavigationPane(bool);
void slotUpdateInfo();
+ void slotUpdateChannelChanged(int index);
void slotIgnoreFilesEditor();
void loadMiscSettings();
diff --git a/src/gui/generalsettings.ui b/src/gui/generalsettings.ui
index 3424992eb..509b6d350 100644
--- a/src/gui/generalsettings.ui
+++ b/src/gui/generalsettings.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>785</width>
- <height>523</height>
+ <height>390</height>
</rect>
</property>
<property name="windowTitle">
@@ -121,48 +121,88 @@
<property name="title">
<string>Updates</string>
</property>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <widget class="QLabel" name="updateStateLabel">
- <property name="text">
- <string/>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- <property name="openExternalLinks">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="restartButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>&amp;Restart &amp;&amp; Update</string>
- </property>
- </widget>
- </item>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
<item>
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Preferred</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLabel" name="updateChannelLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Channel</string>
+ </property>
+ <property name="buddy">
+ <cstring>updateChannel</cstring>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="updateChannel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <item>
+ <property name="text">
+ <string>stable</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>beta</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="updateStateLabel">
+ <property name="text">
+ <string/>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="restartButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Restart &amp;&amp; Update</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Preferred</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
</item>
</layout>
</widget>
@@ -305,7 +345,10 @@
<tabstop>ignoredFilesButton</tabstop>
<tabstop>newFolderLimitCheckBox</tabstop>
<tabstop>newFolderLimitSpinBox</tabstop>
+ <tabstop>newExternalStorage</tabstop>
+ <tabstop>showInExplorerNavigationPaneCheckBox</tabstop>
<tabstop>crashreporterCheckBox</tabstop>
+ <tabstop>updateChannel</tabstop>
<tabstop>restartButton</tabstop>
</tabstops>
<resources/>
diff --git a/src/gui/ignorelisteditor.cpp b/src/gui/ignorelisteditor.cpp
index c82ac7a3b..20e7fc5c9 100644
--- a/src/gui/ignorelisteditor.cpp
+++ b/src/gui/ignorelisteditor.cpp
@@ -27,8 +27,10 @@
namespace OCC {
-static int patternCol = 0;
-static int deletableCol = 1;
+static const int patternCol = 0;
+static const int deletableCol = 1;
+static const int skippedLinesRole = Qt::UserRole;
+static const int isGlobalRole = Qt::UserRole + 1;
IgnoreListEditor::IgnoreListEditor(QWidget *parent)
: QDialog(parent)
@@ -47,11 +49,11 @@ IgnoreListEditor::IgnoreListEditor(QWidget *parent)
"and cannot be modified in this view.")
.arg(QDir::toNativeSeparators(cfgFile.excludeFile(ConfigFile::SystemScope)));
- addPattern(".csync_journal.db*", /*deletable=*/false, /*readonly=*/true);
- addPattern("._sync_*.db*", /*deletable=*/false, /*readonly=*/true);
- addPattern(".sync_*.db*", /*deletable=*/false, /*readonly=*/true);
- readIgnoreFile(cfgFile.excludeFile(ConfigFile::SystemScope), true);
- readIgnoreFile(cfgFile.excludeFile(ConfigFile::UserScope), false);
+ addPattern(".csync_journal.db*", /*deletable=*/false, /*readonly=*/true, /*global=*/true);
+ addPattern("._sync_*.db*", /*deletable=*/false, /*readonly=*/true, /*global=*/true);
+ addPattern(".sync_*.db*", /*deletable=*/false, /*readonly=*/true, /*global=*/true);
+ readIgnoreFile(cfgFile.excludeFile(ConfigFile::SystemScope), /*global=*/true);
+ readIgnoreFile(cfgFile.excludeFile(ConfigFile::UserScope), /*global=*/false);
connect(this, &QDialog::accepted, this, &IgnoreListEditor::slotUpdateLocalIgnoreList);
ui->removePushButton->setEnabled(false);
@@ -102,15 +104,21 @@ void IgnoreListEditor::slotUpdateLocalIgnoreList()
for (int row = 0; row < ui->tableWidget->rowCount(); ++row) {
QTableWidgetItem *patternItem = ui->tableWidget->item(row, patternCol);
QTableWidgetItem *deletableItem = ui->tableWidget->item(row, deletableCol);
- if (patternItem->flags() & Qt::ItemIsEnabled) {
- QByteArray prepend;
- if (deletableItem->checkState() == Qt::Checked) {
- prepend = "]";
- } else if (patternItem->text().startsWith('#')) {
- prepend = "\\";
- }
- ignores.write(prepend + patternItem->text().toUtf8() + '\n');
+
+ if (patternItem->data(isGlobalRole).toBool())
+ continue;
+
+ QStringList skippedLines = patternItem->data(skippedLinesRole).toStringList();
+ for (const auto &line : skippedLines)
+ ignores.write(line.toUtf8() + '\n');
+
+ QByteArray prepend;
+ if (deletableItem->checkState() == Qt::Checked) {
+ prepend = "]";
+ } else if (patternItem->text().startsWith('#')) {
+ prepend = "\\";
}
+ ignores.write(prepend + patternItem->text().toUtf8() + '\n');
}
} else {
QMessageBox::warning(this, tr("Could not open file"),
@@ -132,6 +140,7 @@ void IgnoreListEditor::slotUpdateLocalIgnoreList()
// ignored (because the remote etag did not change) (issue #3172)
foreach (Folder *folder, folderMan->map()) {
folder->journalDb()->forceRemoteDiscoveryNextSync();
+ folder->slotNextSyncFullLocalDiscovery();
folderMan->scheduleFolder(folder);
}
}
@@ -146,36 +155,54 @@ void IgnoreListEditor::slotAddPattern()
if (!okClicked || pattern.isEmpty())
return;
- addPattern(pattern, false, false);
+ addPattern(pattern, /*deletable=*/false, /*readonly=*/false, /*global=*/false);
ui->tableWidget->scrollToBottom();
}
-void IgnoreListEditor::readIgnoreFile(const QString &file, bool readOnly)
+void IgnoreListEditor::readIgnoreFile(const QString &file, bool global)
{
QFile ignores(file);
- if (ignores.open(QIODevice::ReadOnly)) {
- while (!ignores.atEnd()) {
- QString line = QString::fromUtf8(ignores.readLine());
- line.chop(1);
- if (!line.isEmpty() && !line.startsWith("#")) {
- bool deletable = false;
- if (line.startsWith(']')) {
- deletable = true;
- line = line.mid(1);
- }
- addPattern(line, deletable, readOnly);
- }
+ if (!ignores.open(QIODevice::ReadOnly))
+ return;
+
+ QStringList skippedLines;
+ bool readonly = global; // global ignores default to read-only
+
+ while (!ignores.atEnd()) {
+ QString line = QString::fromUtf8(ignores.readLine());
+ line.chop(1);
+
+ // Collect empty lines and comments, we want to preserve them
+ if (line.isEmpty() || line.startsWith("#")) {
+ skippedLines.append(line);
+ // A directive that prohibits editing in the ui
+ if (line == "#!readonly")
+ readonly = true;
+ continue;
}
+
+ bool deletable = false;
+ if (line.startsWith(']')) {
+ deletable = true;
+ line = line.mid(1);
+ }
+
+ // Add and reset
+ addPattern(line, deletable, readonly, global, skippedLines);
+ skippedLines.clear();
+ readonly = global;
}
}
-int IgnoreListEditor::addPattern(const QString &pattern, bool deletable, bool readOnly)
+int IgnoreListEditor::addPattern(const QString &pattern, bool deletable, bool readOnly, bool global, const QStringList &skippedLines)
{
int newRow = ui->tableWidget->rowCount();
ui->tableWidget->setRowCount(newRow + 1);
QTableWidgetItem *patternItem = new QTableWidgetItem;
patternItem->setText(pattern);
+ patternItem->setData(skippedLinesRole, skippedLines);
+ patternItem->setData(isGlobalRole, global);
ui->tableWidget->setItem(newRow, patternCol, patternItem);
QTableWidgetItem *deletableItem = new QTableWidgetItem;
diff --git a/src/gui/ignorelisteditor.h b/src/gui/ignorelisteditor.h
index 0018e2361..553c722f4 100644
--- a/src/gui/ignorelisteditor.h
+++ b/src/gui/ignorelisteditor.h
@@ -46,8 +46,9 @@ private slots:
void slotAddPattern();
private:
- void readIgnoreFile(const QString &file, bool readOnly);
- int addPattern(const QString &pattern, bool deletable, bool readOnly);
+ void readIgnoreFile(const QString &file, bool global);
+ int addPattern(const QString &pattern, bool deletable, bool readOnly, bool global,
+ const QStringList &skippedLines = QStringList());
QString readOnlyTooltip;
Ui::IgnoreListEditor *ui;
};
diff --git a/src/gui/issueswidget.cpp b/src/gui/issueswidget.cpp
index 93dbe748c..04359dcae 100644
--- a/src/gui/issueswidget.cpp
+++ b/src/gui/issueswidget.cpp
@@ -18,6 +18,7 @@
#include "issueswidget.h"
#include "configfile.h"
#include "syncresult.h"
+#include "syncengine.h"
#include "logger.h"
#include "theme.h"
#include "folderman.h"
@@ -45,6 +46,11 @@ namespace OCC {
*/
static const int maxIssueCount = 50000;
+static QPair<QString, QString> pathsWithIssuesKey(const ProtocolItem::ExtraData &data)
+{
+ return qMakePair(data.folderName, data.path);
+}
+
IssuesWidget::IssuesWidget(QWidget *parent)
: QWidget(parent)
, _ui(new Ui::IssuesWidget)
@@ -114,6 +120,11 @@ IssuesWidget::IssuesWidget(QWidget *parent)
_ui->_tooManyIssuesWarning->hide();
connect(this, &IssuesWidget::issueCountUpdated, this,
[this](int count) { _ui->_tooManyIssuesWarning->setVisible(count >= maxIssueCount); });
+
+ _ui->_conflictHelp->hide();
+ _ui->_conflictHelp->setText(
+ tr("There were conflicts. <a href=\"%1\">Check the documentation on how to resolve them.</a>")
+ .arg(Theme::instance()->conflictHelpUrl()));
}
IssuesWidget::~IssuesWidget()
@@ -145,7 +156,14 @@ void IssuesWidget::hideEvent(QHideEvent *ev)
QWidget::hideEvent(ev);
}
-void IssuesWidget::cleanItems(const QString &folder)
+static bool persistsUntilLocalDiscovery(QTreeWidgetItem *item)
+{
+ const auto data = ProtocolItem::extraData(item);
+ return data.status == SyncFileItem::Conflict
+ || (data.status == SyncFileItem::FileIgnored && data.direction == SyncFileItem::Up);
+}
+
+void IssuesWidget::cleanItems(const std::function<bool(QTreeWidgetItem *)> &shouldDelete)
{
_ui->_treeWidget->setSortingEnabled(false);
@@ -154,8 +172,8 @@ void IssuesWidget::cleanItems(const QString &folder)
int itemCnt = _ui->_treeWidget->topLevelItemCount();
for (int cnt = itemCnt - 1; cnt >= 0; cnt--) {
QTreeWidgetItem *item = _ui->_treeWidget->topLevelItem(cnt);
- QString itemFolder = ProtocolItem::folderName(item);
- if (itemFolder == folder) {
+ if (shouldDelete(item)) {
+ _pathsWithIssues.remove(pathsWithIssuesKey(ProtocolItem::extraData(item)));
delete item;
}
}
@@ -190,7 +208,21 @@ void IssuesWidget::addItem(QTreeWidgetItem *item)
}
}
+ // Wipe any existing message for the same folder and path
+ auto newData = ProtocolItem::extraData(item);
+ if (_pathsWithIssues.contains(pathsWithIssuesKey(newData))) {
+ for (int i = 0; i < count; ++i) {
+ auto otherItem = _ui->_treeWidget->topLevelItem(i);
+ auto otherData = ProtocolItem::extraData(otherItem);
+ if (otherData.path == newData.path && otherData.folderName == newData.folderName) {
+ delete otherItem;
+ break;
+ }
+ }
+ }
+
_ui->_treeWidget->insertTopLevelItem(insertLoc, item);
+ _pathsWithIssues.insert(pathsWithIssuesKey(newData));
item->setHidden(!shouldBeVisible(item, currentAccountFilter(), currentFolderFilter()));
emit issueCountUpdated(_ui->_treeWidget->topLevelItemCount());
}
@@ -209,9 +241,49 @@ void IssuesWidget::slotOpenFile(QTreeWidgetItem *item, int)
void IssuesWidget::slotProgressInfo(const QString &folder, const ProgressInfo &progress)
{
- if (progress.status() == ProgressInfo::Starting) {
- // The sync is restarting, clean the old items
- cleanItems(folder);
+ if (progress.status() == ProgressInfo::Reconcile) {
+ // Wipe all non-persistent entries - as well as the persistent ones
+ // in cases where a local discovery was done.
+ auto f = FolderMan::instance()->folder(folder);
+ if (!f)
+ return;
+ const auto &engine = f->syncEngine();
+ const auto style = engine.lastLocalDiscoveryStyle();
+ cleanItems([&](QTreeWidgetItem *item) {
+ if (ProtocolItem::extraData(item).folderName != folder)
+ return false;
+ if (style == LocalDiscoveryStyle::FilesystemOnly)
+ return true;
+ if (!persistsUntilLocalDiscovery(item))
+ return true;
+
+ // Definitely wipe the entry if the file no longer exists
+ if (!QFileInfo(f->path() + ProtocolItem::extraData(item).path).exists())
+ return true;
+
+ auto path = QFileInfo(ProtocolItem::extraData(item).path).dir().path().toUtf8();
+ if (path == ".")
+ path.clear();
+
+ return engine.shouldDiscoverLocally(path);
+ });
+ }
+ if (progress.status() == ProgressInfo::Done) {
+ // We keep track very well of pending conflicts.
+ // Inform other components about them.
+ QStringList conflicts;
+ auto tree = _ui->_treeWidget;
+ for (int i = 0; i < tree->topLevelItemCount(); ++i) {
+ auto item = tree->topLevelItem(i);
+ auto data = ProtocolItem::extraData(item);
+ if (data.folderName == folder
+ && data.status == SyncFileItem::Conflict) {
+ conflicts.append(data.path);
+ }
+ }
+ emit ProgressDispatcher::instance()->folderConflicts(folder, conflicts);
+
+ _ui->_conflictHelp->setHidden(Theme::instance()->conflictHelpUrl().isEmpty() || conflicts.isEmpty());
}
}
@@ -285,13 +357,14 @@ bool IssuesWidget::shouldBeVisible(QTreeWidgetItem *item, AccountState *filterAc
const QString &filterFolderAlias) const
{
bool visible = true;
- auto status = ProtocolItem::status(item);
+ auto data = ProtocolItem::extraData(item);
+ auto status = data.status;
visible &= (_ui->showIgnores->isChecked() || status != SyncFileItem::FileIgnored);
visible &= (_ui->showWarnings->isChecked()
|| (status != SyncFileItem::SoftError
&& status != SyncFileItem::Restoration));
- auto folderalias = ProtocolItem::folderName(item);
+ const auto &folderalias = data.folderName;
if (filterAccount) {
auto folder = FolderMan::instance()->folder(folderalias);
visible &= folder && folder->accountState() == filterAccount;
@@ -415,12 +488,14 @@ void IssuesWidget::addError(const QString &folderAlias, const QString &message,
QTreeWidgetItem *twitem = new ProtocolItem(columns);
twitem->setData(0, Qt::SizeHintRole, QSize(0, ActivityItemDelegate::rowHeight()));
- twitem->setData(0, Qt::UserRole, timestamp);
twitem->setIcon(0, icon);
twitem->setToolTip(0, longTimeStr);
- twitem->setData(2, Qt::UserRole, folderAlias);
twitem->setToolTip(3, message);
- twitem->setData(3, Qt::UserRole, SyncFileItem::NormalError);
+ ProtocolItem::ExtraData data;
+ data.timestamp = timestamp;
+ data.folderName = folderAlias;
+ data.status = SyncFileItem::NormalError;
+ ProtocolItem::setExtraData(twitem, data);
addItem(twitem);
addErrorWidget(twitem, message, category);
@@ -440,7 +515,7 @@ void IssuesWidget::addErrorWidget(QTreeWidgetItem *item, const QString &message,
auto button = new QPushButton("Retry all uploads", widget);
button->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding);
- auto folderAlias = ProtocolItem::folderName(item);
+ auto folderAlias = ProtocolItem::extraData(item).folderName;
connect(button, &QPushButton::clicked,
this, [this, folderAlias]() { retryInsufficentRemoteStorageErrors(folderAlias); });
layout->addWidget(button);
diff --git a/src/gui/issueswidget.h b/src/gui/issueswidget.h
index 443fc9451..2a897a8b3 100644
--- a/src/gui/issueswidget.h
+++ b/src/gui/issueswidget.h
@@ -77,7 +77,7 @@ private:
QString currentFolderFilter() const;
bool shouldBeVisible(QTreeWidgetItem *item, AccountState *filterAccount,
const QString &filterFolderAlias) const;
- void cleanItems(const QString &folder);
+ void cleanItems(const std::function<bool(QTreeWidgetItem *)> &shouldDelete);
void addItem(QTreeWidgetItem *item);
/// Add the special error widget for the category, if any
@@ -89,6 +89,9 @@ private:
/// Each insert disables sorting, this timer reenables it
QTimer _reenableSorting;
+ /// Optimization: keep track of all folder/paths pairs that have an associated issue
+ QSet<QPair<QString, QString>> _pathsWithIssues;
+
Ui::IssuesWidget *_ui;
};
}
diff --git a/src/gui/issueswidget.ui b/src/gui/issueswidget.ui
index 73acf809a..f1c2d8fdf 100644
--- a/src/gui/issueswidget.ui
+++ b/src/gui/issueswidget.ui
@@ -128,39 +128,69 @@
</widget>
</item>
<item>
- <widget class="QLabel" name="_tooManyIssuesWarning">
- <property name="text">
- <string>There were too many issues. Not all will be visible here.</string>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout">
+ <layout class="QHBoxLayout" name="horizontalLayout_2" stretch="1,0">
<item>
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QLabel" name="_tooManyIssuesWarning">
+ <property name="text">
+ <string>There were too many issues. Not all will be visible here.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="_conflictHelp">
+ <property name="text">
+ <string>There were conflicts. Check the documentation on how to resolve them.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
</item>
<item>
- <widget class="QPushButton" name="copyIssuesButton">
- <property name="toolTip">
- <string>Copy the issues list to the clipboard.</string>
- </property>
- <property name="text">
- <string>Copy</string>
- </property>
- </widget>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Minimum</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="copyIssuesButton">
+ <property name="toolTip">
+ <string>Copy the issues list to the clipboard.</string>
+ </property>
+ <property name="text">
+ <string>Copy</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
</item>
</layout>
</item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout"/>
+ </item>
</layout>
</widget>
<resources/>
diff --git a/src/gui/logbrowser.cpp b/src/gui/logbrowser.cpp
index a7303b0f0..7abfeb22d 100644
--- a/src/gui/logbrowser.cpp
+++ b/src/gui/logbrowser.cpp
@@ -96,6 +96,20 @@ LogBrowser::LogBrowser(QWidget *parent)
mainLayout->addWidget(btnbox);
+ // button to permanently save logs
+ _permanentLogging = new QCheckBox;
+ _permanentLogging->setText(tr("Permanently save logs"));
+ _permanentLogging->setToolTip(
+ tr("When this option is enabled and no other logging is configured, "
+ "logs will be written to a temporary folder and expire after a few hours. "
+ "This setting persists across client restarts.\n"
+ "\n"
+ "Logs will be written to %1")
+ .arg(Logger::instance()->temporaryFolderLogDirPath()));
+ _permanentLogging->setChecked(ConfigFile().automaticLogDir());
+ btnbox->addButton(_permanentLogging, QDialogButtonBox::ActionRole);
+ connect(_permanentLogging, &QCheckBox::toggled, this, &LogBrowser::togglePermanentLogging);
+
// clear button
_clearBtn = new QPushButton;
_clearBtn->setText(tr("Clear"));
@@ -216,4 +230,18 @@ void LogBrowser::slotClearLog()
_logWidget->clear();
}
+void LogBrowser::togglePermanentLogging(bool enabled)
+{
+ ConfigFile().setAutomaticLogDir(enabled);
+
+ auto logger = Logger::instance();
+ if (enabled) {
+ if (!logger->isLoggingToFile()) {
+ logger->setupTemporaryFolderLogDir();
+ }
+ } else {
+ logger->disableTemporaryFolderLogDir();
+ }
+}
+
} // namespace
diff --git a/src/gui/logbrowser.h b/src/gui/logbrowser.h
index a1c5c6da0..b7e2d58ac 100644
--- a/src/gui/logbrowser.h
+++ b/src/gui/logbrowser.h
@@ -66,11 +66,13 @@ protected slots:
void search(const QString &);
void slotSave();
void slotClearLog();
+ void togglePermanentLogging(bool enabled);
private:
LogWidget *_logWidget;
QLineEdit *_findTermEdit;
QCheckBox *_logDebugCheckBox;
+ QCheckBox *_permanentLogging;
QPushButton *_saveBtn;
QPushButton *_clearBtn;
QLabel *_statusLabel;
diff --git a/src/gui/navigationpanehelper.cpp b/src/gui/navigationpanehelper.cpp
index 47458bc4a..ede6a50fa 100644
--- a/src/gui/navigationpanehelper.cpp
+++ b/src/gui/navigationpanehelper.cpp
@@ -84,6 +84,7 @@ void NavigationPaneHelper::updateCloudStorageRegistry()
QString clsidStr = folder->navigationPaneClsid().toString();
QString clsidPath = QString() % "Software\\Classes\\CLSID\\" % clsidStr;
+ QString clsidPathWow64 = QString() % "Software\\Classes\\Wow6432Node\\CLSID\\" % clsidStr;
QString namespacePath = QString() % "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\NameSpace\\" % clsidStr;
QString title = folder->shortGuiRemotePathOrAppName();
@@ -98,25 +99,35 @@ void NavigationPaneHelper::updateCloudStorageRegistry()
// Steps taken from: https://msdn.microsoft.com/en-us/library/windows/desktop/dn889934%28v=vs.85%29.aspx
// Step 1: Add your CLSID and name your extension
Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath, QString(), REG_SZ, title);
+ Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64, QString(), REG_SZ, title);
// Step 2: Set the image for your icon
Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath + QStringLiteral("\\DefaultIcon"), QString(), REG_SZ, iconPath);
+ Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64 + QStringLiteral("\\DefaultIcon"), QString(), REG_SZ, iconPath);
// Step 3: Add your extension to the Navigation Pane and make it visible
Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath, QStringLiteral("System.IsPinnedToNameSpaceTree"), REG_DWORD, 0x1);
+ Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64, QStringLiteral("System.IsPinnedToNameSpaceTree"), REG_DWORD, 0x1);
// Step 4: Set the location for your extension in the Navigation Pane
Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath, QStringLiteral("SortOrderIndex"), REG_DWORD, 0x41);
+ Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64, QStringLiteral("SortOrderIndex"), REG_DWORD, 0x41);
// Step 5: Provide the dll that hosts your extension.
Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath + QStringLiteral("\\InProcServer32"), QString(), REG_EXPAND_SZ, QStringLiteral("%systemroot%\\system32\\shell32.dll"));
+ Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64 + QStringLiteral("\\InProcServer32"), QString(), REG_EXPAND_SZ, QStringLiteral("%systemroot%\\system32\\shell32.dll"));
// Step 6: Define the instance object
// Indicate that your namespace extension should function like other file folder structures in File Explorer.
Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath + QStringLiteral("\\Instance"), QStringLiteral("CLSID"), REG_SZ, QStringLiteral("{0E5AAE11-A475-4c5b-AB00-C66DE400274E}"));
+ Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64 + QStringLiteral("\\Instance"), QStringLiteral("CLSID"), REG_SZ, QStringLiteral("{0E5AAE11-A475-4c5b-AB00-C66DE400274E}"));
// Step 7: Provide the file system attributes of the target folder
Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath + QStringLiteral("\\Instance\\InitPropertyBag"), QStringLiteral("Attributes"), REG_DWORD, 0x11);
+ Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64 + QStringLiteral("\\Instance\\InitPropertyBag"), QStringLiteral("Attributes"), REG_DWORD, 0x11);
// Step 8: Set the path for the sync root
Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath + QStringLiteral("\\Instance\\InitPropertyBag"), QStringLiteral("TargetFolderPath"), REG_SZ, targetFolderPath);
+ Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64 + QStringLiteral("\\Instance\\InitPropertyBag"), QStringLiteral("TargetFolderPath"), REG_SZ, targetFolderPath);
// Step 9: Set appropriate shell flags
Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath + QStringLiteral("\\ShellFolder"), QStringLiteral("FolderValueFlags"), REG_DWORD, 0x28);
+ Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64 + QStringLiteral("\\ShellFolder"), QStringLiteral("FolderValueFlags"), REG_DWORD, 0x28);
// Step 10: Set the appropriate flags to control your shell behavior
Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath + QStringLiteral("\\ShellFolder"), QStringLiteral("Attributes"), REG_DWORD, 0xF080004D);
+ Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64 + QStringLiteral("\\ShellFolder"), QStringLiteral("Attributes"), REG_DWORD, 0xF080004D);
// Step 11: Register your extension in the namespace root
Utility::registrySetKeyValue(HKEY_CURRENT_USER, namespacePath, QString(), REG_SZ, title);
// Step 12: Hide your extension from the Desktop
@@ -137,11 +148,13 @@ void NavigationPaneHelper::updateCloudStorageRegistry()
foreach (auto &clsid, entriesToRemove) {
QString clsidStr = clsid.toString();
QString clsidPath = QString() % "Software\\Classes\\CLSID\\" % clsidStr;
+ QString clsidPathWow64 = QString() % "Software\\Classes\\Wow6432Node\\CLSID\\" % clsidStr;
QString namespacePath = QString() % "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\NameSpace\\" % clsidStr;
qCInfo(lcNavPane) << "Explorer Cloud storage provider: now unused, removing own CLSID" << clsidStr;
#ifdef Q_OS_WIN
Utility::registryDeleteKeyTree(HKEY_CURRENT_USER, clsidPath);
+ Utility::registryDeleteKeyTree(HKEY_CURRENT_USER, clsidPathWow64);
Utility::registryDeleteKeyTree(HKEY_CURRENT_USER, namespacePath);
Utility::registryDeleteKeyValue(HKEY_CURRENT_USER, QStringLiteral("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\HideDesktopIcons\\NewStartPanel"), clsidStr);
#endif
diff --git a/src/gui/networksettings.cpp b/src/gui/networksettings.cpp
index 6305dc3a3..d2436396d 100644
--- a/src/gui/networksettings.cpp
+++ b/src/gui/networksettings.cpp
@@ -164,6 +164,9 @@ void NetworkSettings::saveProxySettings()
cfgFile.setProxyType(QNetworkProxy::DefaultProxy);
} else if (_ui->manualProxyRadioButton->isChecked()) {
int type = _ui->typeComboBox->itemData(_ui->typeComboBox->currentIndex()).toInt();
+ QString host = _ui->hostLineEdit->text();
+ if (host.isEmpty())
+ type = QNetworkProxy::NoProxy;
bool needsAuth = _ui->authRequiredcheckBox->isChecked();
QString user = _ui->userLineEdit->text();
QString pass = _ui->passwordLineEdit->text();
@@ -217,4 +220,17 @@ void NetworkSettings::checkEmptyProxyHost()
}
}
+void NetworkSettings::showEvent(QShowEvent *event)
+{
+ if (!event->spontaneous()
+ && _ui->manualProxyRadioButton->isChecked()
+ && _ui->hostLineEdit->text().isEmpty()) {
+ _ui->noProxyRadioButton->setChecked(true);
+ checkEmptyProxyHost();
+ saveProxySettings();
+ }
+
+ QWidget::showEvent(event);
+}
+
} // namespace OCC
diff --git a/src/gui/networksettings.h b/src/gui/networksettings.h
index 7201d1109..8d35b14dc 100644
--- a/src/gui/networksettings.h
+++ b/src/gui/networksettings.h
@@ -35,7 +35,7 @@ class NetworkSettings : public QWidget
public:
explicit NetworkSettings(QWidget *parent = 0);
~NetworkSettings();
- QSize sizeHint() const;
+ QSize sizeHint() const override;
private slots:
void saveProxySettings();
@@ -44,6 +44,9 @@ private slots:
/// Red marking of host field if empty and enabled
void checkEmptyProxyHost();
+protected:
+ void showEvent(QShowEvent *event) override;
+
private:
void loadProxySettings();
void loadBWLimitSettings();
diff --git a/src/gui/notificationwidget.cpp b/src/gui/notificationwidget.cpp
index cd879451e..04573f74a 100644
--- a/src/gui/notificationwidget.cpp
+++ b/src/gui/notificationwidget.cpp
@@ -44,7 +44,16 @@ void NotificationWidget::setActivity(const Activity &activity)
_ui._subjectLabel->setVisible(!activity._subject.isEmpty());
_ui._messageLabel->setVisible(!activity._message.isEmpty());
- _ui._subjectLabel->setText(activity._subject);
+ if (activity._link.isEmpty()) {
+ _ui._subjectLabel->setText(activity._subject);
+ } else {
+ _ui._subjectLabel->setText( QString("<a href=\"%1\">%2</a>")
+ .arg(activity._link.toString(QUrl::FullyEncoded),
+ activity._subject.toHtmlEscaped() ));
+ _ui._subjectLabel->setTextFormat(Qt::RichText);
+ _ui._subjectLabel->setOpenExternalLinks(true);
+ }
+
_ui._messageLabel->setText(activity._message);
_ui._notifIcon->setPixmap(QPixmap(":/client/resources/bell.png"));
diff --git a/src/gui/ocsshareejob.cpp b/src/gui/ocsshareejob.cpp
index 40bb70d91..0d1b6d44b 100644
--- a/src/gui/ocsshareejob.cpp
+++ b/src/gui/ocsshareejob.cpp
@@ -14,6 +14,8 @@
#include "ocsshareejob.h"
+#include <QJsonDocument>
+
namespace OCC {
OcsShareeJob::OcsShareeJob(AccountPtr account)
diff --git a/src/gui/ocssharejob.cpp b/src/gui/ocssharejob.cpp
index 520225461..64e6ca854 100644
--- a/src/gui/ocssharejob.cpp
+++ b/src/gui/ocssharejob.cpp
@@ -25,6 +25,7 @@ OcsShareJob::OcsShareJob(AccountPtr account)
: OcsJob(account)
{
setPath("ocs/v1.php/apps/files_sharing/api/v1/shares");
+ addParam(QString::fromLatin1("reshares"), QString::fromLatin1("true"));
connect(this, &OcsJob::jobFinished, this, &OcsShareJob::jobDone);
}
diff --git a/src/gui/ocssharejob.h b/src/gui/ocssharejob.h
index 09c69410d..5760085fc 100644
--- a/src/gui/ocssharejob.h
+++ b/src/gui/ocssharejob.h
@@ -21,6 +21,8 @@
#include <QList>
#include <QPair>
+class QJsonDocument;
+
namespace OCC {
/**
diff --git a/src/gui/owncloud.xml.in b/src/gui/owncloud.xml.in
new file mode 100644
index 000000000..085bb3fb9
--- /dev/null
+++ b/src/gui/owncloud.xml.in
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
+ <mime-type type="application/vnd.@APPLICATION_EXECUTABLE@">
+ <comment>@APPLICATION_NAME@ virtual files</comment>
+ <glob pattern="*.@APPLICATION_VIRTUALFILE_SUFFIX@"/>
+ </mime-type>
+</mime-info>
diff --git a/src/gui/owncloudgui.cpp b/src/gui/owncloudgui.cpp
index be9f2bea1..cbd153000 100644
--- a/src/gui/owncloudgui.cpp
+++ b/src/gui/owncloudgui.cpp
@@ -38,6 +38,8 @@
#include <QDesktopServices>
#include <QDir>
#include <QMessageBox>
+#include <QDialog>
+#include <QHBoxLayout>
#if defined(Q_OS_X11)
#include <QX11Info>
@@ -50,18 +52,13 @@ const char propertyAccountC[] = "oc_account";
ownCloudGui::ownCloudGui(Application *parent)
: QObject(parent)
, _tray(0)
- ,
#if defined(Q_OS_MAC)
- _settingsDialog(new SettingsDialogMac(this))
- ,
+ , _settingsDialog(new SettingsDialogMac(this))
#else
- _settingsDialog(new SettingsDialog(this))
- ,
+ , _settingsDialog(new SettingsDialog(this))
#endif
- _logBrowser(0)
- , _contextMenuVisibleOsx(false)
+ , _logBrowser(0)
, _recentActionsMenu(0)
- , _qdbusmenuWorkaround(false)
, _app(parent)
{
_tray = new Systray();
@@ -117,7 +114,7 @@ void ownCloudGui::slotOpenSettingsDialog()
void ownCloudGui::slotTrayClicked(QSystemTrayIcon::ActivationReason reason)
{
- if (_qdbusmenuWorkaround) {
+ if (_workaroundFakeDoubleClick) {
static QElapsedTimer last_click;
if (last_click.isValid() && last_click.elapsed() < 200) {
return;
@@ -165,7 +162,10 @@ void ownCloudGui::slotSyncStateChange(Folder *folder)
qCInfo(lcApplication) << "Sync state changed for folder " << folder->remoteUrl().toString() << ": " << result.statusString();
- if (result.status() == SyncResult::Success || result.status() == SyncResult::Error) {
+ if (result.status() == SyncResult::Success
+ || result.status() == SyncResult::Problem
+ || result.status() == SyncResult::SyncAbortRequested
+ || result.status() == SyncResult::Error) {
Logger::instance()->enterNextLogFile();
}
@@ -196,7 +196,7 @@ void ownCloudGui::slotTrayMessageIfServerUnsupported(Account *account)
if (account->serverVersionUnsupported()) {
slotShowTrayMessage(
tr("Unsupported Server Version"),
- tr("The server on account %1 runs an old and unsupported version %2. "
+ tr("The server on account %1 runs an unsupported version %2. "
"Using this client with unsupported server versions is untested and "
"potentially dangerous. Proceed at your own risk.")
.arg(account->displayName(), account->serverVersion()));
@@ -399,17 +399,19 @@ void ownCloudGui::addAccountContextMenu(AccountStatePtr accountState, QMenu *men
void ownCloudGui::slotContextMenuAboutToShow()
{
- // For some reason on OS X _contextMenu->isVisible returns always false
- _contextMenuVisibleOsx = true;
+ _contextMenuVisibleManual = true;
// Update icon in sys tray, as it might change depending on the context menu state
slotComputeOverallSyncStatus();
+
+ if (!_workaroundNoAboutToShowUpdate) {
+ updateContextMenu();
+ }
}
void ownCloudGui::slotContextMenuAboutToHide()
{
- // For some reason on OS X _contextMenu->isVisible returns always false
- _contextMenuVisibleOsx = false;
+ _contextMenuVisibleManual = false;
// Update icon in sys tray, as it might change depending on the context menu state
slotComputeOverallSyncStatus();
@@ -417,11 +419,11 @@ void ownCloudGui::slotContextMenuAboutToHide()
bool ownCloudGui::contextMenuVisible() const
{
-#ifdef Q_OS_MAC
- return _contextMenuVisibleOsx;
-#else
+ // On some platforms isVisible doesn't work and always returns false,
+ // elsewhere aboutToHide is unreliable.
+ if (_workaroundManualVisibility)
+ return _contextMenuVisibleManual;
return _contextMenu->isVisible();
-#endif
}
static bool minimalTrayMenu()
@@ -444,12 +446,36 @@ static bool updateWhileVisible()
}
}
-static QByteArray forceQDBusTrayWorkaround()
+static QByteArray envForceQDBusTrayWorkaround()
{
static QByteArray var = qgetenv("OWNCLOUD_FORCE_QDBUS_TRAY_WORKAROUND");
return var;
}
+static QByteArray envForceWorkaroundShowAndHideTray()
+{
+ static QByteArray var = qgetenv("OWNCLOUD_FORCE_TRAY_SHOW_HIDE");
+ return var;
+}
+
+static QByteArray envForceWorkaroundNoAboutToShowUpdate()
+{
+ static QByteArray var = qgetenv("OWNCLOUD_FORCE_TRAY_NO_ABOUT_TO_SHOW");
+ return var;
+}
+
+static QByteArray envForceWorkaroundFakeDoubleClick()
+{
+ static QByteArray var = qgetenv("OWNCLOUD_FORCE_TRAY_FAKE_DOUBLE_CLICK");
+ return var;
+}
+
+static QByteArray envForceWorkaroundManualVisibility()
+{
+ static QByteArray var = qgetenv("OWNCLOUD_FORCE_TRAY_MANUAL_VISIBILITY");
+ return var;
+}
+
void ownCloudGui::setupContextMenu()
{
if (_contextMenu) {
@@ -468,55 +494,73 @@ void ownCloudGui::setupContextMenu()
// The tray menu is surprisingly problematic. Being able to switch to
// a minimal version of it is a useful workaround and testing tool.
if (minimalTrayMenu()) {
+ if (! Theme::instance()->about().isEmpty()) {
+ _contextMenu->addSeparator();
+ _contextMenu->addAction(_actionAbout);
+ }
_contextMenu->addAction(_actionQuit);
return;
}
-// Enables workarounds for bugs introduced in Qt 5.5.0
-// In particular QTBUG-47863 #3672 (tray menu fails to update and
-// becomes unresponsive) and QTBUG-48068 #3722 (click signal is
-// emitted several times)
-// The Qt version check intentionally uses 5.0.0 (where platformMenu()
-// was introduced) instead of 5.5.0 to avoid issues where the Qt
-// version used to build is different from the one used at runtime.
-// If we build with 5.6.1 or newer, we can skip this because the
-// bugs should be fixed there.
-#ifdef Q_OS_LINUX
-#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) && (QT_VERSION < QT_VERSION_CHECK(5, 6, 0))
- if (qVersion() == QByteArray("5.5.0")) {
- QObject *platformMenu = reinterpret_cast<QObject *>(_tray->contextMenu()->platformMenu());
- if (platformMenu
- && platformMenu->metaObject()->className() == QLatin1String("QDBusPlatformMenu")) {
- _qdbusmenuWorkaround = true;
- qCWarning(lcApplication) << "Enabled QDBusPlatformMenu workaround";
- }
- }
-#endif
-#endif
+ auto applyEnvVariable = [](bool *sw, const QByteArray &value) {
+ if (value == "1")
+ *sw = true;
+ if (value == "0")
+ *sw = false;
+ };
- if (forceQDBusTrayWorkaround() == "1") {
- _qdbusmenuWorkaround = true;
- } else if (forceQDBusTrayWorkaround() == "0") {
- _qdbusmenuWorkaround = false;
+ // This is an old compound flag that people might still depend on
+ bool qdbusmenuWorkarounds = false;
+ applyEnvVariable(&qdbusmenuWorkarounds, envForceQDBusTrayWorkaround());
+ if (qdbusmenuWorkarounds) {
+ _workaroundFakeDoubleClick = true;
+ _workaroundNoAboutToShowUpdate = true;
+ _workaroundShowAndHideTray = true;
}
- // When the qdbusmenuWorkaround is necessary, we can't do on-demand updates
- // because the workaround is to hide and show the tray icon.
- if (_qdbusmenuWorkaround) {
- connect(&_workaroundBatchTrayUpdate, &QTimer::timeout, this, &ownCloudGui::updateContextMenu);
- _workaroundBatchTrayUpdate.setInterval(30 * 1000);
- _workaroundBatchTrayUpdate.setSingleShot(true);
- } else {
-// Update the context menu whenever we're about to show it
-// to the user.
#ifdef Q_OS_MAC
- // https://bugreports.qt.io/browse/QTBUG-54633
- connect(_contextMenu.data(), SIGNAL(aboutToShow()), SLOT(slotContextMenuAboutToShow()));
- connect(_contextMenu.data(), SIGNAL(aboutToHide()), SLOT(slotContextMenuAboutToHide()));
-#else
- connect(_contextMenu.data(), &QMenu::aboutToShow, this, &ownCloudGui::updateContextMenu);
+ // https://bugreports.qt.io/browse/QTBUG-54633
+ _workaroundNoAboutToShowUpdate = true;
+ _workaroundManualVisibility = true;
#endif
+
+#ifdef Q_OS_LINUX
+ // For KDE sessions if the platform plugin is missing,
+ // neither aboutToShow() updates nor the isVisible() call
+ // work. At least aboutToHide is reliable.
+ // https://github.com/owncloud/client/issues/6545
+ static QByteArray xdgCurrentDesktop = qgetenv("XDG_CURRENT_DESKTOP");
+ static QByteArray desktopSession = qgetenv("DESKTOP_SESSION");
+ bool isKde =
+ xdgCurrentDesktop.contains("KDE")
+ || desktopSession.contains("plasma")
+ || desktopSession.contains("kde");
+ QObject *platformMenu = reinterpret_cast<QObject *>(_tray->contextMenu()->platformMenu());
+ if (isKde && platformMenu && platformMenu->metaObject()->className() == QLatin1String("QDBusPlatformMenu")) {
+ _workaroundManualVisibility = true;
+ _workaroundNoAboutToShowUpdate = true;
}
+#endif
+
+ applyEnvVariable(&_workaroundNoAboutToShowUpdate, envForceWorkaroundNoAboutToShowUpdate());
+ applyEnvVariable(&_workaroundFakeDoubleClick, envForceWorkaroundFakeDoubleClick());
+ applyEnvVariable(&_workaroundShowAndHideTray, envForceWorkaroundShowAndHideTray());
+ applyEnvVariable(&_workaroundManualVisibility, envForceWorkaroundManualVisibility());
+
+ qCInfo(lcApplication) << "Tray menu workarounds:"
+ << "noabouttoshow:" << _workaroundNoAboutToShowUpdate
+ << "fakedoubleclick:" << _workaroundFakeDoubleClick
+ << "showhide:" << _workaroundShowAndHideTray
+ << "manualvisibility:" << _workaroundManualVisibility;
+
+
+ connect(&_delayedTrayUpdateTimer, &QTimer::timeout, this, &ownCloudGui::updateContextMenu);
+ _delayedTrayUpdateTimer.setInterval(2 * 1000);
+ _delayedTrayUpdateTimer.setSingleShot(true);
+
+ connect(_contextMenu.data(), SIGNAL(aboutToShow()), SLOT(slotContextMenuAboutToShow()));
+ // unfortunately aboutToHide is unreliable, it seems to work on OSX though
+ connect(_contextMenu.data(), SIGNAL(aboutToHide()), SLOT(slotContextMenuAboutToHide()));
// Populate the context menu now.
updateContextMenu();
@@ -528,13 +572,21 @@ void ownCloudGui::updateContextMenu()
return;
}
- if (_qdbusmenuWorkaround) {
+ // If it's visible, we can't update live, and it won't be updated lazily: reschedule
+ if (contextMenuVisible() && !updateWhileVisible() && _workaroundNoAboutToShowUpdate) {
+ if (!_delayedTrayUpdateTimer.isActive()) {
+ _delayedTrayUpdateTimer.start();
+ }
+ return;
+ }
+
+ if (_workaroundShowAndHideTray) {
// To make tray menu updates work with these bugs (see setupContextMenu)
// we need to hide and show the tray icon. We don't want to do that
// while it's visible!
if (contextMenuVisible()) {
- if (!_workaroundBatchTrayUpdate.isActive()) {
- _workaroundBatchTrayUpdate.start();
+ if (!_delayedTrayUpdateTimer.isActive()) {
+ _delayedTrayUpdateTimer.start();
}
return;
}
@@ -647,37 +699,38 @@ void ownCloudGui::updateContextMenu()
}
_contextMenu->addAction(_actionLogin);
}
+
+ if (! Theme::instance()->about().isEmpty()) {
+ _contextMenu->addSeparator();
+ _contextMenu->addAction(_actionAbout);
+ }
+
_contextMenu->addAction(_actionQuit);
- if (_qdbusmenuWorkaround) {
+ if (_workaroundShowAndHideTray) {
_tray->show();
}
}
void ownCloudGui::updateContextMenuNeeded()
{
- // For the workaround case updating while visible is impossible. Instead
- // occasionally update the menu when it's invisible.
- if (_qdbusmenuWorkaround) {
- if (!_workaroundBatchTrayUpdate.isActive()) {
- _workaroundBatchTrayUpdate.start();
- }
+ // if it's visible and we can update live: update now
+ if (contextMenuVisible() && updateWhileVisible()) {
+ // Note: don't update while visible on OSX
+ // https://bugreports.qt.io/browse/QTBUG-54845
+ updateContextMenu();
return;
}
-#ifdef Q_OS_MAC
- // https://bugreports.qt.io/browse/QTBUG-54845
- // We cannot update on demand or while visible -> update when invisible.
- if (!contextMenuVisible()) {
- updateContextMenu();
+ // if we can't lazily update: update later
+ if (_workaroundNoAboutToShowUpdate) {
+ // Note: don't update immediately even in the invisible case
+ // as that can lead to extremely frequent menu updates
+ if (!_delayedTrayUpdateTimer.isActive()) {
+ _delayedTrayUpdateTimer.start();
+ }
+ return;
}
-#else
- if (updateWhileVisible() && contextMenuVisible())
- updateContextMenu();
-#endif
-
- // If no update was done here, we might update it on-demand due to
- // the aboutToShow() signal.
}
void ownCloudGui::slotShowTrayMessage(const QString &title, const QString &msg)
@@ -734,6 +787,8 @@ void ownCloudGui::setupActions()
QObject::connect(_actionNewAccountWizard, &QAction::triggered, this, &ownCloudGui::slotNewAccountWizard);
_actionHelp = new QAction(tr("Help"), this);
QObject::connect(_actionHelp, &QAction::triggered, this, &ownCloudGui::slotHelp);
+ _actionAbout = new QAction(tr("About %1").arg(Theme::instance()->appNameGUI()), this);
+ QObject::connect(_actionAbout, &QAction::triggered, this, &ownCloudGui::slotAbout);
_actionQuit = new QAction(tr("Quit %1").arg(Theme::instance()->appNameGUI()), this);
QObject::connect(_actionQuit, SIGNAL(triggered(bool)), _app, SLOT(quit()));
@@ -780,9 +835,12 @@ void ownCloudGui::slotUpdateProgress(const QString &folder, const ProgressInfo &
Q_UNUSED(folder);
if (progress.status() == ProgressInfo::Discovery) {
- if (!progress._currentDiscoveredFolder.isEmpty()) {
- _actionStatus->setText(tr("Checking for changes in '%1'")
- .arg(progress._currentDiscoveredFolder));
+ if (!progress._currentDiscoveredRemoteFolder.isEmpty()) {
+ _actionStatus->setText(tr("Checking for changes in remote '%1'")
+ .arg(progress._currentDiscoveredRemoteFolder));
+ } else if (!progress._currentDiscoveredLocalFolder.isEmpty()) {
+ _actionStatus->setText(tr("Checking for changes in local '%1'")
+ .arg(progress._currentDiscoveredLocalFolder));
}
} else if (progress.status() == ProgressInfo::Done) {
QTimer::singleShot(2000, this, &ownCloudGui::slotComputeOverallSyncStatus);
@@ -1026,20 +1084,17 @@ void ownCloudGui::raiseDialog(QWidget *raiseWidget)
}
-void ownCloudGui::slotShowShareDialog(const QString &sharePath, const QString &localPath)
+void ownCloudGui::slotShowShareDialog(const QString &sharePath, const QString &localPath, ShareDialogStartPage startPage)
{
- const auto folder = FolderMan::instance()->folderForPath(localPath);
+ QString file;
+ const auto folder = FolderMan::instance()->folderForPath(localPath, &file);
if (!folder) {
qCWarning(lcApplication) << "Could not open share dialog for" << localPath << "no responsible folder found";
return;
}
- // For https://github.com/owncloud/client/issues/3783
- _settingsDialog->hide();
-
const auto accountState = folder->accountState();
- const QString file = localPath.mid(folder->cleanPath().length() + 1);
SyncJournalFileRecord fileRecord;
bool resharingAllowed = true; // lets assume the good
@@ -1070,7 +1125,7 @@ void ownCloudGui::slotShowShareDialog(const QString &sharePath, const QString &l
w = _shareDialogs[localPath];
} else {
qCInfo(lcApplication) << "Opening share dialog" << sharePath << localPath << maxSharingPermissions;
- w = new ShareDialog(accountState, sharePath, localPath, maxSharingPermissions, fileRecord.numericFileId());
+ w = new ShareDialog(accountState, sharePath, localPath, maxSharingPermissions, fileRecord.legacyDeriveNumericFileId(), startPage);
w->setAttribute(Qt::WA_DeleteOnClose, true);
_shareDialogs[localPath] = w;
@@ -1090,5 +1145,28 @@ void ownCloudGui::slotRemoveDestroyedShareDialogs()
}
}
+void ownCloudGui::slotAbout()
+{
+ QString title = tr("About %1").arg(Theme::instance()->appNameGUI());
+ QString about = Theme::instance()->about();
+ QMessageBox *msgBox = new QMessageBox(this->_settingsDialog);
+#ifdef Q_OS_MAC
+ // From Qt doc: "On macOS, the window title is ignored (as required by the macOS Guidelines)."
+ msgBox->setText(title);
+#else
+ msgBox->setWindowTitle(title);
+#endif
+ msgBox->setAttribute(Qt::WA_DeleteOnClose, true);
+ msgBox->setTextFormat(Qt::RichText);
+ msgBox->setTextInteractionFlags(Qt::TextBrowserInteraction);
+ msgBox->setInformativeText("<qt>"+about+"</qt>");
+ msgBox->setStandardButtons(QMessageBox::Ok);
+ QIcon appIcon = Theme::instance()->applicationIcon();
+ // Assume icon is always small enough to fit an about dialog?
+ qDebug() << appIcon.availableSizes().last();
+ msgBox->setIconPixmap(appIcon.pixmap(appIcon.availableSizes().last()));
+ msgBox->show();
+}
+
} // end namespace
diff --git a/src/gui/owncloudgui.h b/src/gui/owncloudgui.h
index d1b60ae0e..4918c4126 100644
--- a/src/gui/owncloudgui.h
+++ b/src/gui/owncloudgui.h
@@ -37,6 +37,11 @@ class Application;
class LogBrowser;
class AccountState;
+enum class ShareDialogStartPage {
+ UsersAndGroups,
+ PublicLinks,
+};
+
/**
* @brief The ownCloudGui class
* @ingroup gui
@@ -93,7 +98,7 @@ public slots:
* localPath is the absolute local path to it (so not relative
* to the folder).
*/
- void slotShowShareDialog(const QString &sharePath, const QString &localPath);
+ void slotShowShareDialog(const QString &sharePath, const QString &localPath, ShareDialogStartPage startPage);
void slotRemoveDestroyedShareDialogs();
@@ -103,6 +108,7 @@ private slots:
void slotUnpauseAllFolders();
void slotPauseAllFolders();
void slotNewAccountWizard();
+ void slotAbout();
private:
void setPauseOnAllFoldersHelper(bool pause);
@@ -119,14 +125,19 @@ private:
// tray's menu
QScopedPointer<QMenu> _contextMenu;
- // Manually tracking whether the context menu is visible, but only works
- // on OSX because aboutToHide is not reliable everywhere.
- bool _contextMenuVisibleOsx;
+ // Manually tracking whether the context menu is visible via aboutToShow
+ // and aboutToHide. Unfortunately aboutToHide isn't reliable everywhere
+ // so this only gets used with _workaroundManualVisibility (when the tray's
+ // isVisible() is unreliable)
+ bool _contextMenuVisibleManual = false;
QMenu *_recentActionsMenu;
QVector<QMenu *> _accountMenus;
- bool _qdbusmenuWorkaround;
- QTimer _workaroundBatchTrayUpdate;
+ bool _workaroundShowAndHideTray = false;
+ bool _workaroundNoAboutToShowUpdate = false;
+ bool _workaroundFakeDoubleClick = false;
+ bool _workaroundManualVisibility = false;
+ QTimer _delayedTrayUpdateTimer;
QMap<QString, QPointer<ShareDialog>> _shareDialogs;
QAction *_actionLogin;
@@ -138,6 +149,7 @@ private:
QAction *_actionEstimate;
QAction *_actionRecent;
QAction *_actionHelp;
+ QAction *_actionAbout;
QAction *_actionQuit;
QAction *_actionCrash;
diff --git a/src/gui/owncloudsetupwizard.cpp b/src/gui/owncloudsetupwizard.cpp
index a1632fc3f..e11baba59 100644
--- a/src/gui/owncloudsetupwizard.cpp
+++ b/src/gui/owncloudsetupwizard.cpp
@@ -57,7 +57,6 @@ OwncloudSetupWizard::OwncloudSetupWizard(QObject *parent)
connect(_ocWizard, &OwncloudWizard::basicSetupFinished,
this, &OwncloudSetupWizard::slotAssistantFinished, Qt::QueuedConnection);
connect(_ocWizard, &QDialog::finished, this, &QObject::deleteLater);
- connect(_ocWizard, &OwncloudWizard::skipFolderConfiguration, this, &OwncloudSetupWizard::slotSkipFolderConfiguration);
}
OwncloudSetupWizard::~OwncloudSetupWizard()
@@ -597,15 +596,12 @@ bool OwncloudSetupWizard::ensureStartFromScratch(const QString &localFolder)
// Method executed when the user end has finished the basic setup.
void OwncloudSetupWizard::slotAssistantFinished(int result)
{
- FolderMan *folderMan = FolderMan::instance();
-
if (result == QDialog::Rejected) {
- qCInfo(lcWizard) << "Rejected the new config, use the old!";
-
- } else if (result == QDialog::Accepted) {
- // This may or may not wipe all folder definitions, depending
- // on whether a new account is activated or the existing one
- // is changed.
+ // Wizard was cancelled
+ } else if (_ocWizard->manualFolderConfig()) {
+ applyAccountChanges();
+ } else {
+ FolderMan *folderMan = FolderMan::instance();
auto account = applyAccountChanges();
QString localFolder = FolderDefinition::prepareLocalPath(_ocWizard->localFolder());
@@ -617,6 +613,7 @@ void OwncloudSetupWizard::slotAssistantFinished(int result)
folderDefinition.localPath = localFolder;
folderDefinition.targetPath = FolderDefinition::prepareTargetPath(_remoteFolder);
folderDefinition.ignoreHiddenFiles = folderMan->ignoreHiddenFiles();
+ folderDefinition.useVirtualFiles = _ocWizard->useVirtualFileSync();
if (folderMan->navigationPaneHelper().showInExplorerNavigationPane())
folderDefinition.navigationPaneClsid = QUuid::createUuid();
@@ -638,16 +635,6 @@ void OwncloudSetupWizard::slotAssistantFinished(int result)
emit ownCloudWizardDone(result);
}
-void OwncloudSetupWizard::slotSkipFolderConfiguration()
-{
- applyAccountChanges();
-
- disconnect(_ocWizard, &OwncloudWizard::basicSetupFinished,
- this, &OwncloudSetupWizard::slotAssistantFinished);
- _ocWizard->close();
- emit ownCloudWizardDone(QDialog::Accepted);
-}
-
AccountState *OwncloudSetupWizard::applyAccountChanges()
{
AccountPtr newAccount = _ocWizard->account();
diff --git a/src/gui/owncloudsetupwizard.h b/src/gui/owncloudsetupwizard.h
index a663af761..cacac83e5 100644
--- a/src/gui/owncloudsetupwizard.h
+++ b/src/gui/owncloudsetupwizard.h
@@ -67,7 +67,6 @@ private slots:
void slotRemoteFolderExists(QNetworkReply *);
void slotCreateRemoteFolderFinished(QNetworkReply::NetworkError);
void slotAssistantFinished(int);
- void slotSkipFolderConfiguration();
private:
explicit OwncloudSetupWizard(QObject *parent = 0);
diff --git a/src/gui/protocolwidget.cpp b/src/gui/protocolwidget.cpp
index 8a8dc5d8a..93a825115 100644
--- a/src/gui/protocolwidget.cpp
+++ b/src/gui/protocolwidget.cpp
@@ -32,6 +32,8 @@
#include <climits>
+Q_DECLARE_METATYPE(OCC::ProtocolItem::ExtraData)
+
namespace OCC {
QString ProtocolItem::timeString(QDateTime dt, QLocale::FormatType format)
@@ -43,54 +45,14 @@ QString ProtocolItem::timeString(QDateTime dt, QLocale::FormatType format)
return loc.toString(dt, dtFormat);
}
-QString ProtocolItem::folderName(const QTreeWidgetItem *item)
-{
- return item->data(2, Qt::UserRole).toString();
-}
-
-void ProtocolItem::setFolderName(QTreeWidgetItem *item, const QString &folderName)
-{
- item->setData(2, Qt::UserRole, folderName);
-}
-
-QString ProtocolItem::filePath(const QTreeWidgetItem *item)
-{
- return item->toolTip(1);
-}
-
-void ProtocolItem::setFilePath(QTreeWidgetItem *item, const QString &filePath)
-{
- item->setToolTip(1, filePath);
-}
-
-QDateTime ProtocolItem::timestamp(const QTreeWidgetItem *item)
-{
- return item->data(0, Qt::UserRole).toDateTime();
-}
-
-void ProtocolItem::setTimestamp(QTreeWidgetItem *item, const QDateTime &timestamp)
-{
- item->setData(0, Qt::UserRole, timestamp);
-}
-
-SyncFileItem::Status ProtocolItem::status(const QTreeWidgetItem *item)
-{
- return static_cast<SyncFileItem::Status>(item->data(3, Qt::UserRole).toInt());
-}
-
-void ProtocolItem::setStatus(QTreeWidgetItem *item, SyncFileItem::Status status)
-{
- item->setData(3, Qt::UserRole, status);
-}
-
-quint64 ProtocolItem::size(const QTreeWidgetItem *item)
+ProtocolItem::ExtraData ProtocolItem::extraData(const QTreeWidgetItem *item)
{
- return item->data(4, Qt::UserRole).toULongLong();
+ return item->data(0, Qt::UserRole).value<ExtraData>();
}
-void ProtocolItem::setSize(QTreeWidgetItem *item, quint64 size)
+void ProtocolItem::setExtraData(QTreeWidgetItem *item, const ExtraData &data)
{
- item->setData(4, Qt::UserRole, size);
+ item->setData(0, Qt::UserRole, QVariant::fromValue(data));
}
ProtocolItem *ProtocolItem::create(const QString &folder, const SyncFileItem &item)
@@ -136,12 +98,16 @@ ProtocolItem *ProtocolItem::create(const QString &folder, const SyncFileItem &it
twitem->setData(0, Qt::SizeHintRole, QSize(0, ActivityItemDelegate::rowHeight()));
twitem->setIcon(0, icon);
twitem->setToolTip(0, longTimeStr);
+ twitem->setToolTip(1, item._file);
twitem->setToolTip(3, message);
- setTimestamp(twitem, timestamp);
- setFilePath(twitem, item._file); // also sets toolTip(1)
- setFolderName(twitem, folder);
- setStatus(twitem, item._status);
- setSize(twitem, item._size);
+ ProtocolItem::ExtraData data;
+ data.timestamp = timestamp;
+ data.path = item._file;
+ data.folderName = folder;
+ data.status = item._status;
+ data.size = item._size;
+ data.direction = item._direction;
+ ProtocolItem::setExtraData(twitem, data);
return twitem;
}
@@ -151,13 +117,13 @@ SyncJournalFileRecord ProtocolItem::syncJournalRecord(QTreeWidgetItem *item)
auto f = folder(item);
if (!f)
return rec;
- f->journalDb()->getFileRecord(filePath(item), &rec);
+ f->journalDb()->getFileRecord(extraData(item).path, &rec);
return rec;
}
Folder *ProtocolItem::folder(QTreeWidgetItem *item)
{
- return FolderMan::instance()->folder(folderName(item));
+ return FolderMan::instance()->folder(extraData(item).folderName);
}
void ProtocolItem::openContextMenu(QPoint globalPos, QTreeWidgetItem *item, QWidget *parent)
@@ -175,7 +141,7 @@ void ProtocolItem::openContextMenu(QPoint globalPos, QTreeWidgetItem *item, QWid
// "Open in Browser" action
auto openInBrowser = menu->addAction(ProtocolWidget::tr("Open in browser"));
QObject::connect(openInBrowser, &QAction::triggered, parent, [parent, account, rec]() {
- fetchPrivateLinkUrl(account, rec._path, rec.numericFileId(), parent,
+ fetchPrivateLinkUrl(account, rec._path, rec.legacyDeriveNumericFileId(), parent,
[parent](const QString &url) {
Utility::openBrowser(url, parent);
});
@@ -199,10 +165,10 @@ bool ProtocolItem::operator<(const QTreeWidgetItem &other) const
if (column == 0) {
// Items with empty "File" column are larger than others,
// otherwise sort by time (this uses lexicographic ordering)
- return std::forward_as_tuple(text(1).isEmpty(), timestamp(this))
- < std::forward_as_tuple(other.text(1).isEmpty(), timestamp(&other));
+ return std::forward_as_tuple(text(1).isEmpty(), extraData(this).timestamp)
+ < std::forward_as_tuple(other.text(1).isEmpty(), extraData(&other).timestamp);
} else if (column == 4) {
- return size(this) < size(&other);
+ return extraData(this).size < extraData(&other).size;
}
return QTreeWidgetItem::operator<(other);
diff --git a/src/gui/protocolwidget.h b/src/gui/protocolwidget.h
index d8612634d..33244ad33 100644
--- a/src/gui/protocolwidget.h
+++ b/src/gui/protocolwidget.h
@@ -49,17 +49,24 @@ public:
static ProtocolItem *create(const QString &folder, const SyncFileItem &item);
static QString timeString(QDateTime dt, QLocale::FormatType format = QLocale::NarrowFormat);
- // accessors for extra data stored in the item
- static QString folderName(const QTreeWidgetItem *item);
- static void setFolderName(QTreeWidgetItem *item, const QString &folderName);
- static QString filePath(const QTreeWidgetItem *item);
- static void setFilePath(QTreeWidgetItem *item, const QString &filePath);
- static QDateTime timestamp(const QTreeWidgetItem *item);
- static void setTimestamp(QTreeWidgetItem *item, const QDateTime &timestamp);
- static SyncFileItem::Status status(const QTreeWidgetItem *item);
- static void setStatus(QTreeWidgetItem *item, SyncFileItem::Status status);
- static quint64 size(const QTreeWidgetItem *item);
- static void setSize(QTreeWidgetItem *item, quint64 size);
+ struct ExtraData
+ {
+ ExtraData()
+ : status(SyncFileItem::NoStatus)
+ , direction(SyncFileItem::None)
+ {
+ }
+
+ QString path;
+ QString folderName;
+ QDateTime timestamp;
+ quint64 size = 0;
+ SyncFileItem::Status status BITFIELD(4);
+ SyncFileItem::Direction direction BITFIELD(3);
+ };
+
+ static ExtraData extraData(const QTreeWidgetItem *item);
+ static void setExtraData(QTreeWidgetItem *item, const ExtraData &data);
static SyncJournalFileRecord syncJournalRecord(QTreeWidgetItem *item);
static Folder *folder(QTreeWidgetItem *item);
diff --git a/src/gui/selectivesyncdialog.cpp b/src/gui/selectivesyncdialog.cpp
index 961894c08..92afbce5d 100644
--- a/src/gui/selectivesyncdialog.cpp
+++ b/src/gui/selectivesyncdialog.cpp
@@ -492,6 +492,8 @@ void SelectiveSyncDialog::accept()
foreach (const auto &it, changes) {
_folder->journalDb()->avoidReadFromDbOnNextSync(it);
}
+ // Also make sure we see the local file that had been ignored before
+ _folder->slotNextSyncFullLocalDiscovery();
folderMan->scheduleFolder(_folder);
}
diff --git a/src/gui/servernotificationhandler.cpp b/src/gui/servernotificationhandler.cpp
index 72b65b296..fdf7b4dbf 100644
--- a/src/gui/servernotificationhandler.cpp
+++ b/src/gui/servernotificationhandler.cpp
@@ -101,7 +101,7 @@ void ServerNotificationHandler::slotNotificationsReceived(const QJsonDocument &j
// https://github.com/owncloud/notifications/blob/master/docs/ocs-endpoint-v1.md#deleting-a-notification-for-a-user
ActivityLink al;
al._label = tr("Dismiss");
- al._link = Utility::concatUrlPath(ai->account()->url(), notificationsPath + "/" + json.value("notification_id").toString()).toString();
+ al._link = Utility::concatUrlPath(ai->account()->url(), notificationsPath + "/" + QString::number(a._id)).toString();
al._verb = "DELETE";
al._isPrimary = false;
a._links.append(al);
diff --git a/src/gui/settingsdialog.cpp b/src/gui/settingsdialog.cpp
index 1eaf38fd2..a6e5de234 100644
--- a/src/gui/settingsdialog.cpp
+++ b/src/gui/settingsdialog.cpp
@@ -229,6 +229,7 @@ void SettingsDialog::accountAdded(AccountState *s)
_actionGroup->addAction(accountAction);
_actionGroupWidgets.insert(accountAction, accountSettings);
_actionForAccount.insert(s->account().data(), accountAction);
+ accountAction->trigger();
connect(accountSettings, &AccountSettings::folderChanged, _gui, &ownCloudGui::slotFoldersChanged);
connect(accountSettings, &AccountSettings::openFolderAlias,
@@ -237,6 +238,9 @@ void SettingsDialog::accountAdded(AccountState *s)
connect(s->account().data(), &Account::accountChangedAvatar, this, &SettingsDialog::slotAccountAvatarChanged);
connect(s->account().data(), &Account::accountChangedDisplayName, this, &SettingsDialog::slotAccountDisplayNameChanged);
+ // Refresh immediatly when getting online
+ connect(s, &AccountState::isConnectedChanged, this, &SettingsDialog::slotRefreshActivityAccountStateSender);
+
slotRefreshActivity(s);
}
@@ -379,6 +383,11 @@ QAction *SettingsDialog::createColorAwareAction(const QString &iconPath, const Q
return createActionWithIcon(coloredIcon, text, iconPath);
}
+void SettingsDialog::slotRefreshActivityAccountStateSender()
+{
+ slotRefreshActivity(qobject_cast<AccountState*>(sender()));
+}
+
void SettingsDialog::slotRefreshActivity(AccountState *accountState)
{
if (accountState) {
diff --git a/src/gui/settingsdialog.h b/src/gui/settingsdialog.h
index 60c72dec7..37ff29da8 100644
--- a/src/gui/settingsdialog.h
+++ b/src/gui/settingsdialog.h
@@ -59,6 +59,7 @@ public slots:
void showIssuesList(const QString &folderAlias);
void slotSwitchPage(QAction *action);
void slotRefreshActivity(AccountState *accountState);
+ void slotRefreshActivityAccountStateSender();
void slotAccountAvatarChanged();
void slotAccountDisplayNameChanged();
diff --git a/src/gui/settingsdialogmac.cpp b/src/gui/settingsdialogmac.cpp
index 0e117779b..f07f4fc7e 100644
--- a/src/gui/settingsdialogmac.cpp
+++ b/src/gui/settingsdialogmac.cpp
@@ -21,6 +21,7 @@
#include "generalsettings.h"
#include "networksettings.h"
#include "accountsettings.h"
+#include "accountstate.h"
#include "creds/abstractcredentials.h"
#include "configfile.h"
#include "progressdispatcher.h"
@@ -121,6 +122,7 @@ SettingsDialogMac::SettingsDialogMac(ownCloudGui *gui, QWidget *parent)
ConfigFile cfg;
cfg.restoreGeometry(this);
+ _activitySettings->setNotificationRefreshInterval(cfg.notificationRefreshInterval());
}
void SettingsDialogMac::closeEvent(QCloseEvent *event)
@@ -160,7 +162,11 @@ void SettingsDialogMac::accountAdded(AccountState *s)
connect(s->account().data(), &Account::accountChangedAvatar, this, &SettingsDialogMac::slotAccountAvatarChanged);
connect(s->account().data(), &Account::accountChangedDisplayName, this, &SettingsDialogMac::slotAccountDisplayNameChanged);
+ // Refresh immediatly when getting online
+ connect(s, &AccountState::isConnectedChanged, this, &SettingsDialogMac::slotRefreshActivityAccountStateSender);
+
slotRefreshActivity(s);
+ setCurrentPanelIndex(0);
}
void SettingsDialogMac::accountRemoved(AccountState *s)
@@ -175,6 +181,11 @@ void SettingsDialogMac::accountRemoved(AccountState *s)
_activitySettings->slotRemoveAccount(s);
}
+void SettingsDialogMac::slotRefreshActivityAccountStateSender()
+{
+ slotRefreshActivity(qobject_cast<AccountState*>(sender()));
+}
+
void SettingsDialogMac::slotRefreshActivity(AccountState *accountState)
{
if (accountState) {
diff --git a/src/gui/settingsdialogmac.h b/src/gui/settingsdialogmac.h
index 5b4f412b8..f3f82cd35 100644
--- a/src/gui/settingsdialogmac.h
+++ b/src/gui/settingsdialogmac.h
@@ -49,6 +49,7 @@ public slots:
void showActivityPage();
void showIssuesList(const QString &folderAlias);
void slotRefreshActivity(AccountState *accountState);
+ void slotRefreshActivityAccountStateSender();
private slots:
void accountAdded(AccountState *);
diff --git a/src/gui/sharedialog.cpp b/src/gui/sharedialog.cpp
index 5c070a125..7bad3743d 100644
--- a/src/gui/sharedialog.cpp
+++ b/src/gui/sharedialog.cpp
@@ -39,6 +39,7 @@ ShareDialog::ShareDialog(QPointer<AccountState> accountState,
const QString &localPath,
SharePermissions maxSharingPermissions,
const QByteArray &numericFileId,
+ ShareDialogStartPage startPage,
QWidget *parent)
: QDialog(parent)
, _ui(new Ui::ShareDialog)
@@ -47,6 +48,7 @@ ShareDialog::ShareDialog(QPointer<AccountState> accountState,
, _localPath(localPath)
, _maxSharingPermissions(maxSharingPermissions)
, _privateLinkUrl(accountState->account()->deprecatedPrivateLinkUrl(numericFileId).toString(QUrl::FullyEncoded))
+ , _startPage(startPage)
, _linkWidget(NULL)
, _userGroupWidget(NULL)
, _progressIndicator(NULL)
@@ -79,8 +81,7 @@ ShareDialog::ShareDialog(QPointer<AccountState> accountState,
}
// Set filename
- QFileInfo lPath(_localPath);
- QString fileName = lPath.fileName();
+ QString fileName = QFileInfo(_sharePath).fileName();
_ui->label_name->setText(tr("%1").arg(fileName));
QFont f(_ui->label_name->font());
f.setPointSize(f.pointSize() * 1.4);
@@ -113,6 +114,7 @@ ShareDialog::ShareDialog(QPointer<AccountState> accountState,
label->setWordWrap(true);
label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
layout()->replaceWidget(_ui->shareWidgets, label);
+ _ui->shareWidgets->hide();
return;
}
@@ -217,6 +219,9 @@ void ShareDialog::showSharingUi()
_linkWidget->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
_ui->shareWidgets->addTab(_linkWidget, tr("Public Links"));
_linkWidget->getShares();
+
+ if (_startPage == ShareDialogStartPage::PublicLinks)
+ _ui->shareWidgets->setCurrentWidget(_linkWidget);
}
}
diff --git a/src/gui/sharedialog.h b/src/gui/sharedialog.h
index 8af3f3fff..7aa93cfde 100644
--- a/src/gui/sharedialog.h
+++ b/src/gui/sharedialog.h
@@ -17,6 +17,7 @@
#include "accountstate.h"
#include "sharepermissions.h"
+#include "owncloudgui.h"
#include <QPointer>
#include <QString>
@@ -44,6 +45,7 @@ public:
const QString &localPath,
SharePermissions maxSharingPermissions,
const QByteArray &numericFileId,
+ ShareDialogStartPage startPage,
QWidget *parent = 0);
~ShareDialog();
@@ -64,6 +66,7 @@ private:
SharePermissions _maxSharingPermissions;
QByteArray _numericFileId;
QString _privateLinkUrl;
+ ShareDialogStartPage _startPage;
ShareLinkWidget *_linkWidget;
ShareUserGroupWidget *_userGroupWidget;
diff --git a/src/gui/sharelinkwidget.cpp b/src/gui/sharelinkwidget.cpp
index 0d938bd3d..219f4270c 100644
--- a/src/gui/sharelinkwidget.cpp
+++ b/src/gui/sharelinkwidget.cpp
@@ -197,20 +197,23 @@ void ShareLinkWidget::slotSharesFetched(const QList<QSharedPointer<Share>> &shar
const QString versionString = _account->serverVersion();
qCInfo(lcSharing) << versionString << "Fetched" << shares.count() << "shares";
- // Preserve the previous selection
- QString selectedShareId;
- if (auto share = selectedShare()) {
- selectedShareId = share->getId();
- }
- // ...except if selection should move to a new share
+ // Select the share that was previously selected,
+ // except if an explicit override was asked for
+ QString reselectShareId = _selectedShareId;
if (!_newShareOverrideSelectionId.isEmpty()) {
- selectedShareId = _newShareOverrideSelectionId;
+ reselectShareId = _newShareOverrideSelectionId;
_newShareOverrideSelectionId.clear();
}
auto table = _ui->linkShares;
+
+ // Wipe the table without updating the ui elements, we
+ // might want their state untouched if the same share ends
+ // up being selected
+ disconnect(table, &QTableWidget::itemSelectionChanged, this, &ShareLinkWidget::slotShareSelectionChanged);
table->clearContents();
table->setRowCount(0);
+ connect(table, &QTableWidget::itemSelectionChanged, this, &ShareLinkWidget::slotShareSelectionChanged);
auto deleteIcon = QIcon::fromTheme(QLatin1String("user-trash"),
QIcon(QLatin1String(":/client/resources/delete.png")));
@@ -256,14 +259,20 @@ void ShareLinkWidget::slotSharesFetched(const QList<QSharedPointer<Share>> &shar
table->setCellWidget(row, 2, deleteButton);
// Reestablish the previous selection
- if (selectedShareId == share->getId()) {
+ if (reselectShareId == share->getId()) {
table->selectRow(row);
}
}
- // Select the first share by default
- if (!selectedShare() && table->rowCount() != 0) {
- table->selectRow(0);
+ if (!selectedShare()) {
+ if (table->rowCount() != 0) {
+ // Select the first share by default
+ table->selectRow(0);
+ } else {
+ // explicitly note the deselection,
+ // since this was not triggered on table clear above
+ slotShareSelectionChanged();
+ }
}
if (!_namesSupported) {
@@ -283,6 +292,7 @@ void ShareLinkWidget::slotShareSelectionChanged()
auto share = selectedShare();
if (!share) {
+ _selectedShareId.clear();
_ui->shareProperties->setEnabled(false);
_ui->radio_readOnly->setChecked(false);
_ui->radio_readWrite->setChecked(false);
@@ -291,6 +301,8 @@ void ShareLinkWidget::slotShareSelectionChanged()
_ui->checkBox_password->setChecked(false);
return;
}
+ bool selectionUnchanged = _selectedShareId == share->getId();
+ _selectedShareId = share->getId();
_ui->shareProperties->setEnabled(true);
@@ -304,17 +316,17 @@ void ShareLinkWidget::slotShareSelectionChanged()
// Password state
_ui->checkBox_password->setText(tr("P&assword protect"));
- if (share->isPasswordSet()) {
- _ui->checkBox_password->setChecked(true);
- _ui->lineEdit_password->setEnabled(true);
- _ui->lineEdit_password->setPlaceholderText("********");
+ if (!selectionUnchanged) {
+ if (share->isPasswordSet()) {
+ _ui->checkBox_password->setChecked(true);
+ _ui->lineEdit_password->setPlaceholderText("********");
+ _ui->lineEdit_password->setEnabled(true);
+ } else {
+ _ui->checkBox_password->setChecked(false);
+ _ui->lineEdit_password->setPlaceholderText(QString());
+ _ui->lineEdit_password->setEnabled(false);
+ }
_ui->lineEdit_password->setText(QString());
- _ui->lineEdit_password->setEnabled(true);
- _ui->pushButton_setPassword->setEnabled(false);
- } else {
- _ui->checkBox_password->setChecked(false);
- _ui->lineEdit_password->setPlaceholderText(QString());
- _ui->lineEdit_password->setEnabled(false);
_ui->pushButton_setPassword->setEnabled(false);
}
@@ -420,14 +432,27 @@ void ShareLinkWidget::setPassword(const QString &password)
void ShareLinkWidget::slotPasswordSet()
{
+ auto share = selectedShare();
+ if (sender() != share.data())
+ return;
+
_pi_password->stopAnimation();
+ _ui->checkBox_password->setEnabled(true);
_ui->lineEdit_password->setText(QString());
- _ui->lineEdit_password->setPlaceholderText(tr("Password Protected"));
+ if (share->isPasswordSet()) {
+ _ui->lineEdit_password->setPlaceholderText("********");
+ _ui->lineEdit_password->setEnabled(true);
+ } else {
+ _ui->lineEdit_password->setPlaceholderText(QString());
+ _ui->lineEdit_password->setEnabled(false);
+ }
/*
* When setting/deleting a password from a share the old share is
* deleted and a new one is created. So we need to refetch the shares
* at this point.
+ *
+ * NOTE: I don't see this happening with oC > 10
*/
getShares();
}
@@ -514,7 +539,7 @@ void ShareLinkWidget::emailShareLink(const QUrl &url)
{
QString fileName = _sharePath.mid(_sharePath.lastIndexOf('/') + 1);
Utility::openEmailComposer(
- QString("I shared %1 with you").arg(fileName),
+ tr("I shared %1 with you").arg(fileName),
url.toString(),
this);
}
diff --git a/src/gui/sharelinkwidget.h b/src/gui/sharelinkwidget.h
index 30188a34b..365c596b7 100644
--- a/src/gui/sharelinkwidget.h
+++ b/src/gui/sharelinkwidget.h
@@ -122,6 +122,11 @@ private:
bool _expiryRequired;
bool _namesSupported;
+ // For maintaining the selection and temporary ui state
+ // when getShares() finishes, but the selection didn't
+ // change.
+ QString _selectedShareId;
+
// When a new share is created, we want to select it
// the next time getShares() finishes. This stores its id.
QString _newShareOverrideSelectionId;
diff --git a/src/gui/sharelinkwidget.ui b/src/gui/sharelinkwidget.ui
index ef321bfaf..5c4b2e648 100644
--- a/src/gui/sharelinkwidget.ui
+++ b/src/gui/sharelinkwidget.ui
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>394</width>
- <height>534</height>
+ <width>441</width>
+ <height>568</height>
</rect>
</property>
<property name="windowTitle">
@@ -94,7 +94,7 @@
<property name="bottomMargin">
<number>0</number>
</property>
- <item row="7" column="0">
+ <item row="6" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_expire">
<property name="leftMargin">
<number>0</number>
@@ -115,7 +115,7 @@
</item>
</layout>
</item>
- <item row="5" column="0">
+ <item row="4" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>20</number>
@@ -142,7 +142,7 @@
</item>
</layout>
</item>
- <item row="4" column="0">
+ <item row="3" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_password">
<item>
<widget class="QCheckBox" name="checkBox_password">
@@ -173,13 +173,6 @@
</layout>
</item>
<item row="2" column="0">
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Link properties:</string>
- </property>
- </widget>
- </item>
- <item row="3" column="0">
<widget class="QWidget" name="widget_editing" native="true">
<layout class="QGridLayout" name="layout_editing">
<property name="leftMargin">
@@ -203,7 +196,7 @@
</sizepolicy>
</property>
<property name="text">
- <string>Users can view and download contents.</string>
+ <string>Recipients can view or download contents.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
@@ -252,14 +245,14 @@
<item row="0" column="0">
<widget class="QRadioButton" name="radio_readOnly">
<property name="text">
- <string>Read only</string>
+ <string>Download / View</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QRadioButton" name="radio_readWrite">
<property name="text">
- <string>Read &amp;&amp; Write</string>
+ <string>Download / View / Upload</string>
</property>
</widget>
</item>
@@ -272,7 +265,7 @@
</sizepolicy>
</property>
<property name="text">
- <string>Users can view, download, edit and upload contents.</string>
+ <string>Recipients can view, download, edit, delete and upload contents.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
diff --git a/src/gui/sharemanager.cpp b/src/gui/sharemanager.cpp
index 004f5d7c4..4bc32182a 100644
--- a/src/gui/sharemanager.cpp
+++ b/src/gui/sharemanager.cpp
@@ -207,7 +207,7 @@ void LinkShare::setPassword(const QString &password)
void LinkShare::slotPasswordSet(const QJsonDocument &, const QVariant &value)
{
- _passwordSet = value.toString() == "";
+ _passwordSet = value.toString() != "";
emit passwordSet();
}
@@ -289,7 +289,7 @@ void ShareManager::slotLinkShareCreated(const QJsonDocument &reply)
void ShareManager::createShare(const QString &path,
const Share::ShareType shareType,
const QString shareWith,
- const Share::Permissions permissions)
+ const Share::Permissions desiredPermissions)
{
auto job = new OcsShareJob(_account);
connect(job, &OcsJob::ocsError, this, &ShareManager::slotOcsError);
@@ -305,17 +305,18 @@ void ShareManager::createShare(const QString &path,
// Limit the permissions we request for a share to the ones the item
// was shared with initially.
- auto perm = permissions;
- if (permissions == SharePermissionDefault) {
- perm = existingPermissions;
- } else if (existingPermissions != SharePermissionDefault) {
- perm &= existingPermissions;
+ auto validPermissions = desiredPermissions;
+ if (validPermissions == SharePermissionDefault) {
+ validPermissions = existingPermissions;
+ }
+ if (existingPermissions != SharePermissionDefault) {
+ validPermissions &= existingPermissions;
}
OcsShareJob *job = new OcsShareJob(_account);
connect(job, &OcsShareJob::shareJobFinished, this, &ShareManager::slotShareCreated);
connect(job, &OcsJob::ocsError, this, &ShareManager::slotOcsError);
- job->createShare(path, shareType, shareWith, permissions);
+ job->createShare(path, shareType, shareWith, validPermissions);
});
job->getSharedWithMe();
}
diff --git a/src/gui/shareusergroupwidget.cpp b/src/gui/shareusergroupwidget.cpp
index 1bbaf2c69..69336f013 100644
--- a/src/gui/shareusergroupwidget.cpp
+++ b/src/gui/shareusergroupwidget.cpp
@@ -381,7 +381,7 @@ ShareUserLine::ShareUserLine(QSharedPointer<Share> share,
_ui->permissionToolButton->setMenu(menu);
_ui->permissionToolButton->setPopupMode(QToolButton::InstantPopup);
- QIcon icon(QLatin1String(":/client/resources/more.png"));
+ QIcon icon(QLatin1String(":/client/resources/more.svg"));
_ui->permissionToolButton->setIcon(icon);
// If there's only a single entry in the detailed permission menu, hide it
diff --git a/src/gui/socketapi.cpp b/src/gui/socketapi.cpp
index 85df1e38d..d6a08aae8 100644
--- a/src/gui/socketapi.cpp
+++ b/src/gui/socketapi.cpp
@@ -32,6 +32,9 @@
#include "capabilities.h"
#include "common/asserts.h"
#include "guiutility.h"
+#ifndef OWNCLOUD_TEST
+#include "sharemanager.h"
+#endif
#include <array>
#include <QBitArray>
@@ -45,6 +48,7 @@
#include <QApplication>
#include <QLocalSocket>
#include <QStringBuilder>
+#include <QMessageBox>
#include <QClipboard>
@@ -82,6 +86,7 @@ static QString buildMessage(const QString &verb, const QString &path, const QStr
namespace OCC {
Q_LOGGING_CATEGORY(lcSocketApi, "gui.socketapi", QtInfoMsg)
+Q_LOGGING_CATEGORY(lcPublicLink, "gui.socketapi.publiclink", QtInfoMsg)
class BloomFilter
{
@@ -181,6 +186,10 @@ SocketApi::SocketApi(QObject *parent)
// Example for developer builds (with ad-hoc signing identity): "" "com.owncloud.desktopclient" ".socketApi"
// Example for official signed packages: "9B5WD74GWJ." "com.owncloud.desktopclient" ".socketApi"
socketPath = SOCKETAPI_TEAM_IDENTIFIER_PREFIX APPLICATION_REV_DOMAIN ".socketApi";
+#ifdef Q_OS_MAC
+ // Tell Finder to use the Extension (checking it from System Preferences -> Extensions)
+ system("pluginkit -e use -i " APPLICATION_REV_DOMAIN ".FinderSyncExt &");
+#endif
} else if (Utility::isLinux() || Utility::isBSD()) {
QString runtimeDir;
runtimeDir = QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation);
@@ -218,10 +227,17 @@ SocketApi::~SocketApi()
// All remaining sockets will be destroyed with _localServer, their parent
ASSERT(_listeners.isEmpty() || _listeners.first().socket->parent() == &_localServer);
_listeners.clear();
+
+#ifdef Q_OS_MAC
+ // Unload the extension (uncheck from System Preferences -> Extensions)
+ system("pluginkit -e ignore -i " APPLICATION_REV_DOMAIN ".FinderSyncExt &");
+#endif
}
void SocketApi::slotNewConnection()
{
+ // Note that on macOS this is not actually a line-based QIODevice, it's a SocketApiSocket which is our
+ // custom message based macOS IPC.
QIODevice *socket = _localServer.nextPendingConnection();
if (!socket) {
@@ -341,6 +357,47 @@ void SocketApi::broadcastMessage(const QString &msg, bool doWait)
}
}
+void SocketApi::processShareRequest(const QString &localFile, SocketListener *listener, ShareDialogStartPage startPage)
+{
+ auto theme = Theme::instance();
+
+ auto fileData = FileData::get(localFile);
+ auto shareFolder = fileData.folder;
+ if (!shareFolder) {
+ const QString message = QLatin1String("SHARE:NOP:") + QDir::toNativeSeparators(localFile);
+ // files that are not within a sync folder are not synced.
+ listener->sendMessage(message);
+ } else if (!shareFolder->accountState()->isConnected()) {
+ const QString message = QLatin1String("SHARE:NOTCONNECTED:") + QDir::toNativeSeparators(localFile);
+ // if the folder isn't connected, don't open the share dialog
+ listener->sendMessage(message);
+ } else if (!theme->linkSharing() && (!theme->userGroupSharing() || shareFolder->accountState()->account()->serverVersionInt() < Account::makeServerVersion(8, 2, 0))) {
+ const QString message = QLatin1String("SHARE:NOP:") + QDir::toNativeSeparators(localFile);
+ listener->sendMessage(message);
+ } else {
+ // If the file doesn't have a journal record, it might not be uploaded yet
+ if (!fileData.journalRecord().isValid()) {
+ const QString message = QLatin1String("SHARE:NOTSYNCED:") + QDir::toNativeSeparators(localFile);
+ listener->sendMessage(message);
+ return;
+ }
+
+ auto &remotePath = fileData.serverRelativePath;
+
+ // Can't share root folder
+ if (remotePath == "/") {
+ const QString message = QLatin1String("SHARE:CANNOTSHAREROOT:") + QDir::toNativeSeparators(localFile);
+ listener->sendMessage(message);
+ return;
+ }
+
+ const QString message = QLatin1String("SHARE:OK:") + QDir::toNativeSeparators(localFile);
+ listener->sendMessage(message);
+
+ emit shareCommandReceived(remotePath, fileData.localPath, startPage);
+ }
+}
+
void SocketApi::broadcastStatusPushMessage(const QString &systemPath, SyncFileStatus fileStatus)
{
QString msg = buildMessage(QLatin1String("STATUS"), systemPath, fileStatus.toSocketAPIString());
@@ -361,23 +418,17 @@ void SocketApi::command_RETRIEVE_FILE_STATUS(const QString &argument, SocketList
{
QString statusString;
- Folder *syncFolder = FolderMan::instance()->folderForPath(argument);
- if (!syncFolder) {
+ auto fileData = FileData::get(argument);
+ if (!fileData.folder) {
// this can happen in offline mode e.g.: nothing to worry about
statusString = QLatin1String("NOP");
} else {
- QString systemPath = QDir::cleanPath(argument);
- if (systemPath.endsWith(QLatin1Char('/'))) {
- systemPath.truncate(systemPath.length() - 1);
- qCWarning(lcSocketApi) << "Removed trailing slash for directory: " << systemPath << "Status pushes won't have one.";
- }
// The user probably visited this directory in the file shell.
// Let the listener know that it should now send status pushes for sibblings of this file.
- QString directory = systemPath.left(systemPath.lastIndexOf('/'));
+ QString directory = fileData.localPath.left(fileData.localPath.lastIndexOf('/'));
listener->registerMonitoredDirectory(qHash(directory));
- QString relativePath = systemPath.mid(syncFolder->cleanPath().length() + 1);
- SyncFileStatus fileStatus = syncFolder->syncEngine().syncFileStatusTracker().fileStatus(relativePath);
+ SyncFileStatus fileStatus = fileData.syncFileStatus();
statusString = fileStatus.toSocketAPIString();
}
@@ -387,46 +438,12 @@ void SocketApi::command_RETRIEVE_FILE_STATUS(const QString &argument, SocketList
void SocketApi::command_SHARE(const QString &localFile, SocketListener *listener)
{
- auto theme = Theme::instance();
-
- Folder *shareFolder = FolderMan::instance()->folderForPath(localFile);
- if (!shareFolder) {
- const QString message = QLatin1String("SHARE:NOP:") + QDir::toNativeSeparators(localFile);
- // files that are not within a sync folder are not synced.
- listener->sendMessage(message);
- } else if (!shareFolder->accountState()->isConnected()) {
- const QString message = QLatin1String("SHARE:NOTCONNECTED:") + QDir::toNativeSeparators(localFile);
- // if the folder isn't connected, don't open the share dialog
- listener->sendMessage(message);
- } else if (!theme->linkSharing() && (!theme->userGroupSharing() || shareFolder->accountState()->account()->serverVersionInt() < Account::makeServerVersion(8, 2, 0))) {
- const QString message = QLatin1String("SHARE:NOP:") + QDir::toNativeSeparators(localFile);
- listener->sendMessage(message);
- } else {
- const QString localFileClean = QDir::cleanPath(localFile);
- const QString file = localFileClean.mid(shareFolder->cleanPath().length() + 1);
- SyncFileStatus fileStatus = shareFolder->syncEngine().syncFileStatusTracker().fileStatus(file);
-
- // Verify the file is on the server (to our knowledge of course)
- if (fileStatus.tag() != SyncFileStatus::StatusUpToDate) {
- const QString message = QLatin1String("SHARE:NOTSYNCED:") + QDir::toNativeSeparators(localFile);
- listener->sendMessage(message);
- return;
- }
-
- const QString remotePath = QDir(shareFolder->remotePath()).filePath(file);
-
- // Can't share root folder
- if (remotePath == "/") {
- const QString message = QLatin1String("SHARE:CANNOTSHAREROOT:") + QDir::toNativeSeparators(localFile);
- listener->sendMessage(message);
- return;
- }
-
- const QString message = QLatin1String("SHARE:OK:") + QDir::toNativeSeparators(localFile);
- listener->sendMessage(message);
+ processShareRequest(localFile, listener, ShareDialogStartPage::UsersAndGroups);
+}
- emit shareCommandReceived(remotePath, localFileClean);
- }
+void SocketApi::command_MANAGE_PUBLIC_LINKS(const QString &localFile, SocketListener *listener)
+{
+ processShareRequest(localFile, listener, ShareDialogStartPage::PublicLinks);
}
void SocketApi::command_VERSION(const QString &, SocketListener *listener)
@@ -434,105 +451,212 @@ void SocketApi::command_VERSION(const QString &, SocketListener *listener)
listener->sendMessage(QLatin1String("VERSION:" MIRALL_VERSION_STRING ":" MIRALL_SOCKET_API_VERSION));
}
-void SocketApi::command_SHARE_STATUS(const QString &localFile, SocketListener *listener)
+void SocketApi::command_SHARE_MENU_TITLE(const QString &, SocketListener *listener)
{
- Folder *shareFolder = FolderMan::instance()->folderForPath(localFile);
+ listener->sendMessage(QLatin1String("SHARE_MENU_TITLE:") + tr("Share with %1", "parameter is ownCloud").arg(Theme::instance()->appNameGUI()));
+}
- if (!shareFolder) {
- const QString message = QLatin1String("SHARE_STATUS:NOP:") + QDir::toNativeSeparators(localFile);
- listener->sendMessage(message);
- } else {
- const QString file = QDir::cleanPath(localFile).mid(shareFolder->cleanPath().length() + 1);
- SyncFileStatus fileStatus = shareFolder->syncEngine().syncFileStatusTracker().fileStatus(file);
+// don't pull the share manager into socketapi unittests
+#ifndef OWNCLOUD_TEST
- // Verify the file is on the server (to our knowledge of course)
- if (fileStatus.tag() != SyncFileStatus::StatusUpToDate) {
- const QString message = QLatin1String("SHARE_STATUS:NOTSYNCED:") + QDir::toNativeSeparators(localFile);
- listener->sendMessage(message);
- return;
+class GetOrCreatePublicLinkShare : public QObject
+{
+ Q_OBJECT
+public:
+ GetOrCreatePublicLinkShare(const AccountPtr &account, const QString &localFile,
+ std::function<void(const QString &link)> targetFun, QObject *parent)
+ : QObject(parent)
+ , _shareManager(account)
+ , _localFile(localFile)
+ , _targetFun(targetFun)
+ {
+ connect(&_shareManager, &ShareManager::sharesFetched,
+ this, &GetOrCreatePublicLinkShare::sharesFetched);
+ connect(&_shareManager, &ShareManager::linkShareCreated,
+ this, &GetOrCreatePublicLinkShare::linkShareCreated);
+ connect(&_shareManager, &ShareManager::serverError,
+ this, &GetOrCreatePublicLinkShare::serverError);
+ }
+
+ void run()
+ {
+ qCDebug(lcPublicLink) << "Fetching shares";
+ _shareManager.fetchShares(_localFile);
+ }
+
+private slots:
+ void sharesFetched(const QList<QSharedPointer<Share>> &shares)
+ {
+ auto shareName = SocketApi::tr("Context menu share");
+ // If there already is a context menu share, reuse it
+ for (const auto &share : shares) {
+ const auto linkShare = qSharedPointerDynamicCast<LinkShare>(share);
+ if (!linkShare)
+ continue;
+
+ if (linkShare->getName() == shareName) {
+ qCDebug(lcPublicLink) << "Found existing share, reusing";
+ return success(linkShare->getLink().toString());
+ }
}
- const Capabilities capabilities = shareFolder->accountState()->account()->capabilities();
+ // otherwise create a new one
+ qCDebug(lcPublicLink) << "Creating new share";
+ _shareManager.createLinkShare(_localFile, shareName, QString());
+ }
- if (!capabilities.shareAPI()) {
- const QString message = QLatin1String("SHARE_STATUS:DISABLED:") + QDir::toNativeSeparators(localFile);
- listener->sendMessage(message);
- } else {
- auto theme = Theme::instance();
- QString available;
+ void linkShareCreated(const QSharedPointer<LinkShare> &share)
+ {
+ qCDebug(lcPublicLink) << "New share created";
+ success(share->getLink().toString());
+ }
- if (theme->userGroupSharing()) {
- available = "USER,GROUP";
- }
+ void serverError(int code, const QString &message)
+ {
+ qCWarning(lcPublicLink) << "Share fetch/create error" << code << message;
+ QMessageBox::warning(
+ 0,
+ tr("Sharing error"),
+ tr("Could not retrieve or create the public link share. Error:\n\n%1").arg(message),
+ QMessageBox::Ok,
+ QMessageBox::NoButton);
+ deleteLater();
+ }
- if (theme->linkSharing() && capabilities.sharePublicLink()) {
- if (available.isEmpty()) {
- available = "LINK";
- } else {
- available += ",LINK";
- }
- }
+private:
+ void success(const QString &link)
+ {
+ _targetFun(link);
+ deleteLater();
+ }
- if (available.isEmpty()) {
- const QString message = QLatin1String("SHARE_STATUS:DISABLED") + ":" + QDir::toNativeSeparators(localFile);
- listener->sendMessage(message);
- } else {
- const QString message = QLatin1String("SHARE_STATUS:") + available + ":" + QDir::toNativeSeparators(localFile);
- listener->sendMessage(message);
- }
- }
+ ShareManager _shareManager;
+ QString _localFile;
+ std::function<void(const QString &url)> _targetFun;
+};
+
+#else
+
+class GetOrCreatePublicLinkShare : public QObject
+{
+ Q_OBJECT
+public:
+ GetOrCreatePublicLinkShare(const AccountPtr &, const QString &,
+ std::function<void(const QString &link)>, QObject *)
+ {
}
-}
-void SocketApi::command_SHARE_MENU_TITLE(const QString &, SocketListener *listener)
+ void run()
+ {
+ }
+};
+
+#endif
+
+void SocketApi::command_COPY_PUBLIC_LINK(const QString &localFile, SocketListener *)
{
- listener->sendMessage(QLatin1String("SHARE_MENU_TITLE:") + tr("Share with %1", "parameter is ownCloud").arg(Theme::instance()->appNameGUI()));
+ auto fileData = FileData::get(localFile);
+ if (!fileData.folder)
+ return;
+
+ AccountPtr account = fileData.folder->accountState()->account();
+ auto job = new GetOrCreatePublicLinkShare(account, fileData.serverRelativePath, [](const QString &url) { copyUrlToClipboard(url); }, this);
+ job->run();
}
// Fetches the private link url asynchronously and then calls the target slot
-static void fetchPrivateLinkUrlHelper(const QString &localFile, SocketApi *target, void (SocketApi::*targetFun)(const QString &url) const)
+void SocketApi::fetchPrivateLinkUrlHelper(const QString &localFile, const std::function<void(const QString &url)> &targetFun)
{
- Folder *shareFolder = FolderMan::instance()->folderForPath(localFile);
- if (!shareFolder) {
+ auto fileData = FileData::get(localFile);
+ if (!fileData.folder) {
qCWarning(lcSocketApi) << "Unknown path" << localFile;
return;
}
- const QString localFileClean = QDir::cleanPath(localFile);
- const QString file = localFileClean.mid(shareFolder->cleanPath().length() + 1);
-
- AccountPtr account = shareFolder->accountState()->account();
-
- SyncJournalFileRecord rec;
- if (!shareFolder->journalDb()->getFileRecord(file, &rec) || !rec.isValid())
+ auto record = fileData.journalRecord();
+ if (!record.isValid())
return;
- fetchPrivateLinkUrl(account, file, rec.numericFileId(), target, [=](const QString &url) {
- (target->*targetFun)(url);
- });
+ fetchPrivateLinkUrl(
+ fileData.folder->accountState()->account(),
+ fileData.serverRelativePath,
+ record.legacyDeriveNumericFileId(),
+ this,
+ targetFun);
}
void SocketApi::command_COPY_PRIVATE_LINK(const QString &localFile, SocketListener *)
{
- fetchPrivateLinkUrlHelper(localFile, this, &SocketApi::copyPrivateLinkToClipboard);
+ fetchPrivateLinkUrlHelper(localFile, &SocketApi::copyUrlToClipboard);
}
void SocketApi::command_EMAIL_PRIVATE_LINK(const QString &localFile, SocketListener *)
{
- fetchPrivateLinkUrlHelper(localFile, this, &SocketApi::emailPrivateLink);
+ fetchPrivateLinkUrlHelper(localFile, &SocketApi::emailPrivateLink);
}
void SocketApi::command_OPEN_PRIVATE_LINK(const QString &localFile, SocketListener *)
{
- fetchPrivateLinkUrlHelper(localFile, this, &SocketApi::openPrivateLink);
+ fetchPrivateLinkUrlHelper(localFile, &SocketApi::openPrivateLink);
}
-void SocketApi::copyPrivateLinkToClipboard(const QString &link) const
+void SocketApi::copyUrlToClipboard(const QString &link)
{
QApplication::clipboard()->setText(link);
}
-void SocketApi::emailPrivateLink(const QString &link) const
+void SocketApi::command_DOWNLOAD_VIRTUAL_FILE(const QString &filesArg, SocketListener *)
+{
+ QStringList files = filesArg.split(QLatin1Char('\x1e')); // Record Separator
+ auto suffix = QStringLiteral(APPLICATION_DOTVIRTUALFILE_SUFFIX);
+
+ for (const auto &file : files) {
+ if (!file.endsWith(suffix) && !QFileInfo(file).isDir())
+ continue;
+ QString relativePath;
+ auto folder = FolderMan::instance()->folderForPath(file, &relativePath);
+ if (folder) {
+ folder->downloadVirtualFile(relativePath);
+ }
+ }
+}
+
+/* Go over all the files ans replace them by a virtual file */
+void SocketApi::command_REPLACE_VIRTUAL_FILE(const QString &filesArg, SocketListener *)
+{
+ QStringList files = filesArg.split(QLatin1Char('\x1e')); // Record Separator
+ auto suffix = QStringLiteral(APPLICATION_DOTVIRTUALFILE_SUFFIX);
+
+ for (const auto &file : files) {
+ QString relativePath;
+ auto folder = FolderMan::instance()->folderForPath(file, &relativePath);
+ if (!folder)
+ continue;
+ if (file.endsWith(suffix))
+ continue;
+ QFileInfo fi(file);
+ if (fi.isDir()) {
+ folder->journalDb()->getFilesBelowPath(relativePath.toUtf8(), [&](const SyncJournalFileRecord &rec) {
+ if (rec._type != ItemTypeFile || rec._path.endsWith(APPLICATION_DOTVIRTUALFILE_SUFFIX))
+ return;
+ QString file = folder->path() + '/' + QString::fromUtf8(rec._path);
+ if (!FileSystem::rename(file, file + suffix)) {
+ qCWarning(lcSocketApi) << "Unable to rename " << file;
+ }
+ });
+ continue;
+ }
+ SyncJournalFileRecord record;
+ if (!folder->journalDb()->getFileRecord(relativePath, &record) || !record.isValid())
+ continue;
+ if (!FileSystem::rename(file, file + suffix)) {
+ qCWarning(lcSocketApi) << "Unable to rename " << file;
+ }
+ FolderMan::instance()->scheduleFolder(folder);
+ }
+}
+
+void SocketApi::emailPrivateLink(const QString &link)
{
Utility::openEmailComposer(
tr("I shared something with you"),
@@ -540,7 +664,7 @@ void SocketApi::emailPrivateLink(const QString &link) const
0);
}
-void OCC::SocketApi::openPrivateLink(const QString &link) const
+void OCC::SocketApi::openPrivateLink(const QString &link)
{
Utility::openBrowser(link, nullptr);
}
@@ -562,39 +686,137 @@ void SocketApi::command_GET_STRINGS(const QString &argument, SocketListener *lis
listener->sendMessage(QString("GET_STRINGS:END"));
}
+void SocketApi::sendSharingContextMenuOptions(const FileData &fileData, SocketListener *listener)
+{
+ auto record = fileData.journalRecord();
+ bool isOnTheServer = record.isValid();
+ auto flagString = isOnTheServer ? QLatin1String("::") : QLatin1String(":d:");
+
+ auto capabilities = fileData.folder->accountState()->account()->capabilities();
+ auto theme = Theme::instance();
+ if (!capabilities.shareAPI() || !(theme->userGroupSharing() || (theme->linkSharing() && capabilities.sharePublicLink())))
+ return;
+
+ // If sharing is globally disabled, do not show any sharing entries.
+ // If there is no permission to share for this file, add a disabled entry saying so
+ if (isOnTheServer && !record._remotePerm.isNull() && !record._remotePerm.hasPermission(RemotePermissions::CanReshare)) {
+ listener->sendMessage(QLatin1String("MENU_ITEM:DISABLED:d:") + tr("Resharing this file is not allowed"));
+ } else {
+ listener->sendMessage(QLatin1String("MENU_ITEM:SHARE") + flagString + tr("Share..."));
+
+ // Do we have public links?
+ bool publicLinksEnabled = theme->linkSharing() && capabilities.sharePublicLink();
+
+ // Is is possible to create a public link without user choices?
+ bool canCreateDefaultPublicLink = publicLinksEnabled
+ && !capabilities.sharePublicLinkEnforceExpireDate()
+ && !capabilities.sharePublicLinkEnforcePassword();
+
+ if (canCreateDefaultPublicLink) {
+ listener->sendMessage(QLatin1String("MENU_ITEM:COPY_PUBLIC_LINK") + flagString + tr("Copy public link to clipboard"));
+ } else if (publicLinksEnabled) {
+ listener->sendMessage(QLatin1String("MENU_ITEM:MANAGE_PUBLIC_LINKS") + flagString + tr("Copy public link to clipboard"));
+ }
+ }
+
+ listener->sendMessage(QLatin1String("MENU_ITEM:COPY_PRIVATE_LINK") + flagString + tr("Copy private link to clipboard"));
+
+ // Disabled: only providing email option for private links would look odd,
+ // and the copy option is more general.
+ //listener->sendMessage(QLatin1String("MENU_ITEM:EMAIL_PRIVATE_LINK") + flagString + tr("Send private link by email..."));
+}
+
+SocketApi::FileData SocketApi::FileData::get(const QString &localFile)
+{
+ FileData data;
+
+ data.localPath = QDir::cleanPath(localFile);
+ if (data.localPath.endsWith(QLatin1Char('/')))
+ data.localPath.chop(1);
+
+ data.folder = FolderMan::instance()->folderForPath(data.localPath, &data.folderRelativePath);
+ if (!data.folder)
+ return data;
+
+ data.serverRelativePath = QDir(data.folder->remotePath()).filePath(data.folderRelativePath);
+ QString virtualFileExt = QStringLiteral(APPLICATION_DOTVIRTUALFILE_SUFFIX);
+ if (data.serverRelativePath.endsWith(virtualFileExt)) {
+ data.serverRelativePath.chop(virtualFileExt.size());
+ }
+ return data;
+}
+
+SyncFileStatus SocketApi::FileData::syncFileStatus() const
+{
+ if (!folder)
+ return SyncFileStatus::StatusNone;
+ return folder->syncEngine().syncFileStatusTracker().fileStatus(folderRelativePath);
+}
+
+SyncJournalFileRecord SocketApi::FileData::journalRecord() const
+{
+ SyncJournalFileRecord record;
+ if (!folder)
+ return record;
+ folder->journalDb()->getFileRecord(folderRelativePath, &record);
+ return record;
+}
+
void SocketApi::command_GET_MENU_ITEMS(const QString &argument, OCC::SocketListener *listener)
{
listener->sendMessage(QString("GET_MENU_ITEMS:BEGIN"));
- bool hasSeveralFiles = argument.contains(QLatin1Char('\x1e')); // Record Separator
- Folder *syncFolder = hasSeveralFiles ? nullptr : FolderMan::instance()->folderForPath(argument);
- if (syncFolder && syncFolder->accountState()->isConnected()) {
- QString systemPath = QDir::cleanPath(argument);
- if (systemPath.endsWith(QLatin1Char('/'))) {
- systemPath.truncate(systemPath.length() - 1);
+ QStringList files = argument.split(QLatin1Char('\x1e')); // Record Separator
+
+ // Find the common sync folder.
+ // syncFolder will be null if files are in different folders.
+ Folder *folder = nullptr;
+ for (const auto &file : files) {
+ auto f = FolderMan::instance()->folderForPath(file);
+ if (f != folder) {
+ if (!folder) {
+ folder = f;
+ } else {
+ folder = nullptr;
+ break;
+ }
}
+ }
- SyncJournalFileRecord rec;
- QString relativePath = systemPath.mid(syncFolder->cleanPath().length() + 1);
- // If the file is on the DB, it is on the server
- bool isOnTheServer = syncFolder->journalDb()->getFileRecord(relativePath, &rec) && rec.isValid();
+ // Some options only show for single files
+ if (files.size() == 1) {
+ FileData fileData = FileData::get(files.first());
+ bool isOnTheServer = fileData.journalRecord().isValid();
auto flagString = isOnTheServer ? QLatin1String("::") : QLatin1String(":d:");
- auto capabilities = syncFolder->accountState()->account()->capabilities();
- auto theme = Theme::instance();
- if (capabilities.shareAPI() && (theme->userGroupSharing() || (theme->linkSharing() && capabilities.sharePublicLink()))) {
- // If sharing is globally disabled, do not show any sharing entries.
- // If there is no permission to share for this file, add a disabled entry saying so
- if (isOnTheServer && !rec._remotePerm.isNull() && !rec._remotePerm.hasPermission(RemotePermissions::CanReshare)) {
- listener->sendMessage(QLatin1String("MENU_ITEM:DISABLED:d:") + tr("Resharing this file is not allowed"));
- } else {
- listener->sendMessage(QLatin1String("MENU_ITEM:SHARE") + flagString + tr("Share..."));
+ if (fileData.folder && fileData.folder->accountState()->isConnected()) {
+ sendSharingContextMenuOptions(fileData, listener);
+ listener->sendMessage(QLatin1String("MENU_ITEM:OPEN_PRIVATE_LINK") + flagString + tr("Open in browser"));
+ }
+ }
+
+ // Virtual file download action
+ if (folder) {
+ auto virtualFileSuffix = QStringLiteral(APPLICATION_DOTVIRTUALFILE_SUFFIX);
+ bool hasVirtualFile = false;
+ bool hasNormalFiles = false;
+ bool hasDir = false;
+ for (const auto &file : files) {
+ if (QFileInfo(file).isDir()) {
+ hasDir = true;
+ } else if (file.endsWith(virtualFileSuffix)) {
+ hasVirtualFile = true;
+ } else if (!hasNormalFiles) {
+ bool isOnTheServer = FileData::get(file).journalRecord().isValid();
+ hasNormalFiles = isOnTheServer;
}
- listener->sendMessage(QLatin1String("MENU_ITEM:EMAIL_PRIVATE_LINK") + flagString + tr("Send private link by email..."));
- listener->sendMessage(QLatin1String("MENU_ITEM:COPY_PRIVATE_LINK") + flagString + tr("Copy private link to clipboard"));
}
+ if (hasVirtualFile || (hasDir && folder->useVirtualFiles()))
+ listener->sendMessage(QLatin1String("MENU_ITEM:DOWNLOAD_VIRTUAL_FILE::") + tr("Download file(s)", "", files.size()));
- listener->sendMessage(QLatin1String("MENU_ITEM:OPEN_PRIVATE_LINK") + flagString + tr("Open in browser"));
+ if ((hasNormalFiles || hasDir) && folder->useVirtualFiles())
+ listener->sendMessage(QLatin1String("MENU_ITEM:REPLACE_VIRTUAL_FILE::") + tr("Replace file(s) by virtual file", "", files.size()));
}
+
listener->sendMessage(QString("GET_MENU_ITEMS:END"));
}
@@ -607,3 +829,5 @@ QString SocketApi::buildRegisterPathMessage(const QString &path)
}
} // namespace OCC
+
+#include "socketapi.moc"
diff --git a/src/gui/socketapi.h b/src/gui/socketapi.h
index a3b131517..5ab7767a1 100644
--- a/src/gui/socketapi.h
+++ b/src/gui/socketapi.h
@@ -18,7 +18,8 @@
#include "syncfileitem.h"
#include "syncfilestatus.h"
-// #include "ownsql.h"
+#include "sharedialog.h" // for the ShareDialogStartPage
+#include "common/syncjournalfilerecord.h"
#if defined(Q_OS_MAC)
#include "socketapisocket_mac.h"
@@ -56,7 +57,7 @@ public slots:
void broadcastStatusPushMessage(const QString &systemPath, SyncFileStatus fileStatus);
signals:
- void shareCommandReceived(const QString &sharePath, const QString &localPath);
+ void shareCommandReceived(const QString &sharePath, const QString &localPath, ShareDialogStartPage startPage);
private slots:
void slotNewConnection();
@@ -64,30 +65,60 @@ private slots:
void slotSocketDestroyed(QObject *obj);
void slotReadSocket();
- void copyPrivateLinkToClipboard(const QString &link) const;
- void emailPrivateLink(const QString &link) const;
- void openPrivateLink(const QString &link) const;
+ static void copyUrlToClipboard(const QString &link);
+ static void emailPrivateLink(const QString &link);
+ static void openPrivateLink(const QString &link);
private:
+ // Helper structure for getting information on a file
+ // based on its local path - used for nearly all remote
+ // actions.
+ struct FileData
+ {
+ static FileData get(const QString &localFile);
+ SyncFileStatus syncFileStatus() const;
+ SyncJournalFileRecord journalRecord() const;
+
+ Folder *folder;
+ // Absolute path of the file locally. (May be a virtual file)
+ QString localPath;
+ // Relative path of the file locally, as in the DB. (May be a virtual file)
+ QString folderRelativePath;
+ // Path of the file on the server (In case of virtual file, it points to the actual file)
+ QString serverRelativePath;
+ };
+
void broadcastMessage(const QString &msg, bool doWait = false);
+ // opens share dialog, sends reply
+ void processShareRequest(const QString &localFile, SocketListener *listener, ShareDialogStartPage startPage);
+
Q_INVOKABLE void command_RETRIEVE_FOLDER_STATUS(const QString &argument, SocketListener *listener);
Q_INVOKABLE void command_RETRIEVE_FILE_STATUS(const QString &argument, SocketListener *listener);
Q_INVOKABLE void command_VERSION(const QString &argument, SocketListener *listener);
- Q_INVOKABLE void command_SHARE_STATUS(const QString &localFile, SocketListener *listener);
Q_INVOKABLE void command_SHARE_MENU_TITLE(const QString &argument, SocketListener *listener);
// The context menu actions
Q_INVOKABLE void command_SHARE(const QString &localFile, SocketListener *listener);
+ Q_INVOKABLE void command_MANAGE_PUBLIC_LINKS(const QString &localFile, SocketListener *listener);
+ Q_INVOKABLE void command_COPY_PUBLIC_LINK(const QString &localFile, SocketListener *listener);
Q_INVOKABLE void command_COPY_PRIVATE_LINK(const QString &localFile, SocketListener *listener);
Q_INVOKABLE void command_EMAIL_PRIVATE_LINK(const QString &localFile, SocketListener *listener);
Q_INVOKABLE void command_OPEN_PRIVATE_LINK(const QString &localFile, SocketListener *listener);
+ Q_INVOKABLE void command_DOWNLOAD_VIRTUAL_FILE(const QString &filesArg, SocketListener *listener);
+ Q_INVOKABLE void command_REPLACE_VIRTUAL_FILE(const QString &filesArg, SocketListener *listener);
+
+ // Fetch the private link and call targetFun
+ void fetchPrivateLinkUrlHelper(const QString &localFile, const std::function<void(const QString &url)> &targetFun);
/** Sends translated/branded strings that may be useful to the integration */
Q_INVOKABLE void command_GET_STRINGS(const QString &argument, SocketListener *listener);
+ // Sends the context menu options relating to sharing to listener
+ void sendSharingContextMenuOptions(const FileData &fileData, SocketListener *listener);
+
/** Send the list of menu item. (added in version 1.1)
* argument is a list of files for which the menu should be shown, separated by '\x1e'
* Reply with GET_MENU_ITEMS:BEGIN
diff --git a/src/gui/sslbutton.cpp b/src/gui/sslbutton.cpp
index e387f885e..b41076ba4 100644
--- a/src/gui/sslbutton.cpp
+++ b/src/gui/sslbutton.cpp
@@ -58,7 +58,7 @@ static bool isSelfSigned(const QSslCertificate &certificate)
}
QMenu *SslButton::buildCertMenu(QMenu *parent, const QSslCertificate &cert,
- const QList<QSslCertificate> &userApproved, int pos)
+ const QList<QSslCertificate> &userApproved, int pos, const QList<QSslCertificate> &systemCaCertificates)
{
QString cn = QStringList(cert.subjectInfo(QSslCertificate::CommonName)).join(QChar(';'));
QString ou = QStringList(cert.subjectInfo(QSslCertificate::OrganizationalUnitName)).join(QChar(';'));
@@ -129,7 +129,7 @@ QMenu *SslButton::buildCertMenu(QMenu *parent, const QSslCertificate &cert,
QString certId = cn.isEmpty() ? ou : cn;
- if (QSslConfiguration::systemCaCertificates().contains(cert)) {
+ if (systemCaCertificates.contains(cert)) {
txt += certId;
} else {
if (isSelfSigned(cert)) {
@@ -189,6 +189,10 @@ void SslButton::slotUpdateMenu()
AccountPtr account = _accountState->account();
+ if (account->isHttp2Supported()) {
+ _menu->addAction("HTTP/2")->setEnabled(false);
+ }
+
if (account->url().scheme() == QLatin1String("https")) {
QString sslVersion = account->_sessionCipher.protocolString()
+ ", " + account->_sessionCipher.authenticationMethod()
@@ -232,7 +236,7 @@ void SslButton::slotUpdateMenu()
it.toBack();
int i = 0;
while (it.hasPrevious()) {
- _menu->addMenu(buildCertMenu(_menu, it.previous(), account->approvedCerts(), i));
+ _menu->addMenu(buildCertMenu(_menu, it.previous(), account->approvedCerts(), i, systemCerts));
i++;
}
}
diff --git a/src/gui/sslbutton.h b/src/gui/sslbutton.h
index c48f7c3a7..906f4b846 100644
--- a/src/gui/sslbutton.h
+++ b/src/gui/sslbutton.h
@@ -43,7 +43,7 @@ public slots:
private:
QMenu *buildCertMenu(QMenu *parent, const QSslCertificate &cert,
- const QList<QSslCertificate> &userApproved, int pos);
+ const QList<QSslCertificate> &userApproved, int pos, const QList<QSslCertificate> &systemCaCertificates);
QPointer<AccountState> _accountState;
QMenu *_menu;
};
diff --git a/src/gui/syncrunfilelog.cpp b/src/gui/syncrunfilelog.cpp
index 73f801b5d..51b3fbaf5 100644
--- a/src/gui/syncrunfilelog.cpp
+++ b/src/gui/syncrunfilelog.cpp
@@ -93,7 +93,7 @@ QString SyncRunFileLog::instructionToStr(csync_instructions_e inst)
void SyncRunFileLog::start(const QString &folderPath)
{
- const qint64 logfileMaxSize = 1024 * 1024; // 1MiB
+ const qint64 logfileMaxSize = 10 * 1024 * 1024; // 10MiB
// Note; this name is ignored in csync_exclude.c
const QString filename = folderPath + QLatin1String(".owncloudsync.log");
@@ -117,8 +117,7 @@ void SyncRunFileLog::start(const QString &folderPath)
// We are creating a new file, add the note.
_out << "# timestamp | duration | file | instruction | dir | modtime | etag | "
"size | fileId | status | errorString | http result code | "
- "other size | other modtime | other etag | other fileId | "
- "other instruction"
+ "other size | other modtime | X-Request-ID"
<< endl;
FileSystem::setFileHidden(filename, true);
@@ -133,7 +132,8 @@ void SyncRunFileLog::start(const QString &folderPath)
void SyncRunFileLog::logItem(const SyncFileItem &item)
{
// don't log the directory items that are in the list
- if (item._direction == SyncFileItem::None) {
+ if (item._direction == SyncFileItem::None
+ || item._instruction == CSYNC_INSTRUCTION_IGNORE) {
return;
}
QString ts = QString::fromLatin1(item._responseTimeStamp);
@@ -163,9 +163,7 @@ void SyncRunFileLog::logItem(const SyncFileItem &item)
_out << QString::number(item._httpErrorCode) << L;
_out << QString::number(item._previousSize) << L;
_out << QString::number(item._previousModtime) << L;
- _out /* << other etag (removed) */ << L;
- _out /* << other fileId (removed) */ << L;
- _out /* << other instruction (removed) */ << L;
+ _out << item._requestId << L;
_out << endl;
}
diff --git a/src/gui/updater/ocupdater.cpp b/src/gui/updater/ocupdater.cpp
index e419bcbc1..f3fe26e1a 100644
--- a/src/gui/updater/ocupdater.cpp
+++ b/src/gui/updater/ocupdater.cpp
@@ -92,6 +92,11 @@ OCUpdater::OCUpdater(const QUrl &url)
{
}
+void OCUpdater::setUpdateUrl(const QUrl &url)
+{
+ _updateUrl = url;
+}
+
bool OCUpdater::performUpdate()
{
ConfigFile cfg;
@@ -187,8 +192,30 @@ void OCUpdater::slotStartInstaller()
settings.setValue(autoUpdateAttemptedC, true);
settings.sync();
qCInfo(lcUpdater) << "Running updater" << updateFile;
- QProcess::startDetached(updateFile, QStringList() << "/S"
- << "/launch");
+
+ if(updateFile.endsWith(".exe")) {
+ QProcess::startDetached(updateFile, QStringList() << "/S"
+ << "/launch");
+ } else if(updateFile.endsWith(".msi")) {
+ // When MSIs are installed without gui they cannot launch applications
+ // as they lack the user context. That is why we need to run the client
+ // manually here. We wrap the msiexec and client invocation in a powershell
+ // script because owncloud.exe will be shut down for installation.
+ // | Out-Null forces powershell to wait for msiexec to finish.
+ auto preparePathForPowershell = [](QString path) {
+ path.replace("'", "''");
+
+ return QDir::toNativeSeparators(path);
+ };
+
+ QString msiLogFile = cfg.configPath() + "msi.log";
+ QString command = QString("&{msiexec /norestart /passive /i '%1' /L*V '%2'| Out-Null ; &'%3'}")
+ .arg(preparePathForPowershell(updateFile))
+ .arg(preparePathForPowershell(msiLogFile))
+ .arg(preparePathForPowershell(QCoreApplication::applicationFilePath()));
+
+ QProcess::startDetached("powershell.exe", QStringList{"-Command", command});
+ }
}
void OCUpdater::checkForUpdate()
@@ -223,6 +250,7 @@ void OCUpdater::slotVersionInfoArrived()
reply->deleteLater();
if (reply->error() != QNetworkReply::NoError) {
qCWarning(lcUpdater) << "Failed to reach version check url: " << reply->errorString();
+ setDownloadState(OCUpdater::Unknown);
return;
}
@@ -234,6 +262,7 @@ void OCUpdater::slotVersionInfoArrived()
versionInfoArrived(_updateInfo);
} else {
qCWarning(lcUpdater) << "Could not parse update information.";
+ setDownloadState(OCUpdater::Unknown);
}
}
@@ -298,7 +327,7 @@ void NSISUpdater::versionInfoArrived(const UpdateInfo &info)
showDialog(info);
}
if (!url.isEmpty()) {
- _targetFile = cfg.configPath() + url.mid(url.lastIndexOf('/'));
+ _targetFile = cfg.configPath() + url.mid(url.lastIndexOf('/')+1);
if (QFile(_targetFile).exists()) {
setDownloadState(DownloadComplete);
} else {
diff --git a/src/gui/updater/ocupdater.h b/src/gui/updater/ocupdater.h
index b157b93ce..ffad172a2 100644
--- a/src/gui/updater/ocupdater.h
+++ b/src/gui/updater/ocupdater.h
@@ -99,6 +99,8 @@ public:
UpdateOnlyAvailableThroughSystem };
explicit OCUpdater(const QUrl &url);
+ void setUpdateUrl(const QUrl &url);
+
bool performUpdate();
void checkForUpdate() Q_DECL_OVERRIDE;
@@ -113,6 +115,7 @@ signals:
void requestRestart();
public slots:
+ // FIXME Maybe this should be in the NSISUpdater which should have been called WindowsUpdater
void slotStartInstaller();
protected slots:
diff --git a/src/gui/updater/sparkleupdater.h b/src/gui/updater/sparkleupdater.h
index e9a2c8882..a6945ffc4 100644
--- a/src/gui/updater/sparkleupdater.h
+++ b/src/gui/updater/sparkleupdater.h
@@ -23,15 +23,20 @@ namespace OCC {
class SparkleUpdater : public Updater
{
+ Q_OBJECT
public:
- SparkleUpdater(const QString &appCastUrl);
+ SparkleUpdater(const QUrl &appCastUrl);
~SparkleUpdater();
+ void setUpdateUrl(const QUrl &url);
+
// unused in this updater
void checkForUpdate() Q_DECL_OVERRIDE;
void backgroundCheckForUpdate() Q_DECL_OVERRIDE;
bool handleStartup() Q_DECL_OVERRIDE { return false; }
+ QString statusString();
+
private:
class Private;
Private *d;
diff --git a/src/gui/updater/sparkleupdater_mac.mm b/src/gui/updater/sparkleupdater_mac.mm
index a1e3e4f05..1ba1e2c23 100644
--- a/src/gui/updater/sparkleupdater_mac.mm
+++ b/src/gui/updater/sparkleupdater_mac.mm
@@ -21,15 +21,14 @@
#include "common/utility.h"
#include "updater/sparkleupdater.h"
-// Does not work yet
@interface DelegateObject : NSObject <SUUpdaterDelegate>
- (BOOL)updaterMayCheckForUpdates:(SUUpdater *)bundle;
@end
@implementation DelegateObject //(SUUpdaterDelegateInformalProtocol)
-// Only possible in later versions, we're not up to date here.
- (BOOL)updaterMayCheckForUpdates:(SUUpdater *)bundle
{
+ Q_UNUSED(bundle)
qCDebug(OCC::lcUpdater) << "may check: YES";
return YES;
}
@@ -37,27 +36,38 @@
// Sent when a valid update is found by the update driver.
- (void)updater:(SUUpdater *)updater didFindValidUpdate:(SUAppcastItem *)update
{
+ Q_UNUSED(updater)
+ Q_UNUSED(update)
+ qCDebug(OCC::lcUpdater) << "";
}
// Sent when a valid update is not found.
-// Does not seem to get called ever.
- (void)updaterDidNotFindUpdate:(SUUpdater *)update
{
+ Q_UNUSED(update)
+ qCDebug(OCC::lcUpdater) << "";
}
// Sent immediately before installing the specified update.
- (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)update
{
+ Q_UNUSED(updater)
+ Q_UNUSED(update)
+ qCDebug(OCC::lcUpdater) << "";
}
-// Tried implementing those methods, but they never ever seem to get called
-//- (void) updater:(SUUpdater *)updater didAbortWithError:(NSError *)error
-//{
-//}
+- (void) updater:(SUUpdater *)updater didAbortWithError:(NSError *)error
+{
+ Q_UNUSED(updater)
+ qCDebug(OCC::lcUpdater) << error.description;
+}
-//- (void)updater:(SUUpdater *)updater didFinishLoadingAppcast:(SUAppcast *)appcast
-//{
-//}
+- (void)updater:(SUUpdater *)updater didFinishLoadingAppcast:(SUAppcast *)appcast
+{
+ Q_UNUSED(updater)
+ Q_UNUSED(appcast)
+ qCDebug(OCC::lcUpdater) << "";
+}
@end
@@ -73,7 +83,7 @@ class SparkleUpdater::Private
};
// Delete ~/Library//Preferences/com.owncloud.desktopclient.plist to re-test
-SparkleUpdater::SparkleUpdater(const QString& appCastUrl)
+SparkleUpdater::SparkleUpdater(const QUrl& appCastUrl)
: Updater()
{
d = new Private;
@@ -89,9 +99,7 @@ SparkleUpdater::SparkleUpdater(const QString& appCastUrl)
[d->updater resetUpdateCycle];
[d->updater retain];
- NSURL* url = [NSURL URLWithString:
- [NSString stringWithUTF8String: appCastUrl.toUtf8().data()]];
- [d->updater setFeedURL: url];
+ setUpdateUrl(appCastUrl);
// Sparkle 1.8 required
NSString *userAgent = [NSString stringWithUTF8String: Utility::userAgentString().data()];
@@ -104,7 +112,14 @@ SparkleUpdater::~SparkleUpdater()
delete d;
}
+void SparkleUpdater::setUpdateUrl(const QUrl &url)
+{
+ NSURL* nsurl = [NSURL URLWithString:
+ [NSString stringWithUTF8String: url.toString().toUtf8().data()]];
+ [d->updater setFeedURL: nsurl];
+}
+// FIXME: Should be changed to not instanicate the SparkleUpdater at all in this case
bool autoUpdaterAllowed()
{
// See https://github.com/owncloud/client/issues/2931
@@ -133,4 +148,10 @@ void SparkleUpdater::backgroundCheckForUpdate()
}
}
+QString SparkleUpdater::statusString()
+{
+ // FIXME Show the real state depending on the callbacks
+ return QString();
+}
+
} // namespace OCC
diff --git a/src/gui/updater/updateinfo.cpp b/src/gui/updater/updateinfo.cpp
index 711daa942..48ab68bae 100644
--- a/src/gui/updater/updateinfo.cpp
+++ b/src/gui/updater/updateinfo.cpp
@@ -1,5 +1,4 @@
// This file is generated by kxml_compiler from occinfo.xml.
-// All changes you do to this file will be lost.
#include "updateinfo.h"
#include "updater.h"
@@ -83,24 +82,6 @@ UpdateInfo UpdateInfo::parseElement(const QDomElement &element, bool *ok)
return result;
}
-void UpdateInfo::writeElement(QXmlStreamWriter &xml)
-{
- xml.writeStartElement(QLatin1String("owncloudclient"));
- if (!version().isEmpty()) {
- xml.writeTextElement(QLatin1String("version"), version());
- }
- if (!versionString().isEmpty()) {
- xml.writeTextElement(QLatin1String("versionstring"), versionString());
- }
- if (!web().isEmpty()) {
- xml.writeTextElement(QLatin1String("web"), web());
- }
- if (!downloadUrl().isEmpty()) {
- xml.writeTextElement(QLatin1String("downloadurl"), web());
- }
- xml.writeEndElement();
-}
-
UpdateInfo UpdateInfo::parseFile(const QString &filename, bool *ok)
{
QFile file(filename);
@@ -149,23 +130,4 @@ UpdateInfo UpdateInfo::parseString(const QString &xml, bool *ok)
return c;
}
-bool UpdateInfo::writeFile(const QString &filename)
-{
- QFile file(filename);
- if (!file.open(QIODevice::WriteOnly)) {
- qCCritical(lcUpdater) << "Unable to open file '" << filename << "'";
- return false;
- }
-
- QXmlStreamWriter xml(&file);
- xml.setAutoFormatting(true);
- xml.setAutoFormattingIndent(2);
- xml.writeStartDocument(QLatin1String("1.0"));
- writeElement(xml);
- xml.writeEndDocument();
- file.close();
-
- return true;
-}
-
} // namespace OCC
diff --git a/src/gui/updater/updateinfo.h b/src/gui/updater/updateinfo.h
index af5e76b5a..0ac00074c 100644
--- a/src/gui/updater/updateinfo.h
+++ b/src/gui/updater/updateinfo.h
@@ -1,5 +1,4 @@
// This file is generated by kxml_compiler from occinfo.xml.
-// All changes you do to this file will be lost.
#ifndef UPDATEINFO_H
#define UPDATEINFO_H
@@ -24,10 +23,8 @@ public:
Parse XML object from DOM element.
*/
static UpdateInfo parseElement(const QDomElement &element, bool *ok);
- void writeElement(QXmlStreamWriter &xml);
static UpdateInfo parseFile(const QString &filename, bool *ok);
static UpdateInfo parseString(const QString &xml, bool *ok);
- bool writeFile(const QString &filename);
private:
QString mVersion;
diff --git a/src/gui/updater/updater.cpp b/src/gui/updater/updater.cpp
index 868595a42..b6302bbd5 100644
--- a/src/gui/updater/updater.cpp
+++ b/src/gui/updater/updater.cpp
@@ -23,6 +23,7 @@
#include "theme.h"
#include "common/utility.h"
#include "version.h"
+#include "configfile.h"
#include "config.h"
@@ -40,6 +41,31 @@ Updater *Updater::instance()
return _instance;
}
+QUrl Updater::updateUrl()
+{
+ QUrl updateBaseUrl(QString::fromLocal8Bit(qgetenv("OCC_UPDATE_URL")));
+ if (updateBaseUrl.isEmpty()) {
+ updateBaseUrl = QUrl(QLatin1String(APPLICATION_UPDATE_URL));
+ }
+ if (!updateBaseUrl.isValid() || updateBaseUrl.host() == ".") {
+ return QUrl();
+ }
+
+ auto urlQuery = getQueryParams();
+
+#if defined(Q_OS_MAC) && defined(HAVE_SPARKLE)
+ urlQuery.addQueryItem(QLatin1String("sparkle"), QLatin1String("true"));
+#endif
+
+#if defined(Q_OS_WIN)
+ urlQuery.addQueryItem(QLatin1String("msi"), QLatin1String("true"));
+#endif
+
+ updateBaseUrl.setQuery(urlQuery);
+
+ return updateBaseUrl;
+}
+
QUrlQuery Updater::getQueryParams()
{
QUrlQuery query;
@@ -65,14 +91,10 @@ QUrlQuery Updater::getQueryParams()
QString suffix = QString::fromLatin1(MIRALL_STRINGIFY(MIRALL_VERSION_SUFFIX));
query.addQueryItem(QLatin1String("versionsuffix"), suffix);
- if (suffix.startsWith("daily")
- || suffix.startsWith("nightly")
- || suffix.startsWith("alpha")
- || suffix.startsWith("rc")
- || suffix.startsWith("beta")) {
- query.addQueryItem(QLatin1String("channel"), "beta");
- // FIXME: Provide a checkbox in UI to enable regular versions to switch
- // to beta channel
+
+ auto channel = ConfigFile().updateChannel();
+ if (channel != "stable") {
+ query.addQueryItem(QLatin1String("channel"), channel);
}
return query;
@@ -99,30 +121,20 @@ QString Updater::getSystemInfo()
// To test, cmake with -DAPPLICATION_UPDATE_URL="http://127.0.0.1:8080/test.rss"
Updater *Updater::create()
{
- QUrl updateBaseUrl(QString::fromLocal8Bit(qgetenv("OCC_UPDATE_URL")));
- if (updateBaseUrl.isEmpty()) {
- updateBaseUrl = QUrl(QLatin1String(APPLICATION_UPDATE_URL));
- }
- if (!updateBaseUrl.isValid() || updateBaseUrl.host() == ".") {
+ auto url = updateUrl();
+ if (url.isEmpty()) {
qCWarning(lcUpdater) << "Not a valid updater URL, will not do update check";
return 0;
}
- auto urlQuery = getQueryParams();
-
#if defined(Q_OS_MAC) && defined(HAVE_SPARKLE)
- urlQuery.addQueryItem(QLatin1String("sparkle"), QLatin1String("true"));
-#endif
-
- updateBaseUrl.setQuery(urlQuery);
-
-#if defined(Q_OS_MAC) && defined(HAVE_SPARKLE)
- return new SparkleUpdater(updateBaseUrl.toString());
+ return new SparkleUpdater(url);
#elif defined(Q_OS_WIN32)
- // the best we can do is notify about updates
- return new NSISUpdater(updateBaseUrl);
+ // Also for MSI
+ return new NSISUpdater(url);
#else
- return new PassiveUpdateNotifier(QUrl(updateBaseUrl));
+ // the best we can do is notify about updates
+ return new PassiveUpdateNotifier(url);
#endif
}
diff --git a/src/gui/updater/updater.h b/src/gui/updater/updater.h
index 04d18ac85..4e9d47812 100644
--- a/src/gui/updater/updater.h
+++ b/src/gui/updater/updater.h
@@ -37,6 +37,7 @@ public:
};
static Updater *instance();
+ static QUrl updateUrl();
virtual void checkForUpdate() = 0;
virtual void backgroundCheckForUpdate() = 0;
diff --git a/src/gui/wizard/owncloudadvancedsetuppage.cpp b/src/gui/wizard/owncloudadvancedsetuppage.cpp
index 9257918dd..e60f2770e 100644
--- a/src/gui/wizard/owncloudadvancedsetuppage.cpp
+++ b/src/gui/wizard/owncloudadvancedsetuppage.cpp
@@ -17,6 +17,7 @@
#include <QFileDialog>
#include <QUrl>
#include <QTimer>
+#include <QMessageBox>
#include "QProgressIndicator.h"
@@ -50,7 +51,7 @@ OwncloudAdvancedSetupPage::OwncloudAdvancedSetupPage()
registerField(QLatin1String("OCSyncFromScratch"), _ui.cbSyncFromScratch);
- _ui.resultLayout->addWidget(_progressIndi);
+ _ui.errorScrollContents->layout()->addWidget(_progressIndi);
stopSpinner();
setupCustomization();
@@ -59,7 +60,9 @@ OwncloudAdvancedSetupPage::OwncloudAdvancedSetupPage()
connect(_ui.rSyncEverything, &QAbstractButton::clicked, this, &OwncloudAdvancedSetupPage::slotSyncEverythingClicked);
connect(_ui.rSelectiveSync, &QAbstractButton::clicked, this, &OwncloudAdvancedSetupPage::slotSelectiveSyncClicked);
+ connect(_ui.rVirtualFileSync, &QAbstractButton::clicked, this, &OwncloudAdvancedSetupPage::slotVirtualFileSyncClicked);
connect(_ui.bSelectiveSync, &QAbstractButton::clicked, this, &OwncloudAdvancedSetupPage::slotSelectiveSyncClicked);
+ connect(_ui.rManualFolder, &QAbstractButton::clicked, this, [this] { setRadioChecked(_ui.rManualFolder); });
QIcon appIcon = theme->applicationIcon();
_ui.lServerIcon->setText(QString());
@@ -102,6 +105,19 @@ void OwncloudAdvancedSetupPage::initializePage()
{
WizardCommon::initErrorLabel(_ui.errorLabel);
+ auto labelSizeHint = _ui.errorLabel->minimumSizeHint();
+ _ui.errorScroll->setMinimumSize(
+ labelSizeHint.width(),
+ qMax<int>(1.3 * labelSizeHint.height(), _progressIndi->height()));
+
+ if (!Theme::instance()->showVirtualFilesOption()) {
+ // If the layout were wrapped in a widget, the auto-grouping of the
+ // radio buttons no longer works and there are surprising margins.
+ // Just manually hide the button and remove the layout.
+ _ui.rVirtualFileSync->hide();
+ _ui.wSyncStrategy->layout()->removeItem(_ui.lVirtualFileSync);
+ }
+
_checking = false;
_ui.lSelectiveSyncSizeLabel->setText(QString());
_ui.lSyncEverythingSizeLabel->setText(QString());
@@ -126,6 +142,7 @@ void OwncloudAdvancedSetupPage::initializePage()
if (Theme::instance()->wizardSelectiveSyncDefaultNothing()) {
_selectiveSyncBlacklist = QStringList("/");
+ setRadioChecked(_ui.rSelectiveSync);
QTimer::singleShot(0, this, &OwncloudAdvancedSetupPage::slotSelectiveSyncClicked);
}
@@ -170,8 +187,6 @@ void OwncloudAdvancedSetupPage::updateStatus()
}
_ui.syncModeLabel->setText(t);
- _ui.syncModeLabel->setFixedHeight(_ui.syncModeLabel->sizeHint().height());
- wizard()->resize(wizard()->sizeHint());
setErrorString(errorStr);
emit completeChanged();
}
@@ -184,14 +199,12 @@ bool OwncloudAdvancedSetupPage::dataChanged()
void OwncloudAdvancedSetupPage::startSpinner()
{
- _ui.resultLayout->setEnabled(true);
_progressIndi->setVisible(true);
_progressIndi->startAnimation();
}
void OwncloudAdvancedSetupPage::stopSpinner()
{
- _ui.resultLayout->setEnabled(false);
_progressIndi->setVisible(false);
_progressIndi->stopAnimation();
}
@@ -222,6 +235,16 @@ QStringList OwncloudAdvancedSetupPage::selectiveSyncBlacklist() const
return _selectiveSyncBlacklist;
}
+bool OwncloudAdvancedSetupPage::useVirtualFileSync() const
+{
+ return _ui.rVirtualFileSync->isChecked();
+}
+
+bool OwncloudAdvancedSetupPage::manualFolderConfig() const
+{
+ return _ui.rManualFolder->isChecked();
+}
+
bool OwncloudAdvancedSetupPage::isConfirmBigFolderChecked() const
{
return _ui.rSyncEverything->isChecked() && _ui.confCheckBoxSize->isChecked();
@@ -292,9 +315,6 @@ void OwncloudAdvancedSetupPage::slotSelectFolder()
void OwncloudAdvancedSetupPage::slotSelectiveSyncClicked()
{
- // Because clicking on it also changes it, restore it to the previous state in case the user cancelled the dialog
- _ui.rSyncEverything->setChecked(_selectiveSyncBlacklist.isEmpty());
-
AccountPtr acc = static_cast<OwncloudWizard *>(wizard())->account();
SelectiveSyncDialog *dlg = new SelectiveSyncDialog(acc, _remoteFolder, _selectiveSyncBlacklist, this);
@@ -317,7 +337,7 @@ void OwncloudAdvancedSetupPage::slotSelectiveSyncClicked()
if (updateBlacklist) {
if (!_selectiveSyncBlacklist.isEmpty()) {
_ui.rSelectiveSync->blockSignals(true);
- _ui.rSelectiveSync->setChecked(true);
+ setRadioChecked(_ui.rSelectiveSync);
_ui.rSelectiveSync->blockSignals(false);
auto s = dlg->estimatedSize();
if (s > 0) {
@@ -326,17 +346,29 @@ void OwncloudAdvancedSetupPage::slotSelectiveSyncClicked()
_ui.lSelectiveSyncSizeLabel->setText(QString());
}
} else {
- _ui.rSyncEverything->setChecked(true);
+ setRadioChecked(_ui.rSyncEverything);
_ui.lSelectiveSyncSizeLabel->setText(QString());
}
wizard()->setProperty("blacklist", _selectiveSyncBlacklist);
}
}
+void OwncloudAdvancedSetupPage::slotVirtualFileSyncClicked()
+{
+ OwncloudWizard::askExperimentalVirtualFilesFeature([this](bool enable) {
+ if (!enable)
+ return;
+
+ _ui.lSelectiveSyncSizeLabel->setText(QString());
+ _selectiveSyncBlacklist.clear();
+ setRadioChecked(_ui.rVirtualFileSync);
+ });
+}
+
void OwncloudAdvancedSetupPage::slotSyncEverythingClicked()
{
_ui.lSelectiveSyncSizeLabel->setText(QString());
- _ui.rSyncEverything->setChecked(true);
+ setRadioChecked(_ui.rSyncEverything);
_selectiveSyncBlacklist.clear();
}
@@ -345,4 +377,18 @@ void OwncloudAdvancedSetupPage::slotQuotaRetrieved(const QVariantMap &result)
_ui.lSyncEverythingSizeLabel->setText(tr("(%1)").arg(Utility::octetsToString(result["size"].toDouble())));
}
+void OwncloudAdvancedSetupPage::setRadioChecked(QRadioButton *radio)
+{
+ // We don't want clicking the radio buttons to immediately adjust the checked state
+ // for selective sync and virtual file sync, so we keep them uncheckable until
+ // they should be checked.
+ radio->setCheckable(true);
+ radio->setChecked(true);
+
+ if (radio != _ui.rSelectiveSync)
+ _ui.rSelectiveSync->setCheckable(false);
+ if (radio != _ui.rVirtualFileSync)
+ _ui.rVirtualFileSync->setCheckable(false);
+}
+
} // namespace OCC
diff --git a/src/gui/wizard/owncloudadvancedsetuppage.h b/src/gui/wizard/owncloudadvancedsetuppage.h
index a51c51b1b..e5f0aea4f 100644
--- a/src/gui/wizard/owncloudadvancedsetuppage.h
+++ b/src/gui/wizard/owncloudadvancedsetuppage.h
@@ -41,6 +41,8 @@ public:
bool validatePage() Q_DECL_OVERRIDE;
QString localFolder() const;
QStringList selectiveSyncBlacklist() const;
+ bool useVirtualFileSync() const;
+ bool manualFolderConfig() const;
bool isConfirmBigFolderChecked() const;
void setRemoteFolder(const QString &remoteFolder);
void setMultipleFoldersExist(bool exist);
@@ -56,9 +58,12 @@ private slots:
void slotSelectFolder();
void slotSyncEverythingClicked();
void slotSelectiveSyncClicked();
+ void slotVirtualFileSyncClicked();
void slotQuotaRetrieved(const QVariantMap &result);
private:
+ void setRadioChecked(QRadioButton *radio);
+
void setupCustomization();
void updateStatus();
bool dataChanged();
diff --git a/src/gui/wizard/owncloudadvancedsetuppage.ui b/src/gui/wizard/owncloudadvancedsetuppage.ui
index a36704c38..b490eacf0 100644
--- a/src/gui/wizard/owncloudadvancedsetuppage.ui
+++ b/src/gui/wizard/owncloudadvancedsetuppage.ui
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>912</width>
- <height>633</height>
+ <width>917</width>
+ <height>604</height>
</rect>
</property>
<property name="sizePolicy">
@@ -227,7 +227,7 @@
</widget>
</item>
<item row="0" column="1" colspan="2">
- <widget class="QWidget" name="widget" native="true">
+ <widget class="QWidget" name="wSyncStrategy" native="true">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="leftMargin">
<number>0</number>
@@ -240,7 +240,7 @@
<item>
<widget class="QRadioButton" name="rSyncEverything">
<property name="text">
- <string>S&amp;ync everything from server</string>
+ <string>S&amp;ynchronize everything from server (recommended)</string>
</property>
<property name="checked">
<bool>true</bool>
@@ -343,6 +343,9 @@
<property name="text">
<string/>
</property>
+ <property name="checkable">
+ <bool>false</bool>
+ </property>
</widget>
</item>
<item>
@@ -377,19 +380,81 @@
</item>
</layout>
</item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_40">
+ <item>
+ <widget class="QRadioButton" name="rManualFolder">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>Manually create folder sync connections </string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_5">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="lVirtualFileSync">
+ <item>
+ <widget class="QRadioButton" name="rVirtualFileSync">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Use virtual files instead of downloading content immediately (e&amp;xperimental)</string>
+ </property>
+ <property name="checkable">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_6">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
</layout>
</widget>
</item>
</layout>
</item>
<item>
- <widget class="QLabel" name="errorLabel">
- <property name="text">
- <string>TextLabel</string>
- </property>
- </widget>
- </item>
- <item>
<widget class="QLabel" name="syncModeLabel">
<property name="text">
<string>Status message</string>
@@ -406,7 +471,54 @@
</widget>
</item>
<item>
- <layout class="QHBoxLayout" name="resultLayout"/>
+ <widget class="QScrollArea" name="errorScroll">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="horizontalScrollBarPolicy">
+ <enum>Qt::ScrollBarAlwaysOff</enum>
+ </property>
+ <property name="widgetResizable">
+ <bool>true</bool>
+ </property>
+ <widget class="QWidget" name="errorScrollContents">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>899</width>
+ <height>68</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_6">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="errorLabel">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
</item>
<item>
<widget class="QLabel" name="bottomLabel">
@@ -420,6 +532,19 @@
</item>
</layout>
</widget>
+ <tabstops>
+ <tabstop>rSyncEverything</tabstop>
+ <tabstop>confCheckBoxSize</tabstop>
+ <tabstop>confSpinBox</tabstop>
+ <tabstop>confCheckBoxExternal</tabstop>
+ <tabstop>rSelectiveSync</tabstop>
+ <tabstop>bSelectiveSync</tabstop>
+ <tabstop>rManualFolder</tabstop>
+ <tabstop>rVirtualFileSync</tabstop>
+ <tabstop>pbSelectLocalFolder</tabstop>
+ <tabstop>radioButton</tabstop>
+ <tabstop>cbSyncFromScratch</tabstop>
+ </tabstops>
<resources/>
<connections>
<connection>
@@ -449,8 +574,8 @@
<y>83</y>
</hint>
<hint type="destinationlabel">
- <x>952</x>
- <y>134</y>
+ <x>864</x>
+ <y>147</y>
</hint>
</hints>
</connection>
@@ -465,8 +590,8 @@
<y>76</y>
</hint>
<hint type="destinationlabel">
- <x>1076</x>
- <y>136</y>
+ <x>902</x>
+ <y>147</y>
</hint>
</hints>
</connection>
@@ -486,5 +611,69 @@
</hint>
</hints>
</connection>
+ <connection>
+ <sender>rManualFolder</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>pbSelectLocalFolder</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>197</x>
+ <y>269</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>219</x>
+ <y>404</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>rManualFolder</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>resolutionWidget</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>260</x>
+ <y>266</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>443</x>
+ <y>437</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>rManualFolder</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>lLocal</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>163</x>
+ <y>267</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>88</x>
+ <y>438</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>rManualFolder</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>lLocalIcon</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>551</x>
+ <y>262</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>54</x>
+ <y>400</y>
+ </hint>
+ </hints>
+ </connection>
</connections>
</ui>
diff --git a/src/gui/wizard/owncloudoauthcredspage.cpp b/src/gui/wizard/owncloudoauthcredspage.cpp
index 6d9ed4c75..9f4bb5ede 100644
--- a/src/gui/wizard/owncloudoauthcredspage.cpp
+++ b/src/gui/wizard/owncloudoauthcredspage.cpp
@@ -13,6 +13,8 @@
*/
#include <QVariant>
+#include <QMenu>
+#include <QClipboard>
#include "wizard/owncloudoauthcredspage.h"
#include "theme.h"
@@ -45,9 +47,20 @@ OwncloudOAuthCredsPage::OwncloudOAuthCredsPage()
connect(_ui.openLinkButton, &QCommandLinkButton::clicked, [this] {
_ui.errorLabel->hide();
+ qobject_cast<OwncloudWizard *>(wizard())->account()->clearCookieJar(); // #6574
if (_asyncAuth)
_asyncAuth->openBrowser();
});
+ _ui.openLinkButton->setContextMenuPolicy(Qt::CustomContextMenu);
+ QObject::connect(_ui.openLinkButton, &QWidget::customContextMenuRequested, [this](const QPoint &pos) {
+ auto menu = new QMenu(_ui.openLinkButton);
+ menu->addAction(tr("Copy link to clipboard"), this, [this] {
+ if (_asyncAuth)
+ QApplication::clipboard()->setText(_asyncAuth->authorisationLink().toString(QUrl::FullyEncoded));
+ });
+ menu->setAttribute(Qt::WA_DeleteOnClose);
+ menu->popup(_ui.openLinkButton->mapToGlobal(pos));
+ });
}
void OwncloudOAuthCredsPage::initializePage()
diff --git a/src/gui/wizard/owncloudsetuppage.cpp b/src/gui/wizard/owncloudsetuppage.cpp
index 90c9a6c67..14fc63a89 100644
--- a/src/gui/wizard/owncloudsetuppage.cpp
+++ b/src/gui/wizard/owncloudsetuppage.cpp
@@ -221,12 +221,19 @@ QString OwncloudSetupPage::url() const
bool OwncloudSetupPage::validatePage()
{
if (!_authTypeKnown) {
+ QString u = url();
+ QUrl qurl(u);
+ if (!qurl.isValid() || qurl.host().isEmpty()) {
+ setErrorString(tr("Invalid URL"), false);
+ return false;
+ }
+
setErrorString(QString(), false);
_checking = true;
startSpinner();
emit completeChanged();
- emit determineAuthType(url());
+ emit determineAuthType(u);
return false;
} else {
// connecting is running
diff --git a/src/gui/wizard/owncloudwizard.cpp b/src/gui/wizard/owncloudwizard.cpp
index 991b5fc18..0840bdfa1 100644
--- a/src/gui/wizard/owncloudwizard.cpp
+++ b/src/gui/wizard/owncloudwizard.cpp
@@ -14,6 +14,7 @@
*/
#include "account.h"
+#include "config.h"
#include "configfile.h"
#include "theme.h"
@@ -31,6 +32,7 @@
#include <QtCore>
#include <QtGui>
+#include <QMessageBox>
#include <stdlib.h>
@@ -77,7 +79,6 @@ OwncloudWizard::OwncloudWizard(QWidget *parent)
#endif
connect(_advancedSetupPage, &OwncloudAdvancedSetupPage::createLocalAndRemoteFolders,
this, &OwncloudWizard::createLocalAndRemoteFolders);
- connect(this, &QWizard::customButtonClicked, this, &OwncloudWizard::skipFolderConfiguration);
Theme *theme = Theme::instance();
@@ -90,7 +91,6 @@ OwncloudWizard::OwncloudWizard(QWidget *parent)
setOption(QWizard::NoCancelButton);
setTitleFormat(Qt::RichText);
setSubTitleFormat(Qt::RichText);
- setButtonText(QWizard::CustomButton1, tr("Skip folders configuration"));
}
void OwncloudWizard::setAccount(AccountPtr account)
@@ -113,6 +113,16 @@ QStringList OwncloudWizard::selectiveSyncBlacklist() const
return _advancedSetupPage->selectiveSyncBlacklist();
}
+bool OwncloudWizard::useVirtualFileSync() const
+{
+ return _advancedSetupPage->useVirtualFileSync();
+}
+
+bool OwncloudWizard::manualFolderConfig() const
+{
+ return _advancedSetupPage->manualFolderConfig();
+}
+
bool OwncloudWizard::isConfirmBigFolderChecked() const
{
return _advancedSetupPage->isConfirmBigFolderChecked();
@@ -200,7 +210,6 @@ void OwncloudWizard::slotCurrentPageChanged(int id)
done(Accepted);
}
- setOption(QWizard::HaveCustomButton1, id == WizardCommon::Page_AdvancedSetup);
if (id == WizardCommon::Page_AdvancedSetup && _credentialsPage == _browserCredsPage) {
// For OAuth, disable the back button in the Page_AdvancedSetup because we don't want
// to re-open the browser.
@@ -245,4 +254,25 @@ AbstractCredentials *OwncloudWizard::getCredentials() const
return 0;
}
+void OwncloudWizard::askExperimentalVirtualFilesFeature(const std::function<void(bool enable)> &callback)
+{
+ auto msgBox = new QMessageBox(
+ QMessageBox::Warning,
+ tr("Enable experimental feature?"),
+ tr("When the \"virtual files\" mode is enabled no files will be downloaded initially. "
+ "Instead, a tiny \"%1\" file will be created for each file that exists on the server. "
+ "The contents can be downloaded by running these files or by using their context menu."
+ "\n\n"
+ "This is a new, experimental mode. If you decide to use it, please report any "
+ "issues that come up.")
+ .arg(APPLICATION_DOTVIRTUALFILE_SUFFIX));
+ msgBox->addButton(tr("Enable experimental mode"), QMessageBox::AcceptRole);
+ msgBox->addButton(tr("Stay safe"), QMessageBox::RejectRole);
+ connect(msgBox, &QMessageBox::finished, msgBox, [callback, msgBox](int result) {
+ callback(result == QMessageBox::AcceptRole);
+ msgBox->deleteLater();
+ });
+ msgBox->open();
+}
+
} // end namespace
diff --git a/src/gui/wizard/owncloudwizard.h b/src/gui/wizard/owncloudwizard.h
index e82817a03..eff356dda 100644
--- a/src/gui/wizard/owncloudwizard.h
+++ b/src/gui/wizard/owncloudwizard.h
@@ -63,6 +63,8 @@ public:
QString ocUrl() const;
QString localFolder() const;
QStringList selectiveSyncBlacklist() const;
+ bool useVirtualFileSync() const;
+ bool manualFolderConfig() const;
bool isConfirmBigFolderChecked() const;
void enableFinishOnResultWidget(bool enable);
@@ -70,6 +72,13 @@ public:
void displayError(const QString &, bool retryHTTPonly);
AbstractCredentials *getCredentials() const;
+ /**
+ * Shows a dialog explaining the virtual files mode and warning about it
+ * being experimental. Calles the callback with true if enabling was
+ * chosen.
+ */
+ static void askExperimentalVirtualFilesFeature(const std::function<void(bool enable)> &callback);
+
// FIXME: Can those be local variables?
// Set from the OwncloudSetupPage, later used from OwncloudHttpCredsPage
QSslKey _clientSslKey;
@@ -89,7 +98,6 @@ signals:
void createLocalAndRemoteFolders(const QString &, const QString &);
// make sure to connect to this, rather than finished(int)!!
void basicSetupFinished(int);
- void skipFolderConfiguration();
void needCertificate();
private:
diff --git a/src/libsync/CMakeLists.txt b/src/libsync/CMakeLists.txt
index 94a79c6c3..3369596d1 100644
--- a/src/libsync/CMakeLists.txt
+++ b/src/libsync/CMakeLists.txt
@@ -24,8 +24,6 @@ set(libsync_SRCS
account.cpp
bandwidthmanager.cpp
capabilities.cpp
- clientproxy.cpp
- connectionvalidator.cpp
cookiejar.cpp
discoveryphase.cpp
filesystem.cpp
@@ -51,6 +49,7 @@ set(libsync_SRCS
syncfileitem.cpp
syncfilestatus.cpp
syncfilestatustracker.cpp
+ localdiscoverytracker.cpp
syncresult.cpp
theme.cpp
creds/dummycredentials.cpp
@@ -127,7 +126,7 @@ ENDIF(NOT APPLE)
add_library(${synclib_NAME} SHARED ${libsync_SRCS})
target_link_libraries(${synclib_NAME}
- ocsync
+ "${csync_NAME}"
${OS_SPECIFIC_LINK_LIBRARIES}
Qt5::Core Qt5::Network
)
@@ -159,8 +158,6 @@ set_target_properties( ${synclib_NAME} PROPERTIES
SOVERSION ${MIRALL_SOVERSION}
RUNTIME_OUTPUT_DIRECTORY ${BIN_OUTPUT_DIRECTORY}
)
-set_target_properties( ${synclib_NAME} PROPERTIES
- INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}/${APPLICATION_EXECUTABLE};${CMAKE_INSTALL_RPATH}" )
if(NOT BUILD_OWNCLOUD_OSX_BUNDLE)
install(TARGETS ${synclib_NAME}
diff --git a/src/libsync/abstractnetworkjob.cpp b/src/libsync/abstractnetworkjob.cpp
index f3fb71670..b10a495af 100644
--- a/src/libsync/abstractnetworkjob.cpp
+++ b/src/libsync/abstractnetworkjob.cpp
@@ -27,6 +27,7 @@
#include <QMutex>
#include <QCoreApplication>
#include <QAuthenticator>
+#include <QMetaEnum>
#include "networkjobs.h"
#include "account.h"
@@ -242,6 +243,11 @@ QByteArray AbstractNetworkJob::responseTimestamp()
return _responseTimestamp;
}
+QByteArray AbstractNetworkJob::requestId()
+{
+ return _reply ? _reply->request().rawHeader("X-Request-ID") : QByteArray();
+}
+
QString AbstractNetworkJob::errorString() const
{
if (_timedout) {
@@ -308,6 +314,15 @@ void AbstractNetworkJob::onTimedOut()
}
}
+QString AbstractNetworkJob::replyStatusString() {
+ Q_ASSERT(reply());
+ if (reply()->error() == QNetworkReply::NoError) {
+ return QLatin1String("OK");
+ } else {
+ QString enumStr = QMetaEnum::fromType<QNetworkReply::NetworkError>().valueToKey(static_cast<int>(reply()->error()));
+ return QStringLiteral("%1 %2").arg(enumStr, errorString());
+ }
+}
NetworkJobTimeoutPauser::NetworkJobTimeoutPauser(QNetworkReply *reply)
{
diff --git a/src/libsync/abstractnetworkjob.h b/src/libsync/abstractnetworkjob.h
index b49f72282..6f61d26fd 100644
--- a/src/libsync/abstractnetworkjob.h
+++ b/src/libsync/abstractnetworkjob.h
@@ -69,6 +69,8 @@ public:
bool followRedirects() const { return _followRedirects; }
QByteArray responseTimestamp();
+ /* Content of the X-Request-ID header. (Only set after the request is sent) */
+ QByteArray requestId();
qint64 timeoutMsec() const { return _timer.interval(); }
bool timedOut() const { return _timedout; }
@@ -173,6 +175,8 @@ protected:
// GET requests that don't set up any HTTP body or other flags.
bool _followRedirects;
+ QString replyStatusString();
+
private slots:
void slotFinished();
void slotTimeout();
diff --git a/src/libsync/accessmanager.cpp b/src/libsync/accessmanager.cpp
index fdfa6758a..43f4ff9de 100644
--- a/src/libsync/accessmanager.cpp
+++ b/src/libsync/accessmanager.cpp
@@ -93,9 +93,8 @@ QNetworkReply *AccessManager::createRequest(QNetworkAccessManager::Operation op,
qInfo(lcAccessManager) << op << verb << newRequest.url().toString() << "has X-Request-ID" << requestId;
newRequest.setRawHeader("X-Request-ID", requestId);
-#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)
- // only enable HTTP2 with Qt 5.9 because Qt 5.8.0 has too many bugs
- // (only use one connection if the server does not support HTTP2)
+#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 4)
+ // only enable HTTP2 with Qt 5.9.4 because old Qt have too many bugs (e.g. QTBUG-64359 is fixed in >= Qt 5.9.4)
if (newRequest.url().scheme() == "https") { // Not for "http": QTBUG-61397
newRequest.setAttribute(QNetworkRequest::HTTP2AllowedAttribute, true);
}
diff --git a/src/libsync/account.cpp b/src/libsync/account.cpp
index 7907ea530..809a0820d 100644
--- a/src/libsync/account.cpp
+++ b/src/libsync/account.cpp
@@ -463,7 +463,8 @@ bool Account::serverVersionUnsupported() const
// not detected yet, assume it is fine.
return false;
}
- return serverVersionInt() < makeServerVersion(7, 0, 0);
+ // Older version which is not "end of life" according to https://github.com/owncloud/core/wiki/Maintenance-and-Release-Schedule
+ return serverVersionInt() < makeServerVersion(10, 0, 0) || serverVersion().endsWith("Nextcloud");
}
void Account::setServerVersion(const QString &version)
diff --git a/src/libsync/account.h b/src/libsync/account.h
index 025dca907..a7879f4d0 100644
--- a/src/libsync/account.h
+++ b/src/libsync/account.h
@@ -218,7 +218,7 @@ public:
/** Detects a specific bug in older server versions */
bool rootEtagChangesNotOnlySubFolderEtags();
- /** True when the server supports HTTP2 */
+ /** True when the server connection is using HTTP2 */
bool isHttp2Supported() { return _http2Supported; }
void setHttp2Supported(bool value) { _http2Supported = value; }
diff --git a/src/libsync/configfile.cpp b/src/libsync/configfile.cpp
index 1c05124c5..939e144fa 100644
--- a/src/libsync/configfile.cpp
+++ b/src/libsync/configfile.cpp
@@ -16,8 +16,10 @@
#include "configfile.h"
#include "theme.h"
+#include "version.h"
#include "common/utility.h"
#include "common/asserts.h"
+#include "version.h"
#include "creds/abstractcredentials.h"
@@ -58,12 +60,16 @@ static const char optionalDesktopNoficationsC[] = "optionalDesktopNotifications"
static const char showInExplorerNavigationPaneC[] = "showInExplorerNavigationPane";
static const char skipUpdateCheckC[] = "skipUpdateCheck";
static const char updateCheckIntervalC[] = "updateCheckInterval";
+static const char updateChannelC[] = "updateChannel";
static const char geometryC[] = "geometry";
static const char timeoutC[] = "timeout";
static const char chunkSizeC[] = "chunkSize";
static const char minChunkSizeC[] = "minChunkSize";
static const char maxChunkSizeC[] = "maxChunkSize";
static const char targetChunkUploadDurationC[] = "targetChunkUploadDuration";
+static const char automaticLogDirC[] = "logToTemporaryLogDir";
+static const char showExperimentalOptionsC[] = "showExperimentalOptions";
+static const char clientVersionC[] = "clientVersion";
static const char proxyHostC[] = "Proxy/host";
static const char proxyTypeC[] = "Proxy/type";
@@ -342,6 +348,28 @@ QString ConfigFile::excludeFileFromSystem()
return fi.absoluteFilePath();
}
+QString ConfigFile::backup() const
+{
+ QString baseFile = configFile();
+ auto versionString = clientVersionString();
+ if (!versionString.isEmpty())
+ versionString.prepend('_');
+ QString backupFile =
+ QString("%1.backup_%2%3")
+ .arg(baseFile)
+ .arg(QDateTime::currentDateTime().toString("yyyyMMdd_HHmmss"))
+ .arg(versionString);
+
+ // If this exact file already exists it's most likely that a backup was
+ // already done. (two backup calls directly after each other, potentially
+ // even with source alterations in between!)
+ if (!QFile::exists(backupFile)) {
+ QFile f(baseFile);
+ f.copy(backupFile);
+ }
+ return backupFile;
+}
+
QString ConfigFile::configFile() const
{
return configPath() + Theme::instance()->configFileName();
@@ -517,6 +545,28 @@ void ConfigFile::setSkipUpdateCheck(bool skip, const QString &connection)
settings.sync();
}
+QString ConfigFile::updateChannel() const
+{
+ QString defaultUpdateChannel = QStringLiteral("stable");
+ QString suffix = QString::fromLatin1(MIRALL_STRINGIFY(MIRALL_VERSION_SUFFIX));
+ if (suffix.startsWith("daily")
+ || suffix.startsWith("nightly")
+ || suffix.startsWith("alpha")
+ || suffix.startsWith("rc")
+ || suffix.startsWith("beta")) {
+ defaultUpdateChannel = QStringLiteral("beta");
+ }
+
+ QSettings settings(configFile(), QSettings::IniFormat);
+ return settings.value(QLatin1String(updateChannelC), defaultUpdateChannel).toString();
+}
+
+void ConfigFile::setUpdateChannel(const QString &channel)
+{
+ QSettings settings(configFile(), QSettings::IniFormat);
+ settings.setValue(QLatin1String(updateChannelC), channel);
+}
+
int ConfigFile::maxLogLines() const
{
QSettings settings(configFile(), QSettings::IniFormat);
@@ -761,6 +811,24 @@ void ConfigFile::setCrashReporter(bool enabled)
settings.setValue(QLatin1String(crashReporterC), enabled);
}
+bool ConfigFile::automaticLogDir() const
+{
+ QSettings settings(configFile(), QSettings::IniFormat);
+ return settings.value(QLatin1String(automaticLogDirC), false).toBool();
+}
+
+void ConfigFile::setAutomaticLogDir(bool enabled)
+{
+ QSettings settings(configFile(), QSettings::IniFormat);
+ settings.setValue(QLatin1String(automaticLogDirC), enabled);
+}
+
+bool ConfigFile::showExperimentalOptions() const
+{
+ QSettings settings(configFile(), QSettings::IniFormat);
+ return settings.value(QLatin1String(showExperimentalOptionsC), false).toBool();
+}
+
QString ConfigFile::certificatePath() const
{
return retrieveData(QString(), QLatin1String(certPath)).toString();
@@ -785,6 +853,18 @@ void ConfigFile::setCertificatePasswd(const QString &cPasswd)
settings.sync();
}
+QString ConfigFile::clientVersionString() const
+{
+ QSettings settings(configFile(), QSettings::IniFormat);
+ return settings.value(QLatin1String(clientVersionC), QString()).toString();
+}
+
+void ConfigFile::setClientVersionString(const QString &version)
+{
+ QSettings settings(configFile(), QSettings::IniFormat);
+ settings.setValue(QLatin1String(clientVersionC), version);
+}
+
Q_GLOBAL_STATIC(QString, g_configFileName)
std::unique_ptr<QSettings> ConfigFile::settingsWithGroup(const QString &group, QObject *parent)
diff --git a/src/libsync/configfile.h b/src/libsync/configfile.h
index 6422f34e0..be6e417d5 100644
--- a/src/libsync/configfile.h
+++ b/src/libsync/configfile.h
@@ -48,6 +48,13 @@ public:
QString excludeFile(Scope scope) const;
static QString excludeFileFromSystem(); // doesn't access config dir
+ /**
+ * Creates a backup of the file
+ *
+ * Returns the path of the new backup.
+ */
+ QString backup() const;
+
bool exists();
QString defaultConnection() const;
@@ -89,6 +96,12 @@ public:
bool crashReporter() const;
void setCrashReporter(bool enabled);
+ bool automaticLogDir() const;
+ void setAutomaticLogDir(bool enabled);
+
+ // Whether experimental UI options should be shown
+ bool showExperimentalOptions() const;
+
// proxy settings
void setProxyType(int proxyType,
const QString &host = QString(),
@@ -152,6 +165,9 @@ public:
bool skipUpdateCheck(const QString &connection = QString()) const;
void setSkipUpdateCheck(bool, const QString &);
+ QString updateChannel() const;
+ void setUpdateChannel(const QString &channel);
+
void saveGeometryHeader(QHeaderView *header);
void restoreGeometryHeader(QHeaderView *header);
@@ -160,6 +176,11 @@ public:
QString certificatePasswd() const;
void setCertificatePasswd(const QString &cPasswd);
+ /** The client version that last used this settings file.
+ Updated by configVersionMigration() at client startup. */
+ QString clientVersionString() const;
+ void setClientVersionString(const QString &version);
+
/** Returns a new settings pre-set in a specific group. The Settings will be created
with the given parent. If no parent is specified, the caller must destroy the settings */
static std::unique_ptr<QSettings> settingsWithGroup(const QString &group, QObject *parent = 0);
diff --git a/src/libsync/creds/httpcredentials.cpp b/src/libsync/creds/httpcredentials.cpp
index ca1fa7ba1..aaa0a8209 100644
--- a/src/libsync/creds/httpcredentials.cpp
+++ b/src/libsync/creds/httpcredentials.cpp
@@ -117,6 +117,7 @@ HttpCredentials::HttpCredentials(const QString &user, const QString &password, c
, _clientSslKey(key)
, _clientSslCertificate(certificate)
, _keychainMigration(false)
+ , _retryOnKeyChainError(false)
{
}
@@ -219,6 +220,21 @@ void HttpCredentials::deleteOldKeychainEntries()
void HttpCredentials::slotReadClientCertPEMJobDone(QKeychain::Job *incoming)
{
+#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC)
+ Q_ASSERT(!incoming->insecureFallback()); // If insecureFallback is set, the next test would be pointless
+ if (_retryOnKeyChainError && (incoming->error() == QKeychain::NoBackendAvailable
+ || incoming->error() == QKeychain::OtherError)) {
+ // Could be that the backend was not yet available. Wait some extra seconds.
+ // (Issues #4274 and #6522)
+ // (For kwallet, the error is OtherError instead of NoBackendAvailable, maybe a bug in QtKeychain)
+ qCInfo(lcHttpCredentials) << "Backend unavailable (yet?) Retrying in a few seconds." << incoming->errorString();
+ QTimer::singleShot(10000, this, &HttpCredentials::fetchFromKeychainHelper);
+ _retryOnKeyChainError = false;
+ return;
+ }
+ _retryOnKeyChainError = false;
+#endif
+
// Store PEM in memory
ReadPasswordJob *readJob = static_cast<ReadPasswordJob *>(incoming);
if (readJob->error() == NoError && readJob->binaryData().length() > 0) {
@@ -363,11 +379,12 @@ bool HttpCredentials::refreshAccessToken()
QJsonParseError jsonParseError;
QJsonObject json = QJsonDocument::fromJson(jsonData, &jsonParseError).object();
QString accessToken = json["access_token"].toString();
- if (reply->error() != QNetworkReply::NoError || jsonParseError.error != QJsonParseError::NoError || json.isEmpty()) {
- // Network error maybe?
+ if (jsonParseError.error != QJsonParseError::NoError || json.isEmpty()) {
+ // Invalid or empty JSON: Network error maybe?
qCWarning(lcHttpCredentials) << "Error while refreshing the token" << reply->errorString() << jsonData << jsonParseError.errorString();
} else if (accessToken.isEmpty()) {
- // The token is no longer valid.
+ // If the json was valid, but the reply did not contain an access token, the token
+ // is considered expired. (Usually the HTTP reply code is 400)
qCDebug(lcHttpCredentials) << "Expired refresh token. Logging out";
_refreshToken.clear();
} else {
diff --git a/src/libsync/creds/httpcredentials.h b/src/libsync/creds/httpcredentials.h
index 4ed8c114b..b71edf6ca 100644
--- a/src/libsync/creds/httpcredentials.h
+++ b/src/libsync/creds/httpcredentials.h
@@ -141,6 +141,7 @@ protected:
QSslKey _clientSslKey;
QSslCertificate _clientSslCertificate;
bool _keychainMigration;
+ bool _retryOnKeyChainError = true; // true if we haven't done yet any reading from keychain
};
diff --git a/src/libsync/discoveryphase.cpp b/src/libsync/discoveryphase.cpp
index 8496225fe..df6869a67 100644
--- a/src/libsync/discoveryphase.cpp
+++ b/src/libsync/discoveryphase.cpp
@@ -90,7 +90,7 @@ int DiscoveryJob::isInSelectiveSyncBlackListCallback(void *data, const QByteArra
bool DiscoveryJob::checkSelectiveSyncNewFolder(const QString &path, RemotePermissions remotePerm)
{
- if (_syncOptions._confirmExternalStorage
+ if (_syncOptions._confirmExternalStorage && !_syncOptions._newFilesAreVirtual
&& remotePerm.hasPermission(RemotePermissions::IsMounted)) {
// external storage.
@@ -113,7 +113,7 @@ bool DiscoveryJob::checkSelectiveSyncNewFolder(const QString &path, RemotePermis
}
auto limit = _syncOptions._newBigFolderSizeLimit;
- if (limit < 0) {
+ if (limit < 0 || _syncOptions._newFilesAreVirtual) {
// no limit, everything is allowed;
return false;
}
@@ -301,10 +301,8 @@ void DiscoverySingleDirectoryJob::abort()
}
}
-static std::unique_ptr<csync_file_stat_t> propertyMapToFileStat(const QMap<QString, QString> &map)
+static void propertyMapToFileStat(const QMap<QString, QString> &map, csync_file_stat_t *file_stat)
{
- std::unique_ptr<csync_file_stat_t> file_stat(new csync_file_stat_t);
-
for (auto it = map.constBegin(); it != map.constEnd(); ++it) {
QString property = it.key();
QString value = it.value();
@@ -317,10 +315,13 @@ static std::unique_ptr<csync_file_stat_t> propertyMapToFileStat(const QMap<QStri
} else if (property == "getlastmodified") {
file_stat->modtime = oc_httpdate_parse(value.toUtf8());
} else if (property == "getcontentlength") {
+ // See #4573, sometimes negative size values are returned
bool ok = false;
qlonglong ll = value.toLongLong(&ok);
if (ok && ll >= 0) {
file_stat->size = ll;
+ } else {
+ file_stat->size = 0;
}
} else if (property == "getetag") {
file_stat->etag = Utility::normalizeEtag(value.toUtf8());
@@ -331,7 +332,7 @@ static std::unique_ptr<csync_file_stat_t> propertyMapToFileStat(const QMap<QStri
} else if (property == "dDC") {
file_stat->directDownloadCookies = value.toUtf8();
} else if (property == "permissions") {
- file_stat->remotePerm = RemotePermissions(value);
+ file_stat->remotePerm = RemotePermissions::fromServerString(value);
} else if (property == "checksums") {
file_stat->checksumHeader = findBestChecksum(value.toUtf8());
} else if (property == "share-types" && !value.isEmpty()) {
@@ -349,7 +350,6 @@ static std::unique_ptr<csync_file_stat_t> propertyMapToFileStat(const QMap<QStri
file_stat->remotePerm.setPermission(RemotePermissions::HasZSyncMetadata);
}
}
- return file_stat;
}
void DiscoverySingleDirectoryJob::directoryListingIteratedSlot(QString file, const QMap<QString, QString> &map)
@@ -358,12 +358,16 @@ void DiscoverySingleDirectoryJob::directoryListingIteratedSlot(QString file, con
// The first entry is for the folder itself, we should process it differently.
_ignoredFirst = true;
if (map.contains("permissions")) {
- RemotePermissions perm(map.value("permissions"));
+ auto perm = RemotePermissions::fromServerString(map.value("permissions"));
emit firstDirectoryPermissions(perm);
_isExternalStorage = perm.hasPermission(RemotePermissions::IsMounted);
}
if (map.contains("data-fingerprint")) {
_dataFingerprint = map.value("data-fingerprint").toUtf8();
+ if (_dataFingerprint.isEmpty()) {
+ // Placeholder that means that the server supports the feature even if it did not set one.
+ _dataFingerprint = "[empty]";
+ }
}
} else {
// Remove <webDAV-Url>/folder/ from <webDAV-Url>/folder/subfile.txt
@@ -377,12 +381,24 @@ void DiscoverySingleDirectoryJob::directoryListingIteratedSlot(QString file, con
file = file.remove(0, 1);
}
-
- std::unique_ptr<csync_file_stat_t> file_stat(propertyMapToFileStat(map));
+ std::unique_ptr<csync_file_stat_t> file_stat(new csync_file_stat_t);
file_stat->path = file.toUtf8();
- if (file_stat->etag.isEmpty()) {
- qCCritical(lcDiscovery) << "etag of" << file_stat->path << "is" << file_stat->etag << "This must not happen.";
+ file_stat->size = -1;
+ propertyMapToFileStat(map, file_stat.get());
+ if (file_stat->type == ItemTypeDirectory)
+ file_stat->size = 0;
+ if (file_stat->type == ItemTypeSkip
+ || file_stat->size == -1
+ || file_stat->remotePerm.isNull()
+ || file_stat->etag.isEmpty()
+ || file_stat->file_id.isEmpty()) {
+ _error = tr("The server file discovery reply is missing data.");
+ qCWarning(lcDiscovery)
+ << "Missing properties:" << file << file_stat->type << file_stat->size
+ << file_stat->modtime << file_stat->remotePerm.toString()
+ << file_stat->etag << file_stat->file_id;
}
+
if (_isExternalStorage && file_stat->remotePerm.hasPermission(RemotePermissions::IsMounted)) {
/* All the entries in a external storage have 'M' in their permission. However, for all
purposes in the desktop client, we only need to know about the mount points.
@@ -417,6 +433,10 @@ void DiscoverySingleDirectoryJob::lsJobFinishedWithoutErrorSlot()
emit finishedWithError(ERRNO_WRONG_CONTENT, QLatin1String("Server error: PROPFIND reply is not XML formatted!"));
deleteLater();
return;
+ } else if (!_error.isEmpty()) {
+ emit finishedWithError(ERRNO_WRONG_CONTENT, _error);
+ deleteLater();
+ return;
}
emit etag(_firstEtag);
emit etagConcatenation(_etagConcatenation);
@@ -473,8 +493,7 @@ void DiscoveryMainThread::doOpendirSlot(const QString &subPath, DiscoveryDirecto
fullPath.chop(1);
}
- // emit _discoveryJob->folderDiscovered(false, subPath);
- _discoveryJob->update_job_update_callback(false, subPath.toUtf8(), _discoveryJob);
+ _discoveryJob->update_job_update_callback(/*local=*/false, subPath.toUtf8(), _discoveryJob);
// Result gets written in there
_currentDiscoveryDirectoryResult = r;
@@ -649,7 +668,7 @@ csync_vio_handle_t *DiscoveryJob::remote_vio_opendir_hook(const char *url,
qCDebug(lcDiscovery) << directoryResult->code << "when opening" << url << "msg=" << directoryResult->msg;
errno = directoryResult->code;
// save the error string to the context
- discoveryJob->_csync_ctx->error_string = qstrdup(directoryResult->msg.toUtf8().constData());
+ discoveryJob->_csync_ctx->error_string = directoryResult->msg;
return NULL;
}
diff --git a/src/libsync/discoveryphase.h b/src/libsync/discoveryphase.h
index b5e743d33..238f1e822 100644
--- a/src/libsync/discoveryphase.h
+++ b/src/libsync/discoveryphase.h
@@ -91,6 +91,8 @@ private:
bool _isRootPath;
// If this directory is an external storage (The first item has 'M' in its permission)
bool _isExternalStorage;
+ // If set, the discovery will finish with an error
+ QString _error;
QPointer<LsColJob> _lsColJob;
public:
diff --git a/src/libsync/localdiscoverytracker.cpp b/src/libsync/localdiscoverytracker.cpp
new file mode 100644
index 000000000..0e69c69ad
--- /dev/null
+++ b/src/libsync/localdiscoverytracker.cpp
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) by Christian Kamm <mail@ckamm.de>
+ *
+ * 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 "localdiscoverytracker.h"
+
+#include "syncfileitem.h"
+
+#include <QLoggingCategory>
+
+using namespace OCC;
+
+Q_LOGGING_CATEGORY(lcLocalDiscoveryTracker, "sync.localdiscoverytracker", QtInfoMsg)
+
+LocalDiscoveryTracker::LocalDiscoveryTracker()
+{
+}
+
+void LocalDiscoveryTracker::addTouchedPath(const QByteArray &relativePath)
+{
+ qCDebug(lcLocalDiscoveryTracker) << "inserted touched" << relativePath;
+ _localDiscoveryPaths.insert(relativePath);
+}
+
+void LocalDiscoveryTracker::startSyncFullDiscovery()
+{
+ _localDiscoveryPaths.clear();
+ _previousLocalDiscoveryPaths.clear();
+ qCDebug(lcLocalDiscoveryTracker) << "full discovery";
+}
+
+void LocalDiscoveryTracker::startSyncPartialDiscovery()
+{
+ if (lcLocalDiscoveryTracker().isDebugEnabled()) {
+ QByteArrayList paths;
+ for (auto &path : _localDiscoveryPaths)
+ paths.append(path);
+ qCDebug(lcLocalDiscoveryTracker) << "partial discovery with paths: " << paths;
+ }
+
+ _previousLocalDiscoveryPaths = std::move(_localDiscoveryPaths);
+ _localDiscoveryPaths.clear();
+}
+
+const std::set<QByteArray> &LocalDiscoveryTracker::localDiscoveryPaths() const
+{
+ return _localDiscoveryPaths;
+}
+
+void LocalDiscoveryTracker::slotItemCompleted(const SyncFileItemPtr &item)
+{
+ // For successes, we want to wipe the file from the list to ensure we don't
+ // rediscover it even if this overall sync fails.
+ //
+ // For failures, we want to add the file to the list so the next sync
+ // will be able to retry it.
+ if (item->_status == SyncFileItem::Success
+ || item->_status == SyncFileItem::FileIgnored
+ || item->_status == SyncFileItem::Restoration
+ || item->_status == SyncFileItem::Conflict
+ || (item->_status == SyncFileItem::NoStatus
+ && (item->_instruction == CSYNC_INSTRUCTION_NONE
+ || item->_instruction == CSYNC_INSTRUCTION_UPDATE_METADATA))) {
+ if (_previousLocalDiscoveryPaths.erase(item->_file.toUtf8()))
+ qCDebug(lcLocalDiscoveryTracker) << "wiped successful item" << item->_file;
+ } else {
+ _localDiscoveryPaths.insert(item->_file.toUtf8());
+ qCDebug(lcLocalDiscoveryTracker) << "inserted error item" << item->_file;
+ }
+}
+
+void LocalDiscoveryTracker::slotSyncFinished(bool success)
+{
+ if (success) {
+ qCDebug(lcLocalDiscoveryTracker) << "sync success, forgetting last sync's local discovery path list";
+ } else {
+ // On overall-failure we can't forget about last sync's local discovery
+ // paths yet, reuse them for the next sync again.
+ // C++17: Could use std::set::merge().
+ _localDiscoveryPaths.insert(
+ _previousLocalDiscoveryPaths.begin(), _previousLocalDiscoveryPaths.end());
+ qCDebug(lcLocalDiscoveryTracker) << "sync failed, keeping last sync's local discovery path list";
+ }
+ _previousLocalDiscoveryPaths.clear();
+}
diff --git a/src/libsync/localdiscoverytracker.h b/src/libsync/localdiscoverytracker.h
new file mode 100644
index 000000000..913365913
--- /dev/null
+++ b/src/libsync/localdiscoverytracker.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) by Christian Kamm <mail@ckamm.de>
+ *
+ * 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.
+ */
+
+#ifndef LOCALDISCOVERYTRACKER_H
+#define LOCALDISCOVERYTRACKER_H
+
+#include "owncloudlib.h"
+#include <set>
+#include <QObject>
+#include <QByteArray>
+#include <QSharedPointer>
+
+namespace OCC {
+
+class SyncFileItem;
+typedef QSharedPointer<SyncFileItem> SyncFileItemPtr;
+
+/**
+ * @brief Tracks files that must be rediscovered locally
+ *
+ * It does this by being notified about
+ * - modified files (addTouchedPath(), from file watcher)
+ * - starting syncs (startSync*())
+ * - finished items (slotItemCompleted(), by SyncEngine signal)
+ * - finished syncs (slotSyncFinished(), by SyncEngine signal)
+ *
+ * Then localDiscoveryPaths() can be used to determine paths to rediscover
+ * and send to SyncEngine::setLocalDiscoveryOptions().
+ *
+ * This class is primarily used from Folder and separate primarily for
+ * readability and testing purposes.
+ *
+ * All paths used in this class are expected to be utf8 encoded byte arrays,
+ * relative to the folder that is being synced, without a starting slash.
+ *
+ * @ingroup libsync
+ */
+class OWNCLOUDSYNC_EXPORT LocalDiscoveryTracker : public QObject
+{
+ Q_OBJECT
+public:
+ LocalDiscoveryTracker();
+
+ /** Adds a path that must be locally rediscovered later.
+ *
+ * This should be a full relative file path, example:
+ * foo/bar/file.txt
+ */
+ void addTouchedPath(const QByteArray &relativePath);
+
+ /** Call when a sync run starts that rediscovers all local files */
+ void startSyncFullDiscovery();
+
+ /** Call when a sync using localDiscoveryPaths() starts */
+ void startSyncPartialDiscovery();
+
+ /** Access list of files that shall be locally rediscovered. */
+ const std::set<QByteArray> &localDiscoveryPaths() const;
+
+public slots:
+ /**
+ * Success and failure of sync items adjust what the next sync is
+ * supposed to do.
+ */
+ void slotItemCompleted(const SyncFileItemPtr &item);
+
+ /**
+ * When a sync finishes, the lists must be updated
+ */
+ void slotSyncFinished(bool success);
+
+private:
+ /**
+ * The paths that should be checked by the next local discovery.
+ *
+ * Mostly a collection of files the filewatchers have reported as touched.
+ * Also includes files that have had errors in the last sync run.
+ */
+ std::set<QByteArray> _localDiscoveryPaths;
+
+ /**
+ * The paths that the current sync run used for local discovery.
+ *
+ * For failing syncs, this list will be merged into _localDiscoveryPaths
+ * again when the sync is done to make sure everything is retried.
+ */
+ std::set<QByteArray> _previousLocalDiscoveryPaths;
+};
+
+} // namespace OCC
+
+#endif
diff --git a/src/libsync/logger.cpp b/src/libsync/logger.cpp
index cfba000ed..67cf23a85 100644
--- a/src/libsync/logger.cpp
+++ b/src/libsync/logger.cpp
@@ -14,11 +14,17 @@
#include "logger.h"
+#include "config.h"
+
#include <QDir>
#include <QStringList>
#include <QThread>
#include <qmetaobject.h>
+#ifdef ZLIB_FOUND
+#include <zlib.h>
+#endif
+
namespace OCC {
static void mirallLogCatcher(QtMsgType type, const QMessageLogContext &ctx, const QString &message)
@@ -95,10 +101,15 @@ void Logger::log(Log log)
*/
bool Logger::isNoop() const
{
- QMutexLocker lock(const_cast<QMutex *>(&_mutex));
+ QMutexLocker lock(&_mutex);
return !_logstream && !_logWindowActivated;
}
+bool Logger::isLoggingToFile() const
+{
+ QMutexLocker lock(&_mutex);
+ return _logstream;
+}
void Logger::doLog(const QString &msg)
{
@@ -181,34 +192,103 @@ void Logger::setLogDebug(bool debug)
_logDebug = debug;
}
+QString Logger::temporaryFolderLogDirPath() const
+{
+ QString dirName = APPLICATION_SHORTNAME + QString("-logdir");
+ return QDir::temp().filePath(dirName);
+}
+
+void Logger::setupTemporaryFolderLogDir()
+{
+ auto dir = temporaryFolderLogDirPath();
+ if (!QDir().mkpath(dir))
+ return;
+ setLogDebug(true);
+ setLogExpire(4 /*hours*/);
+ setLogDir(dir);
+ _temporaryFolderLogDir = true;
+}
+
+void Logger::disableTemporaryFolderLogDir()
+{
+ if (!_temporaryFolderLogDir)
+ return;
+
+ enterNextLogFile();
+ setLogDir(QString());
+ setLogDebug(false);
+ setLogFile(QString());
+ _temporaryFolderLogDir = false;
+}
+
+static bool compressLog(const QString &originalName, const QString &targetName)
+{
+#ifdef ZLIB_FOUND
+ QFile original(originalName);
+ if (!original.open(QIODevice::ReadOnly))
+ return false;
+ auto compressed = gzopen(targetName.toUtf8(), "wb");
+ if (!compressed) {
+ return false;
+ }
+
+ while (!original.atEnd()) {
+ auto data = original.read(1024 * 1024);
+ auto written = gzwrite(compressed, data.data(), data.size());
+ if (written != data.size()) {
+ gzclose(compressed);
+ return false;
+ }
+ }
+ gzclose(compressed);
+ return true;
+#else
+ return false;
+#endif
+}
+
void Logger::enterNextLogFile()
{
if (!_logDirectory.isEmpty()) {
+
QDir dir(_logDirectory);
if (!dir.exists()) {
dir.mkpath(".");
}
- // Find out what is the file with the highest number if any
- QStringList files = dir.entryList(QStringList("owncloud.log.*"),
+ // Tentative new log name, will be adjusted if one like this already exists
+ QDateTime now = QDateTime::currentDateTime();
+ QString newLogName = now.toString("yyyyMMdd_HHmm") + "_owncloud.log";
+
+ // Expire old log files and deal with conflicts
+ QStringList files = dir.entryList(QStringList("*owncloud.log.*"),
QDir::Files);
- QRegExp rx("owncloud.log.(\\d+)");
- uint maxNumber = 0;
- QDateTime now = QDateTime::currentDateTimeUtc();
+ QRegExp rx(R"(.*owncloud\.log\.(\d+).*)");
+ int maxNumber = -1;
foreach (const QString &s, files) {
- if (rx.exactMatch(s)) {
- maxNumber = qMax(maxNumber, rx.cap(1).toUInt());
- if (_logExpire > 0) {
- QFileInfo fileInfo = dir.absoluteFilePath(s);
- if (fileInfo.lastModified().addSecs(60 * 60 * _logExpire) < now) {
- dir.remove(s);
- }
+ if (_logExpire > 0) {
+ QFileInfo fileInfo(dir.absoluteFilePath(s));
+ if (fileInfo.lastModified().addSecs(60 * 60 * _logExpire) < now) {
+ dir.remove(s);
}
}
+ if (s.startsWith(newLogName) && rx.exactMatch(s)) {
+ maxNumber = qMax(maxNumber, rx.cap(1).toInt());
+ }
}
+ newLogName.append("." + QString::number(maxNumber + 1));
+
+ auto previousLog = _logFile.fileName();
+ setLogFile(dir.filePath(newLogName));
- QString filename = _logDirectory + "/owncloud.log." + QString::number(maxNumber + 1);
- setLogFile(filename);
+ if (!previousLog.isEmpty()) {
+ QString compressedName = previousLog + ".gz";
+ if (compressLog(previousLog, compressedName)) {
+ QFile::remove(previousLog);
+ } else {
+ QFile::remove(compressedName);
+ }
+ }
}
}
diff --git a/src/libsync/logger.h b/src/libsync/logger.h
index 9d6ef6b26..7ae278e49 100644
--- a/src/libsync/logger.h
+++ b/src/libsync/logger.h
@@ -43,6 +43,8 @@ class OWNCLOUDSYNC_EXPORT Logger : public QObject
Q_OBJECT
public:
bool isNoop() const;
+ bool isLoggingToFile() const;
+
void log(Log log);
void doLog(const QString &log);
@@ -65,6 +67,22 @@ public:
bool logDebug() const { return _logDebug; }
void setLogDebug(bool debug);
+ /** Returns where the automatic logdir would be */
+ QString temporaryFolderLogDirPath() const;
+
+ /** Sets up default dir log setup.
+ *
+ * logdir: a temporary folder
+ * logexpire: 4 hours
+ * logdebug: true
+ *
+ * Used in conjunction with ConfigFile::automaticLogDir
+ */
+ void setupTemporaryFolderLogDir();
+
+ /** For switching off via logwindow */
+ void disableTemporaryFolderLogDir();
+
signals:
void logWindowLog(const QString &);
@@ -86,8 +104,9 @@ private:
int _logExpire;
bool _logDebug;
QScopedPointer<QTextStream> _logstream;
- QMutex _mutex;
+ mutable QMutex _mutex;
QString _logDirectory;
+ bool _temporaryFolderLogDir = false;
};
} // namespace OCC
diff --git a/src/libsync/networkjobs.cpp b/src/libsync/networkjobs.cpp
index 6e9007af4..614a68778 100644
--- a/src/libsync/networkjobs.cpp
+++ b/src/libsync/networkjobs.cpp
@@ -90,8 +90,7 @@ void RequestEtagJob::start()
bool RequestEtagJob::finished()
{
qCInfo(lcEtagJob) << "Request Etag of" << reply()->request().url() << "FINISHED WITH STATUS"
- << reply()->error()
- << (reply()->error() == QNetworkReply::NoError ? QLatin1String("") : errorString());
+ << replyStatusString();
if (reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute) == 207) {
// Parse DAV response
@@ -148,8 +147,7 @@ void MkColJob::start()
bool MkColJob::finished()
{
qCInfo(lcMkColJob) << "MKCOL of" << reply()->request().url() << "FINISHED WITH STATUS"
- << reply()->error()
- << (reply()->error() == QNetworkReply::NoError ? QLatin1String("") : errorString());
+ << replyStatusString();
emit finished(reply()->error());
return true;
@@ -355,8 +353,7 @@ void LsColJob::start()
bool LsColJob::finished()
{
qCInfo(lcLsColJob) << "LSCOL of" << reply()->request().url() << "FINISHED WITH STATUS"
- << reply()->error()
- << (reply()->error() == QNetworkReply::NoError ? QLatin1String("") : errorString());
+ << replyStatusString();
QString contentType = reply()->header(QNetworkRequest::ContentTypeHeader).toString();
int httpCode = reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
@@ -426,7 +423,7 @@ void CheckServerJob::onTimedOut()
QString CheckServerJob::version(const QJsonObject &info)
{
- return info.value(QLatin1String("version")).toString();
+ return info.value(QLatin1String("version")).toString() + "-" + info.value(QLatin1String("productname")).toString();
}
QString CheckServerJob::versionString(const QJsonObject &info)
@@ -581,8 +578,7 @@ QList<QByteArray> PropfindJob::properties() const
bool PropfindJob::finished()
{
qCInfo(lcPropfindJob) << "PROPFIND of" << reply()->request().url() << "FINISHED WITH STATUS"
- << reply()->error()
- << (reply()->error() == QNetworkReply::NoError ? QLatin1String("") : errorString());
+ << replyStatusString();
int http_result_code = reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
@@ -743,8 +739,7 @@ QMap<QByteArray, QByteArray> ProppatchJob::properties() const
bool ProppatchJob::finished()
{
qCInfo(lcProppatchJob) << "PROPPATCH of" << reply()->request().url() << "FINISHED WITH STATUS"
- << reply()->error()
- << (reply()->error() == QNetworkReply::NoError ? QLatin1String("") : errorString());
+ << replyStatusString();
int http_result_code = reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
@@ -803,8 +798,7 @@ void JsonApiJob::start()
bool JsonApiJob::finished()
{
qCInfo(lcJsonApiJob) << "JsonApiJob of" << reply()->request().url() << "FINISHED WITH STATUS"
- << reply()->error()
- << (reply()->error() == QNetworkReply::NoError ? QLatin1String("") : errorString());
+ << replyStatusString();
int statusCode = 0;
@@ -878,6 +872,10 @@ void DetermineAuthTypeJob::start()
_resultGet = Shibboleth;
get->setFollowRedirects(false);
}
+#else
+ Q_UNUSED(this)
+ Q_UNUSED(get)
+ Q_UNUSED(target)
#endif
});
connect(get, &SimpleNetworkJob::finishedSignal, this, [this]() {
diff --git a/src/libsync/owncloudpropagator.cpp b/src/libsync/owncloudpropagator.cpp
index cb547a443..8950c5284 100644
--- a/src/libsync/owncloudpropagator.cpp
+++ b/src/libsync/owncloudpropagator.cpp
@@ -141,6 +141,7 @@ static SyncJournalErrorBlacklistRecord createBlacklistEntry(
entry._lastTryTime = Utility::qDateTimeToTime_t(QDateTime::currentDateTimeUtc());
entry._renameTarget = item._renameTarget;
entry._retryCount = old._retryCount + 1;
+ entry._requestId = item._requestId;
static qint64 minBlacklistTime(getMinBlacklistTime());
static qint64 maxBlacklistTime(qMax(getMaxBlacklistTime(), minBlacklistTime));
@@ -286,60 +287,6 @@ void PropagateItemJob::done(SyncFileItem::Status statusArg, const QString &error
}
}
-/**
- * For delete or remove, check that we are not removing from a shared directory.
- * If we are, try to restore the file
- *
- * Return true if the problem is handled.
- */
-bool PropagateItemJob::checkForProblemsWithShared(int httpStatusCode, const QString &msg)
-{
- PropagateItemJob *newJob = NULL;
-
- if (httpStatusCode == 403 && propagator()->isInSharedDirectory(_item->_file)) {
- if (!_item->isDirectory()) {
- SyncFileItemPtr downloadItem(new SyncFileItem(*_item));
- if (downloadItem->_instruction == CSYNC_INSTRUCTION_NEW
- || downloadItem->_instruction == CSYNC_INSTRUCTION_TYPE_CHANGE) {
- // don't try to recover pushing new files
- return false;
- } else if (downloadItem->_instruction == CSYNC_INSTRUCTION_SYNC) {
- // we modified the file locally, just create a conflict then
- downloadItem->_instruction = CSYNC_INSTRUCTION_CONFLICT;
-
- // HACK to avoid continuation: See task #1448: We do not know the _modtime from the
- // server, at this point, so just set the current one. (rather than the one locally)
- downloadItem->_modtime = Utility::qDateTimeToTime_t(QDateTime::currentDateTimeUtc());
- } else {
- // the file was removed or renamed, just recover the old one
- downloadItem->_instruction = CSYNC_INSTRUCTION_SYNC;
- }
- downloadItem->_direction = SyncFileItem::Down;
- newJob = new PropagateDownloadFile(propagator(), downloadItem);
- } else {
- // Directories are harder to recover.
- // But just re-create the directory, next sync will be able to recover the files
- SyncFileItemPtr mkdirItem(new SyncFileItem(*_item));
- mkdirItem->_instruction = CSYNC_INSTRUCTION_NEW;
- mkdirItem->_direction = SyncFileItem::Down;
- newJob = new PropagateLocalMkdir(propagator(), mkdirItem);
- // Also remove the inodes and fileid from the db so no further renames are tried for
- // this item.
- propagator()->_journal->avoidRenamesOnNextSync(_item->_file);
- propagator()->_anotherSyncNeeded = true;
- }
- if (newJob) {
- newJob->setRestoreJobMsg(msg);
- _restoreJob.reset(newJob);
- connect(_restoreJob.data(), &PropagatorJob::finished,
- this, &PropagateItemJob::slotRestoreJobFinished);
- QMetaObject::invokeMethod(newJob, "start");
- }
- return true;
- }
- return false;
-}
-
void PropagateItemJob::slotRestoreJobFinished(SyncFileItem::Status status)
{
QString msg;
@@ -559,23 +506,6 @@ void OwncloudPropagator::setSyncOptions(const SyncOptions &syncOptions)
_chunkSize = syncOptions._initialChunkSize;
}
-// ownCloud server < 7.0 did not had permissions so we need some other euristics
-// to detect wrong doing in a Shared directory
-bool OwncloudPropagator::isInSharedDirectory(const QString &file)
-{
- bool re = false;
- if (_remoteFolder.startsWith(QLatin1String("Shared"))) {
- // The Shared directory is synced as its own sync connection
- re = true;
- } else {
- if (file.startsWith("Shared/") || file == "Shared") {
- // The whole ownCloud is synced and Shared is always a top dir
- re = true;
- }
- }
- return re;
-}
-
bool OwncloudPropagator::localFileNameClash(const QString &relFile)
{
bool re = false;
@@ -588,8 +518,7 @@ bool OwncloudPropagator::localFileNameClash(const QString &relFile)
re = false;
qCWarning(lcPropagator) << "No valid fileinfo";
} else {
- // Need to normalize to composited form because of
- // https://bugreports.qt-project.org/browse/QTBUG-39622
+ // Need to normalize to composited form because of QTBUG-39622/QTBUG-55896
const QString cName = fileInfo.canonicalFilePath().normalized(QString::NormalizationForm_C);
bool equal = (file == cName);
re = (!equal && !cName.endsWith(relFile, Qt::CaseSensitive));
@@ -661,6 +590,11 @@ QString OwncloudPropagator::getFilePath(const QString &tmp_file_name) const
return _localDir + tmp_file_name;
}
+QString OwncloudPropagator::addVirtualFileSuffix(const QString &fileName) const
+{
+ return fileName + _syncOptions._virtualFileSuffix;
+}
+
void OwncloudPropagator::scheduleNextJob()
{
QTimer::singleShot(0, this, &OwncloudPropagator::scheduleNextJobImpl);
@@ -737,8 +671,11 @@ bool OwncloudPropagator::createConflict(const SyncFileItemPtr &item,
QString renameError;
auto conflictModTime = FileSystem::getModTime(fn);
+ QString conflictUserName;
+ if (account()->capabilities().uploadConflictFiles())
+ conflictUserName = account()->davDisplayName();
QString conflictFileName = Utility::makeConflictFileName(
- item->_file, Utility::qDateTimeFromTime_t(conflictModTime));
+ item->_file, Utility::qDateTimeFromTime_t(conflictModTime), conflictUserName);
QString conflictFilePath = getFilePath(conflictFileName);
emit touchedFile(fn);
@@ -763,6 +700,7 @@ bool OwncloudPropagator::createConflict(const SyncFileItemPtr &item,
ConflictRecord conflictRecord;
conflictRecord.path = conflictFileName.toUtf8();
conflictRecord.baseModtime = item->_previousModtime;
+ conflictRecord.initialBasePath = item->_file.toUtf8();
SyncJournalFileRecord baseRecord;
if (_journal->getFileRecord(item->_originalFile, &baseRecord) && baseRecord.isValid()) {
@@ -908,10 +846,13 @@ void PropagatorCompositeJob::slotSubJobFinished(SyncFileItem::Status status)
ASSERT(i >= 0);
_runningJobs.remove(i);
+ // Any sub job error will cause the whole composite to fail. This is important
+ // for knowing whether to update the etag in PropagateDirectory, for example.
if (status == SyncFileItem::FatalError
|| status == SyncFileItem::NormalError
|| status == SyncFileItem::SoftError
- || status == SyncFileItem::DetailError) {
+ || status == SyncFileItem::DetailError
+ || status == SyncFileItem::BlacklistedError) {
_hasError = status;
}
diff --git a/src/libsync/owncloudpropagator.h b/src/libsync/owncloudpropagator.h
index 4ac313cbc..b3c6542ee 100644
--- a/src/libsync/owncloudpropagator.h
+++ b/src/libsync/owncloudpropagator.h
@@ -156,9 +156,7 @@ class PropagateItemJob : public PropagatorJob
{
Q_OBJECT
protected:
- void done(SyncFileItem::Status status, const QString &errorString = QString());
-
- bool checkForProblemsWithShared(int httpStatusCode, const QString &msg);
+ virtual void done(SyncFileItem::Status status, const QString &errorString = QString());
/*
* set a custom restore job message that is used if the restore job succeeded.
@@ -436,8 +434,6 @@ public:
/* The maximum number of active jobs in parallel */
int hardMaximumActiveJob();
- bool isInSharedDirectory(const QString &file);
-
/** Check whether a download would clash with an existing file
* in filesystems that are only case-preserving.
*/
@@ -455,6 +451,7 @@ public:
bool hasCaseClashAccessibilityProblem(const QString &relfile);
QString getFilePath(const QString &tmp_file_name) const;
+ QString addVirtualFileSuffix(const QString &fileName) const;
/** Creates the job for an item.
*/
diff --git a/src/libsync/owncloudpropagator_p.h b/src/libsync/owncloudpropagator_p.h
index eb4a0e181..4983e570a 100644
--- a/src/libsync/owncloudpropagator_p.h
+++ b/src/libsync/owncloudpropagator_p.h
@@ -64,6 +64,12 @@ inline SyncFileItem::Status classifyError(QNetworkReply::NetworkError nerror,
{
Q_ASSERT(nerror != QNetworkReply::NoError); // we should only be called when there is an error
+ if (nerror == QNetworkReply::RemoteHostClosedError) {
+ // Sometimes server bugs lead to a connection close on certain files,
+ // that shouldn't bring the rest of the syncing to a halt.
+ return SyncFileItem::NormalError;
+ }
+
if (nerror > QNetworkReply::NoError && nerror <= QNetworkReply::UnknownProxyError) {
// network error or proxy error -> fatal
return SyncFileItem::FatalError;
diff --git a/src/libsync/owncloudtheme.cpp b/src/libsync/owncloudtheme.cpp
index 873257c19..1e142b962 100644
--- a/src/libsync/owncloudtheme.cpp
+++ b/src/libsync/owncloudtheme.cpp
@@ -19,8 +19,6 @@
#ifndef TOKEN_AUTH_ONLY
#include <QPixmap>
#include <QIcon>
-#include <QStyle>
-#include <QApplication>
#endif
#include <QCoreApplication>
@@ -35,63 +33,13 @@ ownCloudTheme::ownCloudTheme()
{
}
-QString ownCloudTheme::configFileName() const
-{
- return QLatin1String("owncloud.cfg");
-}
-
-QString ownCloudTheme::about() const
-{
- QString devString;
- devString = tr("<p>Version %2. For more information visit <a href=\"%3\">https://%4</a></p>"
- "<p>For known issues and help, please visit: <a href=\"https://central.owncloud.org/c/desktop-client\">https://central.owncloud.org</a></p>"
- "<p><small>By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, "
- " Jan-Christoph Borchardt, and others.</small></p>"
- "<p>Copyright ownCloud GmbH</p>"
- "<p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>"
- "ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH "
- "in the United States, other countries, or both.</p>")
- .arg(Utility::escape(MIRALL_VERSION_STRING),
- Utility::escape("https://" MIRALL_STRINGIFY(APPLICATION_DOMAIN)),
- Utility::escape(MIRALL_STRINGIFY(APPLICATION_DOMAIN)));
-
- devString += gitSHA1();
- return devString;
-}
-
#ifndef TOKEN_AUTH_ONLY
-QIcon ownCloudTheme::trayFolderIcon(const QString &) const
-{
- QPixmap fallback = qApp->style()->standardPixmap(QStyle::SP_FileDialogNewFolder);
- return QIcon::fromTheme("folder", fallback);
-}
-
-QIcon ownCloudTheme::applicationIcon() const
-{
- return themeIcon(QLatin1String("owncloud-icon"));
-}
-
-
-QVariant ownCloudTheme::customMedia(Theme::CustomMediaType type)
+QVariant ownCloudTheme::customMedia(CustomMediaType)
{
- if (type == Theme::oCSetupTop) {
- // return QCoreApplication::translate("ownCloudTheme",
- // "If you don't have an ownCloud server yet, "
- // "see <a href=\"https://owncloud.com\">owncloud.com</a> for more info.",
- // "Top text in setup wizard. Keep short!");
- return QVariant();
- } else {
- return QVariant();
- }
+ return QVariant();
}
-
#endif
-QString ownCloudTheme::helpUrl() const
-{
- return QString::fromLatin1("https://doc.owncloud.org/desktop/%1.%2/").arg(MIRALL_VERSION_MAJOR).arg(MIRALL_VERSION_MINOR);
-}
-
#ifndef TOKEN_AUTH_ONLY
QColor ownCloudTheme::wizardHeaderBackgroundColor() const
{
@@ -109,14 +57,4 @@ QPixmap ownCloudTheme::wizardHeaderLogo() const
}
#endif
-
-QString ownCloudTheme::appName() const
-{
- return QLatin1String("ownCloud");
-}
-
-QString ownCloudTheme::appNameGUI() const
-{
- return QLatin1String("ownCloud");
-}
}
diff --git a/src/libsync/owncloudtheme.h b/src/libsync/owncloudtheme.h
index 327c96e5f..cd1b5c2c3 100644
--- a/src/libsync/owncloudtheme.h
+++ b/src/libsync/owncloudtheme.h
@@ -28,18 +28,6 @@ class ownCloudTheme : public Theme
Q_OBJECT
public:
ownCloudTheme();
-
- QString configFileName() const Q_DECL_OVERRIDE;
- QString about() const Q_DECL_OVERRIDE;
-
-#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;
-
- QString helpUrl() const Q_DECL_OVERRIDE;
#ifndef TOKEN_AUTH_ONLY
QVariant customMedia(CustomMediaType type) Q_DECL_OVERRIDE;
@@ -48,6 +36,9 @@ public:
QPixmap wizardHeaderLogo() const Q_DECL_OVERRIDE;
#endif
+ // For owncloud-brandings *do* show the virtual files option.
+ bool showVirtualFilesOption() const override { return true; }
+
private:
};
}
diff --git a/src/libsync/progressdispatcher.cpp b/src/libsync/progressdispatcher.cpp
index 204b7dc49..dcdf841c3 100644
--- a/src/libsync/progressdispatcher.cpp
+++ b/src/libsync/progressdispatcher.cpp
@@ -139,7 +139,8 @@ void ProgressInfo::reset()
_status = Starting;
_currentItems.clear();
- _currentDiscoveredFolder.clear();
+ _currentDiscoveredRemoteFolder.clear();
+ _currentDiscoveredLocalFolder.clear();
_sizeProgress = Progress();
_fileProgress = Progress();
_totalSizeOfCompletedJobs = 0;
diff --git a/src/libsync/progressdispatcher.h b/src/libsync/progressdispatcher.h
index 6ceb35783..53a65e2c7 100644
--- a/src/libsync/progressdispatcher.h
+++ b/src/libsync/progressdispatcher.h
@@ -199,7 +199,8 @@ public:
SyncFileItem _lastCompletedItem;
// Used during local and remote update phase
- QString _currentDiscoveredFolder;
+ QString _currentDiscoveredRemoteFolder;
+ QString _currentDiscoveredLocalFolder;
void setProgressComplete(const SyncFileItem &item);
@@ -313,6 +314,11 @@ signals:
*/
void syncError(const QString &folder, const QString &message, ErrorCategory category);
+ /**
+ * @brief Emitted for a folder when a sync is done, listing all pending conflicts
+ */
+ void folderConflicts(const QString &folder, const QStringList &conflictPaths);
+
protected:
void setProgressInfo(const QString &folder, const ProgressInfo &progress);
diff --git a/src/libsync/propagatedownload.cpp b/src/libsync/propagatedownload.cpp
index a441914bd..248eacb40 100644
--- a/src/libsync/propagatedownload.cpp
+++ b/src/libsync/propagatedownload.cpp
@@ -133,6 +133,7 @@ void GETFileJob::newReplyHook(QNetworkReply *reply)
connect(reply, &QNetworkReply::metaDataChanged, this, &GETFileJob::slotMetaDataChanged);
connect(reply, &QIODevice::readyRead, this, &GETFileJob::slotReadyRead);
+ connect(reply, &QNetworkReply::finished, this, &GETFileJob::slotReadyRead);
connect(reply, &QNetworkReply::downloadProgress, this, &GETFileJob::downloadProgress);
}
@@ -151,6 +152,9 @@ void GETFileJob::slotMetaDataChanged()
// If the status code isn't 2xx, don't write the reply body to the file.
// For any error: handle it when the job is finished, not here.
if (httpStatus / 100 != 2) {
+ // Disable the buffer limit, as we don't limit the bandwidth for error messages.
+ // (We are only going to do a readAll() at the end.)
+ reply()->setReadBufferSize(0);
_device->close();
return;
}
@@ -254,7 +258,7 @@ void GETFileJob::slotReadyRead()
int bufferSize = qMin(1024 * 8ll, reply()->bytesAvailable());
QByteArray buffer(bufferSize, Qt::Uninitialized);
- while (reply()->bytesAvailable() > 0) {
+ while (reply()->bytesAvailable() > 0 && _saveBodyToFile) {
if (_bandwidthChoked) {
qCWarning(lcGetJob) << "Download choked";
break;
@@ -278,7 +282,7 @@ void GETFileJob::slotReadyRead()
return;
}
- if (_device->isOpen() && _saveBodyToFile) {
+ if (_device->isOpen()) {
qint64 w = _device->write(buffer.constData(), r);
if (w != r) {
_errorString = _device->errorString();
@@ -290,15 +294,14 @@ void GETFileJob::slotReadyRead()
}
}
- if (reply()->isFinished() && reply()->bytesAvailable() == 0) {
+ if (reply()->isFinished() && (reply()->bytesAvailable() == 0 || !_saveBodyToFile)) {
qCDebug(lcGetJob) << "Actually finished!";
if (_bandwidthManager) {
_bandwidthManager->unregisterDownloadJob(this);
}
if (!_hasEmittedFinishedSignal) {
qCInfo(lcGetJob) << "GET of" << reply()->request().url().toString() << "FINISHED WITH STATUS"
- << reply()->error()
- << (reply()->error() == QNetworkReply::NoError ? QLatin1String("") : errorString())
+ << replyStatusString()
<< reply()->rawHeader("Content-Range") << reply()->rawHeader("Content-Length");
emit finishedSignal();
@@ -334,6 +337,21 @@ void PropagateDownloadFile::start()
qCDebug(lcPropagateDownload) << _item->_file << propagator()->_activeJobList.count();
_stopwatch.start();
+ // For virtual files just create the file and be done
+ if (_item->_type == ItemTypeVirtualFile) {
+ auto fn = propagator()->getFilePath(_item->_file);
+ qCDebug(lcPropagateDownload) << "creating virtual file" << fn;
+
+ // NOTE: Other places might depend on contents of placeholder files (like csync_update)
+ QFile file(fn);
+ file.open(QFile::ReadWrite | QFile::Truncate);
+ file.write(" ");
+ file.close();
+ FileSystem::setModTime(fn, _item->_modtime);
+ updateMetadata(false);
+ return;
+ }
+
if (_deleteExisting) {
deleteExistingFolder();
@@ -561,6 +579,10 @@ void PropagateDownloadFile::slotGetFinished()
GETJob *job = _job;
ASSERT(job);
+ _item->_httpErrorCode = job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
+ _item->_responseTimeStamp = job->responseTimestamp();
+ _item->_requestId = job->requestId();
+
SyncFileItem::Status status = job->errorStatus();
// Needed because GETFileZsyncJob may emit finishedSignal without any further network activity
@@ -585,7 +607,6 @@ void PropagateDownloadFile::slotGetFinished()
QNetworkReply::NetworkError err = job->reply()->error();
if (err != QNetworkReply::NoError) {
- _item->_httpErrorCode = job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
// If we sent a 'Range' header and get 416 back, we want to retry
// without the header.
@@ -644,7 +665,7 @@ void PropagateDownloadFile::slotGetFinished()
&propagator()->_anotherSyncNeeded);
}
- done(status, job->errorString());
+ done(status,_item->_httpErrorCode >= 400 ? job->errorStringParsingBody() : job->errorString());
return;
}
@@ -658,7 +679,6 @@ void PropagateDownloadFile::slotGetFinished()
// so make sure we have the up-to-date time
_item->_modtime = job->lastModified();
}
- _item->_responseTimeStamp = job->responseTimestamp();
_tmpFile.close();
_tmpFile.flush();
@@ -702,10 +722,11 @@ void PropagateDownloadFile::slotGetFinished()
// the database yet!)
if (job->reply()->rawHeader("OC-Conflict") == "1") {
_conflictRecord.path = _item->_file.toUtf8();
+ _conflictRecord.initialBasePath = job->reply()->rawHeader("OC-ConflictInitialBasePath");
_conflictRecord.baseFileId = job->reply()->rawHeader("OC-ConflictBaseFileId");
- _conflictRecord.baseEtag = _job->reply()->rawHeader("OC-ConflictBaseEtag");
+ _conflictRecord.baseEtag = job->reply()->rawHeader("OC-ConflictBaseEtag");
- auto mtimeHeader = _job->reply()->rawHeader("OC-ConflictBaseMtime");
+ auto mtimeHeader = job->reply()->rawHeader("OC-ConflictBaseMtime");
if (!mtimeHeader.isEmpty())
_conflictRecord.baseModtime = mtimeHeader.toLongLong();
@@ -948,6 +969,17 @@ void PropagateDownloadFile::downloadFinished()
if (_conflictRecord.isValid())
propagator()->_journal->setConflictRecord(_conflictRecord);
+ // If we downloaded something that used to be a virtual file,
+ // wipe the virtual file and its db entry now that we're done.
+ if (_item->_type == ItemTypeVirtualFileDownload) {
+ auto virtualFile = propagator()->addVirtualFileSuffix(_item->_file);
+ auto fn = propagator()->getFilePath(virtualFile);
+ qCDebug(lcPropagateDownload) << "Download of previous virtual file finished" << fn;
+ QFile::remove(fn);
+ propagator()->_journal->deleteFileRecord(virtualFile);
+ _item->_type = ItemTypeFile;
+ }
+
updateMetadata(isConflict);
}
diff --git a/src/libsync/propagateremotedelete.cpp b/src/libsync/propagateremotedelete.cpp
index f67b2b3af..61ee3edee 100644
--- a/src/libsync/propagateremotedelete.cpp
+++ b/src/libsync/propagateremotedelete.cpp
@@ -53,8 +53,7 @@ void DeleteJob::start()
bool DeleteJob::finished()
{
qCInfo(lcDeleteJob) << "DELETE of" << reply()->request().url() << "FINISHED WITH STATUS"
- << reply()->error()
- << (reply()->error() == QNetworkReply::NoError ? QLatin1String("") : errorString());
+ << replyStatusString();
emit finishedSignal();
return true;
@@ -94,21 +93,16 @@ void PropagateRemoteDelete::slotDeleteJobFinished()
QNetworkReply::NetworkError err = _job->reply()->error();
const int httpStatus = _job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
_item->_httpErrorCode = httpStatus;
+ _item->_responseTimeStamp = _job->responseTimestamp();
+ _item->_requestId = _job->requestId();
if (err != QNetworkReply::NoError && err != QNetworkReply::ContentNotFoundError) {
- if (checkForProblemsWithShared(_item->_httpErrorCode,
- tr("The file has been removed from a read only share. It was restored."))) {
- return;
- }
-
SyncFileItem::Status status = classifyError(err, _item->_httpErrorCode,
&propagator()->_anotherSyncNeeded);
done(status, _job->errorString());
return;
}
- _item->_responseTimeStamp = _job->responseTimestamp();
-
// A 404 reply is also considered a success here: We want to make sure
// a file is gone from the server. It not being there in the first place
// is ok. This will happen for files that are in the DB but not on
diff --git a/src/libsync/propagateremotemkdir.cpp b/src/libsync/propagateremotemkdir.cpp
index 98a72d48a..d44f2b2da 100644
--- a/src/libsync/propagateremotemkdir.cpp
+++ b/src/libsync/propagateremotemkdir.cpp
@@ -83,6 +83,8 @@ void PropagateRemoteMkdir::slotMkcolJobFinished()
QNetworkReply::NetworkError err = _job->reply()->error();
_item->_httpErrorCode = _job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
+ _item->_responseTimeStamp = _job->responseTimestamp();
+ _item->_requestId = _job->requestId();
if (_item->_httpErrorCode == 405) {
// This happens when the directory already exists. Nothing to do.
@@ -102,7 +104,6 @@ void PropagateRemoteMkdir::slotMkcolJobFinished()
return;
}
- _item->_responseTimeStamp = _job->responseTimestamp();
_item->_fileId = _job->reply()->rawHeader("OC-FileId");
if (_item->_fileId.isEmpty()) {
diff --git a/src/libsync/propagateremotemove.cpp b/src/libsync/propagateremotemove.cpp
index 35a2486cf..e4b726201 100644
--- a/src/libsync/propagateremotemove.cpp
+++ b/src/libsync/propagateremotemove.cpp
@@ -67,8 +67,7 @@ void MoveJob::start()
bool MoveJob::finished()
{
qCInfo(lcMoveJob) << "MOVE of" << reply()->request().url() << "FINISHED WITH STATUS"
- << reply()->error()
- << (reply()->error() == QNetworkReply::NoError ? QLatin1String("") : errorString());
+ << replyStatusString();
emit finishedSignal();
return true;
@@ -88,24 +87,6 @@ void PropagateRemoteMove::start()
finalize();
return;
}
- if (_item->_file == QLatin1String("Shared")) {
- // Before owncloud 7, there was no permissions system. At the time all the shared files were
- // in a directory called "Shared" and were not supposed to be moved, otherwise bad things happened
-
- QString versionString = propagator()->account()->serverVersion();
- if (versionString.contains('.') && versionString.split('.')[0].toInt() < 7) {
- QString originalFile(propagator()->getFilePath(QLatin1String("Shared")));
- emit propagator()->touchedFile(originalFile);
- emit propagator()->touchedFile(targetFile);
- QString renameError;
- if (FileSystem::rename(targetFile, originalFile, &renameError)) {
- 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."));
- }
- return;
- }
- }
QString destination = QDir::cleanPath(propagator()->account()->url().path() + QLatin1Char('/')
+ propagator()->account()->davPath() + propagator()->_remoteFolder + _item->_renameTarget);
@@ -135,21 +116,16 @@ void PropagateRemoteMove::slotMoveJobFinished()
QNetworkReply::NetworkError err = _job->reply()->error();
_item->_httpErrorCode = _job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
+ _item->_responseTimeStamp = _job->responseTimestamp();
+ _item->_requestId = _job->requestId();
if (err != QNetworkReply::NoError) {
- if (checkForProblemsWithShared(_item->_httpErrorCode,
- tr("The file was renamed but is part of a read only share. The original file was restored."))) {
- return;
- }
-
SyncFileItem::Status status = classifyError(err, _item->_httpErrorCode,
&propagator()->_anotherSyncNeeded);
done(status, _job->errorString());
return;
}
- _item->_responseTimeStamp = _job->responseTimestamp();
-
if (_item->_httpErrorCode != 201) {
// Normally 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
diff --git a/src/libsync/propagateupload.cpp b/src/libsync/propagateupload.cpp
index 4579139ce..c2d5c387d 100644
--- a/src/libsync/propagateupload.cpp
+++ b/src/libsync/propagateupload.cpp
@@ -107,6 +107,7 @@ bool PollJob::finished()
QNetworkReply::NetworkError err = reply()->error();
if (err != QNetworkReply::NoError) {
_item->_httpErrorCode = reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
+ _item->_requestId = requestId();
_item->_status = classifyError(err, _item->_httpErrorCode);
_item->_errorString = errorString();
@@ -471,7 +472,6 @@ void PropagateUploadFileCommon::slotPollFinished()
propagator()->_activeJobList.removeOne(this);
if (job->_item->_status != SyncFileItem::Success) {
- _finished = true;
done(job->_item->_status, job->_item->_errorString);
return;
}
@@ -479,6 +479,12 @@ void PropagateUploadFileCommon::slotPollFinished()
finalize();
}
+void PropagateUploadFileCommon::done(SyncFileItem::Status status, const QString &errorString)
+{
+ _finished = true;
+ PropagateItemJob::done(status, errorString);
+}
+
void PropagateUploadFileCommon::checkResettingErrors()
{
if (_item->_httpErrorCode == 412
@@ -540,28 +546,24 @@ void PropagateUploadFileCommon::commonErrorHandling(AbstractNetworkJob *job)
abortWithError(status, errorString);
}
-void PropagateUploadFileCommon::slotJobDestroyed(QObject *job)
+void PropagateUploadFileCommon::adjustLastJobTimeout(AbstractNetworkJob *job, quint64 fileSize)
{
- _jobs.erase(std::remove(_jobs.begin(), _jobs.end(), job), _jobs.end());
+ job->setTimeout(qBound(
+ job->timeoutMsec(),
+ // Calculate 3 minutes for each gigabyte of data
+ qint64((3 * 60 * 1000) * fileSize / 1e9),
+ // Maximum of 30 minutes
+ qint64(30 * 60 * 1000)));
}
-void PropagateUploadFileCommon::abort(PropagatorJob::AbortType abortType)
+void PropagateUploadFileCommon::slotJobDestroyed(QObject *job)
{
- foreach (auto *job, _jobs) {
- if (job->reply()) {
- job->reply()->abort();
- }
- }
-
- if (abortType == AbortType::Asynchronous) {
- emit abortFinished();
- }
+ _jobs.erase(std::remove(_jobs.begin(), _jobs.end(), job), _jobs.end());
}
// This function is used whenever there is an error occuring and jobs might be in progress
void PropagateUploadFileCommon::abortWithError(SyncFileItem::Status status, const QString &error)
{
- _finished = true;
abort(AbortType::Synchronous);
done(status, error);
}
@@ -597,6 +599,8 @@ QMap<QByteArray, QByteArray> PropagateUploadFileCommon::headers()
auto conflictRecord = propagator()->_journal->conflictRecord(_item->_file.toUtf8());
if (conflictRecord.isValid()) {
headers["OC-Conflict"] = "1";
+ if (!conflictRecord.initialBasePath.isEmpty())
+ headers["OC-ConflictInitialBasePath"] = conflictRecord.initialBasePath;
if (!conflictRecord.baseFileId.isEmpty())
headers["OC-ConflictBaseFileId"] = conflictRecord.baseFileId;
if (conflictRecord.baseModtime != -1)
@@ -610,8 +614,6 @@ QMap<QByteArray, QByteArray> PropagateUploadFileCommon::headers()
void PropagateUploadFileCommon::finalize()
{
- _finished = true;
-
// Update the quota, if known
auto quotaIt = propagator()->_folderQuota.find(QFileInfo(_item->_file).path());
if (quotaIt != propagator()->_folderQuota.end())
@@ -630,32 +632,45 @@ void PropagateUploadFileCommon::finalize()
done(SyncFileItem::Success);
}
-void PropagateUploadFileCommon::prepareAbort(PropagatorJob::AbortType abortType) {
- if (!_jobs.empty()) {
- // Count number of jobs to be aborted asynchronously
- _abortCount = _jobs.size();
-
- foreach (AbstractNetworkJob *job, _jobs) {
- // Check if async abort is requested
- if (job->reply() && abortType == AbortType::Asynchronous) {
- // Connect to finished signal of job reply
- // to asynchonously finish the abort
- connect(job->reply(), &QNetworkReply::finished, this, &PropagateUploadFileCommon::slotReplyAbortFinished);
- }
+void PropagateUploadFileCommon::abortNetworkJobs(
+ PropagatorJob::AbortType abortType,
+ const std::function<bool(AbstractNetworkJob *)> &mayAbortJob)
+{
+ // Count the number of jobs that need aborting, and emit the overall
+ // abort signal when they're all done.
+ QSharedPointer<int> runningCount(new int(0));
+ auto oneAbortFinished = [this, runningCount]() {
+ (*runningCount)--;
+ if (*runningCount == 0) {
+ emit this->abortFinished();
}
- } else if (abortType == AbortType::Asynchronous) {
- // Empty job list, emit abortFinished immedietaly
- emit abortFinished();
+ };
+
+ // Abort all running jobs, except for explicitly excluded ones
+ foreach (AbstractNetworkJob *job, _jobs) {
+ auto reply = job->reply();
+ if (!reply || !reply->isRunning())
+ continue;
+
+ (*runningCount)++;
+
+ // If a job should not be aborted that means we'll never abort before
+ // the hard abort timeout signal comes as runningCount will never go to
+ // zero.
+ // We may however finish before that if the un-abortable job completes
+ // normally.
+ if (!mayAbortJob(job))
+ continue;
+
+ // Abort the job
+ if (abortType == AbortType::Asynchronous) {
+ // Connect to finished signal of job reply to asynchonously finish the abort
+ connect(reply, &QNetworkReply::finished, this, oneAbortFinished);
+ }
+ reply->abort();
}
-}
-
-void PropagateUploadFileCommon::slotReplyAbortFinished()
-{
- _abortCount--;
- if (_abortCount == 0) {
+ if (*runningCount == 0 && abortType == AbortType::Asynchronous)
emit abortFinished();
- }
}
-
}
diff --git a/src/libsync/propagateupload.h b/src/libsync/propagateupload.h
index b86b132ea..2985be930 100644
--- a/src/libsync/propagateupload.h
+++ b/src/libsync/propagateupload.h
@@ -120,8 +120,7 @@ public:
virtual bool finished() Q_DECL_OVERRIDE
{
qCInfo(lcPutJob) << "PUT of" << reply()->request().url().toString() << "FINISHED WITH STATUS"
- << reply()->error()
- << (reply()->error() == QNetworkReply::NoError ? QLatin1String("") : errorString())
+ << replyStatusString()
<< reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute)
<< reply()->attribute(QNetworkRequest::HttpReasonPhraseAttribute);
@@ -210,7 +209,6 @@ protected:
QVector<AbstractNetworkJob *> _jobs; /// network jobs that are currently in transit
bool _finished BITFIELD(1); /// Tells that all the jobs have been finished
bool _deleteExisting BITFIELD(1);
- quint64 _abortCount; /// Keep track of number of aborted items
QByteArray _transmissionChecksumHeader;
public:
@@ -218,7 +216,6 @@ public:
: PropagateItemJob(propagator, item)
, _finished(false)
, _deleteExisting(false)
- , _abortCount(0)
{
}
@@ -249,19 +246,21 @@ public:
void abortWithError(SyncFileItem::Status status, const QString &error);
public slots:
- void abort(PropagatorJob::AbortType abortType) Q_DECL_OVERRIDE;
void slotJobDestroyed(QObject *job);
private slots:
- void slotReplyAbortFinished();
void slotPollFinished();
protected:
+ void done(SyncFileItem::Status status, const QString &errorString = QString()) override;
+
/**
- * Prepares the abort e.g. connects proper signals and slots
- * to the subjobs to abort asynchronously
+ * Aborts all running network jobs, except for the ones that mayAbortJob
+ * returns false on and, for async aborts, emits abortFinished when done.
*/
- void prepareAbort(PropagatorJob::AbortType abortType);
+ void abortNetworkJobs(
+ AbortType abortType,
+ const std::function<bool(AbstractNetworkJob *job)> &mayAbortJob);
/**
* Checks whether the current error is one that should reset the whole
@@ -275,6 +274,17 @@ protected:
*/
void commonErrorHandling(AbstractNetworkJob *job);
+ /**
+ * Increases the timeout for the final MOVE/PUT for large files.
+ *
+ * This is an unfortunate workaround since the drawback is not being able to
+ * detect real disconnects in a timely manner. Shall go away when the server
+ * response starts coming quicker, or there is some sort of async api.
+ *
+ * See #6527, enterprise#2480
+ */
+ static void adjustLastJobTimeout(AbstractNetworkJob *job, quint64 fileSize);
+
// Bases headers that need to be sent with every chunk
QMap<QByteArray, QByteArray> headers();
};
diff --git a/src/libsync/propagateuploadng.cpp b/src/libsync/propagateuploadng.cpp
index 3b8ff8e34..f0e1c4853 100644
--- a/src/libsync/propagateuploadng.cpp
+++ b/src/libsync/propagateuploadng.cpp
@@ -263,7 +263,8 @@ void PropagateUploadFileNG::doStartUploadNext()
}
const SyncJournalDb::UploadInfo progressInfo = propagator()->_journal->getUploadInfo(_item->_file);
- if (progressInfo._valid && progressInfo._modtime == _item->_modtime) {
+ if (progressInfo._valid && progressInfo.isChunked() && progressInfo._modtime == _item->_modtime
+ && progressInfo._size == qint64(_item->_size)) {
_transferId = progressInfo._transferid;
auto url = chunkUrl();
auto job = new LsColJob(propagator()->account(), url, this);
@@ -278,7 +279,7 @@ void PropagateUploadFileNG::doStartUploadNext()
this, &PropagateUploadFileNG::slotPropfindIterate);
job->start();
return;
- } else if (progressInfo._valid) {
+ } else if (progressInfo._valid && progressInfo.isChunked()) {
// The upload info is stale. remove the stale chunks on the server
_transferId = progressInfo._transferid;
// Fire and forget. Any error will be ignored.
@@ -349,6 +350,12 @@ void PropagateUploadFileNG::slotPropfindFinished()
qCCritical(lcPropagateUpload) << "Inconsistency while resuming " << _item->_file
<< ": the size on the server (" << _sent << ") is bigger than the size of the file ("
<< _item->_size << ")";
+
+ // Wipe the old chunking data.
+ // Fire and forget. Any error will be ignored.
+ (new DeleteJob(propagator()->account(), chunkUrl(), this))->start();
+
+ propagator()->_activeJobList.append(this);
startNewUpload();
return;
}
@@ -384,6 +391,7 @@ void PropagateUploadFileNG::slotPropfindFinishedWithError()
auto httpErrorCode = job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
auto status = classifyError(err, httpErrorCode, &propagator()->_anotherSyncNeeded);
if (status == SyncFileItem::FatalError) {
+ _item->_requestId = job->requestId();
propagator()->_activeJobList.removeOne(this);
abortWithError(status, job->errorStringParsingBody());
return;
@@ -402,6 +410,7 @@ void PropagateUploadFileNG::slotDeleteJobFinished()
const int httpStatus = job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
SyncFileItem::Status status = classifyError(err, httpStatus);
if (status == SyncFileItem::FatalError) {
+ _item->_requestId = job->requestId();
abortWithError(status, job->errorString());
return;
} else {
@@ -443,6 +452,7 @@ void PropagateUploadFileNG::startNewUpload()
pi._transferid = _transferId;
pi._modtime = _item->_modtime;
pi._contentChecksum = _item->_checksumHeader;
+ pi._size = _item->_size;
propagator()->_journal->setUploadInfo(_item->_file, pi);
propagator()->_journal->commit("Upload info");
QMap<QByteArray, QByteArray> headers;
@@ -463,6 +473,7 @@ void PropagateUploadFileNG::slotMkColFinished(QNetworkReply::NetworkError)
_item->_httpErrorCode = job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if (err != QNetworkReply::NoError || _item->_httpErrorCode != 201) {
+ _item->_requestId = job->requestId();
SyncFileItem::Status status = classifyError(err, _item->_httpErrorCode,
&propagator()->_anotherSyncNeeded);
abortWithError(status, job->errorStringParsingBody());
@@ -485,6 +496,7 @@ void PropagateUploadFileNG::doFinalMove()
ENFORCE(_jobs.isEmpty(), "MOVE for upload even though jobs are still running");
_finished = true;
+
// Finish with a MOVE
QString destination = QDir::cleanPath(propagator()->account()->url().path() + QLatin1Char('/')
+ propagator()->account()->davPath() + propagator()->_remoteFolder + _item->_file);
@@ -508,6 +520,7 @@ void PropagateUploadFileNG::doFinalMove()
connect(job, &MoveJob::finishedSignal, this, &PropagateUploadFileNG::slotMoveJobFinished);
connect(job, &QObject::destroyed, this, &PropagateUploadFileCommon::slotJobDestroyed);
propagator()->_activeJobList.append(this);
+ adjustLastJobTimeout(job, fileSize);
job->start();
return;
}
@@ -635,6 +648,7 @@ void PropagateUploadFileNG::slotPutFinished()
if (err != QNetworkReply::NoError) {
_item->_httpErrorCode = job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
+ _item->_requestId = job->requestId();
commonErrorHandling(job);
return;
}
@@ -674,12 +688,12 @@ void PropagateUploadFileNG::slotPutFinished()
<< propagator()->_chunkSize << "bytes";
}
- bool finished = _sent == _bytesToUpload;
+ _finished = _sent == _bytesToUpload;
// Check if the file still exists
const QString fullFilePath(propagator()->getFilePath(_item->_file));
if (!FileSystem::fileExists(fullFilePath)) {
- if (!finished) {
+ if (!_finished) {
abortWithError(SyncFileItem::SoftError, tr("The local file was removed during sync."));
return;
} else {
@@ -690,13 +704,13 @@ void PropagateUploadFileNG::slotPutFinished()
// Check whether the file changed since discovery.
if (!FileSystem::verifyFileUnchanged(fullFilePath, _item->_size, _item->_modtime)) {
propagator()->_anotherSyncNeeded = true;
- if (!finished) {
+ if (!_finished) {
abortWithError(SyncFileItem::SoftError, tr("Local file changed during sync."));
return;
}
}
- if (!finished) {
+ if (!_finished) {
// Deletes an existing blacklist entry on successful chunk upload
if (_item->_hasBlacklistEntry) {
propagator()->_journal->wipeErrorBlacklistEntry(_item->_file);
@@ -719,6 +733,8 @@ void PropagateUploadFileNG::slotMoveJobFinished()
slotJobDestroyed(job); // remove it from the _jobs list
QNetworkReply::NetworkError err = job->reply()->error();
_item->_httpErrorCode = job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
+ _item->_responseTimeStamp = job->responseTimestamp();
+ _item->_requestId = job->requestId();
if (err != QNetworkReply::NoError) {
commonErrorHandling(job);
@@ -749,7 +765,6 @@ void PropagateUploadFileNG::slotMoveJobFinished()
abortWithError(SyncFileItem::NormalError, tr("Missing ETag from server"));
return;
}
- _item->_responseTimeStamp = job->responseTimestamp();
finalize();
}
@@ -767,23 +782,11 @@ void PropagateUploadFileNG::slotUploadProgress(qint64 sent, qint64 total)
void PropagateUploadFileNG::abort(PropagatorJob::AbortType abortType)
{
- // Prepare abort
- prepareAbort(abortType);
-
- // Abort all jobs (if there are any left), except final PUT
- foreach (AbstractNetworkJob *job, _jobs) {
- if (job->reply()) {
- if (abortType == AbortType::Asynchronous && qobject_cast<MoveJob *>(job)){
- // If it is async abort, dont abort
- // MoveJob since it might result in conflict,
- // only PUT and MKDIR jobs can be safely aborted.
- continue;
- }
-
- // Abort the job
- job->reply()->abort();
- }
- }
+ abortNetworkJobs(
+ abortType,
+ [abortType](AbstractNetworkJob *job) {
+ return abortType != AbortType::Asynchronous || !qobject_cast<MoveJob *>(job);
+ });
}
}
diff --git a/src/libsync/propagateuploadv1.cpp b/src/libsync/propagateuploadv1.cpp
index ca0a61ccb..d3d1dbaf1 100644
--- a/src/libsync/propagateuploadv1.cpp
+++ b/src/libsync/propagateuploadv1.cpp
@@ -43,7 +43,7 @@ void PropagateUploadFileV1::doStartUpload()
const SyncJournalDb::UploadInfo progressInfo = propagator()->_journal->getUploadInfo(_item->_file);
- if (progressInfo._valid && progressInfo._modtime == _item->_modtime
+ if (progressInfo._valid && progressInfo.isChunked() && progressInfo._modtime == _item->_modtime && progressInfo._size == qint64(_item->_size)
&& (progressInfo._contentChecksum == _item->_checksumHeader || progressInfo._contentChecksum.isEmpty() || _item->_checksumHeader.isEmpty())) {
_startChunk = progressInfo._chunk;
_transferId = progressInfo._transferid;
@@ -55,10 +55,11 @@ void PropagateUploadFileV1::doStartUpload()
SyncJournalDb::UploadInfo pi;
pi._valid = true;
pi._chunk = 0;
- pi._transferid = _transferId;
+ pi._transferid = 0; // We set a null transfer id because it is not chunked.
pi._modtime = _item->_modtime;
pi._errorCount = 0;
pi._contentChecksum = _item->_checksumHeader;
+ pi._size = _item->_size;
propagator()->_journal->setUploadInfo(_item->_file, pi);
propagator()->_journal->commit("Upload info");
}
@@ -144,6 +145,8 @@ void PropagateUploadFileV1::startNextChunk()
connect(job, &PUTFileJob::uploadProgress, this, &PropagateUploadFileV1::slotUploadProgress);
connect(job, &PUTFileJob::uploadProgress, device, &UploadDevice::slotJobUploadProgress);
connect(job, &QObject::destroyed, this, &PropagateUploadFileCommon::slotJobDestroyed);
+ if (isFinalChunk)
+ adjustLastJobTimeout(job, fileSize);
job->start();
propagator()->_activeJobList.append(this);
_currentChunk++;
@@ -197,28 +200,23 @@ void PropagateUploadFileV1::slotPutFinished()
return;
}
+ _item->_httpErrorCode = job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
+ _item->_responseTimeStamp = job->responseTimestamp();
+ _item->_requestId = job->requestId();
QNetworkReply::NetworkError err = job->reply()->error();
-
if (err != QNetworkReply::NoError) {
- _item->_httpErrorCode = job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
- if (checkForProblemsWithShared(_item->_httpErrorCode,
- tr("The file was edited locally but is part of a read only share. "
- "It is restored and your edit is in the conflict file."))) {
- return;
- }
commonErrorHandling(job);
return;
}
- _item->_httpErrorCode = job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
// The server needs some time to process the request and provide us with a poll URL
if (_item->_httpErrorCode == 202) {
- _finished = true;
QString path = QString::fromUtf8(job->reply()->rawHeader("OC-Finish-Poll"));
if (path.isEmpty()) {
done(SyncFileItem::NormalError, tr("Poll URL missing"));
return;
}
+ _finished = true;
startPollJob(path);
return;
}
@@ -233,12 +231,12 @@ void PropagateUploadFileV1::slotPutFinished()
// yet, the upload can be stopped and an error can be displayed, because
// the server hasn't registered the new file yet.
QByteArray etag = getEtagFromReply(job->reply());
- bool finished = etag.length() > 0;
+ _finished = etag.length() > 0;
// Check if the file still exists
const QString fullFilePath(propagator()->getFilePath(_item->_file));
if (!FileSystem::fileExists(fullFilePath)) {
- if (!finished) {
+ if (!_finished) {
abortWithError(SyncFileItem::SoftError, tr("The local file was removed during sync."));
return;
} else {
@@ -249,7 +247,7 @@ void PropagateUploadFileV1::slotPutFinished()
// Check whether the file changed since discovery.
if (!FileSystem::verifyFileUnchanged(fullFilePath, _item->_size, _item->_modtime)) {
propagator()->_anotherSyncNeeded = true;
- if (!finished) {
+ if (!_finished) {
abortWithError(SyncFileItem::SoftError, tr("Local file changed during sync."));
// FIXME: the legacy code was retrying for a few seconds.
// and also checking that after the last chunk, and removed the file in case of INSTRUCTION_NEW
@@ -257,14 +255,13 @@ void PropagateUploadFileV1::slotPutFinished()
}
}
- if (!finished) {
+ if (!_finished) {
// Proceed to next chunk.
if (_currentChunk >= _chunkCount) {
if (!_jobs.empty()) {
// just wait for the other job to finish.
return;
}
- _finished = true;
done(SyncFileItem::NormalError, tr("The server did not acknowledge the last chunk. (No e-tag was present)"));
return;
}
@@ -289,14 +286,14 @@ void PropagateUploadFileV1::slotPutFinished()
pi._modtime = _item->_modtime;
pi._errorCount = 0; // successful chunk upload resets
pi._contentChecksum = _item->_checksumHeader;
+ pi._size = _item->_size;
propagator()->_journal->setUploadInfo(_item->_file, pi);
propagator()->_journal->commit("Upload info");
startNextChunk();
return;
}
-
// the following code only happens after all chunks were uploaded.
- _finished = true;
+
// the file id should only be empty for new files up- or downloaded
QByteArray fid = job->reply()->rawHeader("OC-FileID");
if (!fid.isEmpty()) {
@@ -308,14 +305,13 @@ void PropagateUploadFileV1::slotPutFinished()
_item->_etag = etag;
- _item->_responseTimeStamp = job->responseTimestamp();
-
if (job->reply()->rawHeader("X-OC-MTime") != "accepted") {
// X-OC-MTime is supported since owncloud 5.0. But not when chunking.
// Normally Owncloud 6 always puts X-OC-MTime
qCWarning(lcPropagateUpload) << "Server does not support X-OC-MTime" << job->reply()->rawHeader("X-OC-MTime");
// Well, the mtime was not set
done(SyncFileItem::SoftError, "Server does not support X-OC-MTime");
+ return;
}
finalize();
@@ -357,28 +353,19 @@ void PropagateUploadFileV1::slotUploadProgress(qint64 sent, qint64 total)
void PropagateUploadFileV1::abort(PropagatorJob::AbortType abortType)
{
- // Prepare abort
- prepareAbort(abortType);
-
- // Abort all jobs (if there are any left), except final PUT
- foreach (AbstractNetworkJob *job, _jobs) {
- if (job->reply()) {
- // If asynchronous abort allowed,
- // dont abort final PUT which uploaded its data,
- // since this might result in conflicts
+ abortNetworkJobs(
+ abortType,
+ [this, abortType](AbstractNetworkJob *job) {
if (PUTFileJob *putJob = qobject_cast<PUTFileJob *>(job)){
if (abortType == AbortType::Asynchronous
&& _chunkCount > 0
&& (((_currentChunk + _startChunk) % _chunkCount) == 0)
&& putJob->device()->atEnd()) {
- continue;
+ return false;
}
}
-
- // Abort the job
- job->reply()->abort();
- }
- }
+ return true;
+ });
}
}
diff --git a/src/libsync/propagatorjobs.cpp b/src/libsync/propagatorjobs.cpp
index f869d5f27..b5b99f1d3 100644
--- a/src/libsync/propagatorjobs.cpp
+++ b/src/libsync/propagatorjobs.cpp
@@ -67,7 +67,7 @@ bool PropagateLocalRemove::removeRecursively(const QString &path)
bool ok;
// The use of isSymLink here is okay:
// we never want to go into this branch for .lnk files
- bool isDir = fi.isDir() && !fi.isSymLink();
+ bool isDir = fi.isDir() && !fi.isSymLink() && !FileSystem::isJunction(fi.absoluteFilePath());
if (isDir) {
ok = removeRecursively(path + QLatin1Char('/') + di.fileName()); // recursive
} else {
@@ -116,7 +116,6 @@ void PropagateLocalRemove::start()
return;
QString filename = propagator()->_localDir + _item->_file;
-
qCDebug(lcPropagateLocalRemove) << filename;
if (propagator()->localFileNameClash(_item->_file)) {
diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp
index e52a74c2e..df1c464c1 100644
--- a/src/libsync/syncengine.cpp
+++ b/src/libsync/syncengine.cpp
@@ -121,35 +121,11 @@ QString SyncEngine::csyncErrorToString(CSYNC_STATUS err)
errStr = tr("Success.");
break;
case CSYNC_STATUS_STATEDB_LOAD_ERROR:
- errStr = tr("CSync failed to load or create the journal file. "
+ errStr = tr("Failed to load or create the journal file. "
"Make sure you have read and write permissions in the local sync folder.");
break;
- case CSYNC_STATUS_STATEDB_CORRUPTED:
- errStr = tr("CSync failed to load the journal file. The journal file is corrupted.");
- break;
- case CSYNC_STATUS_NO_MODULE:
- errStr = tr("<p>The %1 plugin for csync could not be loaded.<br/>Please verify the installation!</p>").arg(qApp->applicationName());
- break;
- case CSYNC_STATUS_PARAM_ERROR:
- errStr = tr("CSync fatal parameter error.");
- break;
case CSYNC_STATUS_UPDATE_ERROR:
- errStr = tr("CSync processing step update failed.");
- break;
- case CSYNC_STATUS_RECONCILE_ERROR:
- errStr = tr("CSync processing step reconcile failed.");
- break;
- case CSYNC_STATUS_PROXY_AUTH_ERROR:
- errStr = tr("CSync could not authenticate at the proxy.");
- break;
- case CSYNC_STATUS_LOOKUP_ERROR:
- errStr = tr("CSync failed to lookup proxy or server.");
- break;
- case CSYNC_STATUS_SERVER_AUTH_ERROR:
- errStr = tr("CSync failed to authenticate at the %1 server.").arg(qApp->applicationName());
- break;
- case CSYNC_STATUS_CONNECT_ERROR:
- errStr = tr("CSync failed to connect to the network.");
+ errStr = tr("Discovery step failed.");
break;
case CSYNC_STATUS_TIMEOUT:
errStr = tr("A network connection timeout happened.");
@@ -158,16 +134,16 @@ QString SyncEngine::csyncErrorToString(CSYNC_STATUS err)
errStr = tr("A HTTP transmission error happened.");
break;
case CSYNC_STATUS_PERMISSION_DENIED:
- errStr = tr("CSync failed due to unhandled permission denied.");
+ errStr = tr("Permission denied.");
break;
case CSYNC_STATUS_NOT_FOUND:
- errStr = tr("CSync failed to access") + " "; // filename gets added.
+ errStr = tr("File or directory not found:") + " "; // filename gets added.
break;
case CSYNC_STATUS_FILE_EXISTS:
- errStr = tr("CSync tried to create a folder that already exists.");
+ errStr = tr("Tried to create a folder that already exists.");
break;
case CSYNC_STATUS_OUT_OF_SPACE:
- errStr = tr("CSync: No space on %1 server available.").arg(qApp->applicationName());
+ errStr = tr("No space on %1 server available.").arg(qApp->applicationName());
break;
case CSYNC_STATUS_UNSUCCESSFUL:
errStr = tr("CSync unspecified error.");
@@ -273,13 +249,29 @@ bool SyncEngine::checkErrorBlacklisting(SyncFileItem &item)
return true;
}
+static bool isFileTransferInstruction(csync_instructions_e instruction)
+{
+ return instruction == CSYNC_INSTRUCTION_CONFLICT
+ || instruction == CSYNC_INSTRUCTION_NEW
+ || instruction == CSYNC_INSTRUCTION_SYNC
+ || instruction == CSYNC_INSTRUCTION_TYPE_CHANGE;
+}
+
+static bool isFileModifyingInstruction(csync_instructions_e instruction)
+{
+ return isFileTransferInstruction(instruction)
+ || instruction == CSYNC_INSTRUCTION_RENAME
+ || instruction == CSYNC_INSTRUCTION_REMOVE;
+}
+
void SyncEngine::deleteStaleDownloadInfos(const SyncFileItemVector &syncItems)
{
// Find all downloadinfo paths that we want to preserve.
QSet<QString> download_file_paths;
foreach (const SyncFileItemPtr &it, syncItems) {
if (it->_direction == SyncFileItem::Down
- && it->_type == ItemTypeFile) {
+ && it->_type == ItemTypeFile
+ && isFileTransferInstruction(it->_instruction)) {
download_file_paths.insert(it->_file);
}
}
@@ -300,7 +292,8 @@ void SyncEngine::deleteStaleUploadInfos(const SyncFileItemVector &syncItems)
QSet<QString> upload_file_paths;
foreach (const SyncFileItemPtr &it, syncItems) {
if (it->_direction == SyncFileItem::Up
- && it->_type == ItemTypeFile) {
+ && it->_type == ItemTypeFile
+ && isFileTransferInstruction(it->_instruction)) {
upload_file_paths.insert(it->_file);
}
}
@@ -311,6 +304,8 @@ void SyncEngine::deleteStaleUploadInfos(const SyncFileItemVector &syncItems)
// Delete the stales chunk on the server.
if (account()->capabilities().chunkingNg()) {
foreach (uint transferId, ids) {
+ if (!transferId)
+ continue; // Was not a chunked upload
QUrl url = Utility::concatUrlPath(account()->url(), QLatin1String("remote.php/dav/uploads/") + account()->davUser() + QLatin1Char('/') + QString::number(transferId));
(new DeleteJob(account(), url, this))->start();
}
@@ -356,9 +351,10 @@ void SyncEngine::conflictRecordMaintenance()
if (!conflictRecordPaths.contains(bapath)) {
ConflictRecord record;
record.path = bapath;
+ auto basePath = Utility::conflictFileBaseName(bapath);
+ record.initialBasePath = basePath;
// Determine fileid of target file
- auto basePath = Utility::conflictFileBaseName(bapath);
SyncJournalFileRecord baseRecord;
if (_journal->getFileRecord(basePath, &baseRecord) && baseRecord.isValid()) {
record.baseFileId = baseRecord._fileId;
@@ -369,16 +365,6 @@ void SyncEngine::conflictRecordMaintenance()
}
}
-int SyncEngine::treewalkLocal(csync_file_stat_t *file, csync_file_stat_t *other, void *data)
-{
- return static_cast<SyncEngine *>(data)->treewalkFile(file, other, false);
-}
-
-int SyncEngine::treewalkRemote(csync_file_stat_t *file, csync_file_stat_t *other, void *data)
-{
- return static_cast<SyncEngine *>(data)->treewalkFile(file, other, true);
-}
-
/**
* The main function in the post-reconcile phase.
*
@@ -394,28 +380,40 @@ int SyncEngine::treewalkFile(csync_file_stat_t *file, csync_file_stat_t *other,
if (!file)
return -1;
- QTextCodec::ConverterState utf8State;
- static QTextCodec *codec = QTextCodec::codecForName("UTF-8");
- ASSERT(codec);
- QString fileUtf8 = codec->toUnicode(file->path, file->path.size(), &utf8State);
- QString renameTarget;
- QString key = fileUtf8;
-
auto instruction = file->instruction;
- if (utf8State.invalidChars > 0 || utf8State.remainingChars > 0) {
- qCWarning(lcEngine) << "File ignored because of invalid utf-8 sequence: " << file->path;
- instruction = CSYNC_INSTRUCTION_IGNORE;
- } else {
- renameTarget = codec->toUnicode(file->rename_path, file->rename_path.size(), &utf8State);
- if (utf8State.invalidChars > 0 || utf8State.remainingChars > 0) {
- qCWarning(lcEngine) << "File ignored because of invalid utf-8 sequence in the rename_path: " << file->path << file->rename_path;
+
+ // Decode utf8 path and rename_path QByteArrays to QStrings
+ QString fileUtf8;
+ QString renameTarget;
+ bool utf8DecodeError = false;
+ {
+ const auto toUnicode = [](QByteArray utf8, QString *result) {
+ static QTextCodec *codec = QTextCodec::codecForName("UTF-8");
+ ASSERT(codec);
+
+ QTextCodec::ConverterState state;
+ *result = codec->toUnicode(utf8, utf8.size(), &state);
+ return !(state.invalidChars > 0 || state.remainingChars > 0);
+ };
+
+ if (!toUnicode(file->path, &fileUtf8)) {
+ qCWarning(lcEngine) << "File ignored because of invalid utf-8 sequence: " << file->path;
instruction = CSYNC_INSTRUCTION_IGNORE;
+ utf8DecodeError = true;
}
- if (instruction == CSYNC_INSTRUCTION_RENAME) {
- key = renameTarget;
+ if (!toUnicode(file->rename_path, &renameTarget)) {
+ qCWarning(lcEngine) << "File ignored because of invalid utf-8 sequence in the rename_path: " << file->path << file->rename_path;
+ instruction = CSYNC_INSTRUCTION_IGNORE;
+ utf8DecodeError = true;
}
}
+ // key is the handle that the SyncFileItem will have in the map.
+ QString key = fileUtf8;
+ if (instruction == CSYNC_INSTRUCTION_RENAME) {
+ key = renameTarget;
+ }
+
// Gets a default-constructed SyncFileItemPtr or the one from the first walk (=local walk)
SyncFileItemPtr item = _syncItemMap.value(key);
if (!item)
@@ -561,7 +559,7 @@ int SyncEngine::treewalkFile(csync_file_stat_t *file, csync_file_stat_t *other,
/* No error string */
}
- if (item->_instruction == CSYNC_INSTRUCTION_IGNORE && (utf8State.invalidChars > 0 || utf8State.remainingChars > 0)) {
+ if (item->_instruction == CSYNC_INSTRUCTION_IGNORE && utf8DecodeError) {
item->_status = SyncFileItem::NormalError;
//item->_instruction = CSYNC_INSTRUCTION_ERROR;
item->_errorString = tr("Filename encoding is not valid");
@@ -618,7 +616,7 @@ int SyncEngine::treewalkFile(csync_file_stat_t *file, csync_file_stat_t *other,
if (remote) {
QString filePath = _localPath + item->_file;
- if (other) {
+ if (other && other->type != ItemTypeVirtualFile && other->type != ItemTypeVirtualFileDownload) {
// Even if the mtime is different on the server, we always want to keep the mtime from
// the file system in the DB, this is to avoid spurious upload on the next sync
item->_modtime = other->modtime;
@@ -664,7 +662,6 @@ int SyncEngine::treewalkFile(csync_file_stat_t *file, csync_file_stat_t *other,
dir = !remote ? SyncFileItem::Down : SyncFileItem::Up;
break;
case CSYNC_INSTRUCTION_CONFLICT:
- case CSYNC_INSTRUCTION_IGNORE:
case CSYNC_INSTRUCTION_ERROR:
dir = SyncFileItem::None;
break;
@@ -692,6 +689,7 @@ int SyncEngine::treewalkFile(csync_file_stat_t *file, csync_file_stat_t *other,
case CSYNC_INSTRUCTION_NEW:
case CSYNC_INSTRUCTION_EVAL:
case CSYNC_INSTRUCTION_STAT_ERROR:
+ case CSYNC_INSTRUCTION_IGNORE:
default:
dir = remote ? SyncFileItem::Down : SyncFileItem::Up;
break;
@@ -719,13 +717,13 @@ int SyncEngine::treewalkFile(csync_file_stat_t *file, csync_file_stat_t *other,
void SyncEngine::handleSyncError(CSYNC *ctx, const char *state)
{
CSYNC_STATUS err = csync_get_status(ctx);
- const char *errMsg = csync_get_status_string(ctx);
+ QString errMsg = ctx->error_string;
QString errStr = csyncErrorToString(err);
- if (errMsg) {
+ if (!errMsg.isEmpty()) {
if (!errStr.endsWith(" ")) {
errStr.append(" ");
}
- errStr += QString::fromUtf8(errMsg);
+ errStr += errMsg;
}
// Special handling CSYNC_STATUS_INVALID_CHARACTERS
if (err == CSYNC_STATUS_INVALID_CHARACTERS) {
@@ -742,7 +740,7 @@ void SyncEngine::handleSyncError(CSYNC *ctx, const char *state)
if (CSYNC_STATUS_IS_EQUAL(err, CSYNC_STATUS_ABORTED)) {
qCInfo(lcEngine) << "Update phase was aborted by user!";
- } else if (CSYNC_STATUS_IS_EQUAL(err, CSYNC_STATUS_SERVICE_UNAVAILABLE) || CSYNC_STATUS_IS_EQUAL(err, CSYNC_STATUS_CONNECT_ERROR)) {
+ } else if (CSYNC_STATUS_IS_EQUAL(err, CSYNC_STATUS_SERVICE_UNAVAILABLE)) {
emit csyncUnavailable();
} else {
csyncError(errStr);
@@ -840,11 +838,28 @@ void SyncEngine::startSync()
// database creation error!
}
+ // Functionality like selective sync might have set up etag storage
+ // filtering via avoidReadFromDbOnNextSync(). This *is* the next sync, so
+ // undo the filter to allow this sync to retrieve and store the correct etags.
+ _journal->clearEtagStorageFilter();
+
_csync_ctx->upload_conflict_files = _account->capabilities().uploadConflictFiles();
_excludedFiles->setExcludeConflictFiles(!_account->capabilities().uploadConflictFiles());
_csync_ctx->read_remote_from_db = true;
- _lastLocalDiscoveryStyle = _csync_ctx->local_discovery_style;
+
+ _lastLocalDiscoveryStyle = _localDiscoveryStyle;
+ _csync_ctx->should_discover_locally_fn = [this](const QByteArray &path) {
+ return shouldDiscoverLocally(path);
+ };
+
+ _csync_ctx->new_files_are_virtual = _syncOptions._newFilesAreVirtual;
+ _csync_ctx->virtual_file_suffix = _syncOptions._virtualFileSuffix.toUtf8();
+ if (_csync_ctx->new_files_are_virtual && _csync_ctx->virtual_file_suffix.isEmpty()) {
+ csyncError(tr("Using virtual files but suffix is not set"));
+ finalize(false);
+ return;
+ }
bool ok;
auto selectiveSyncBlackList = _journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok);
@@ -917,9 +932,18 @@ void SyncEngine::startSync()
QMetaObject::invokeMethod(discoveryJob, "start", Qt::QueuedConnection);
}
-void SyncEngine::slotFolderDiscovered(bool /*local*/, const QString &folder)
+void SyncEngine::slotFolderDiscovered(bool local, const QString &folder)
{
- _progressInfo->_currentDiscoveredFolder = folder;
+ // Currently remote and local discovery never run in parallel
+ // Note: Currently this slot is only called occasionally! See the throttling
+ // in DiscoveryJob::update_job_update_callback.
+ if (local) {
+ _progressInfo->_currentDiscoveredLocalFolder = folder;
+ _progressInfo->_currentDiscoveredRemoteFolder.clear();
+ } else {
+ _progressInfo->_currentDiscoveredRemoteFolder = folder;
+ _progressInfo->_currentDiscoveredLocalFolder.clear();
+ }
emit transmissionProgress(*_progressInfo);
}
@@ -956,7 +980,8 @@ void SyncEngine::slotDiscoveryJobFinished(int discoveryResult)
_journal->commitIfNeededAndStartNewTransaction("Post discovery");
}
- _progressInfo->_currentDiscoveredFolder.clear();
+ _progressInfo->_currentDiscoveredRemoteFolder.clear();
+ _progressInfo->_currentDiscoveredLocalFolder.clear();
_progressInfo->_status = ProgressInfo::Reconcile;
emit transmissionProgress(*_progressInfo);
@@ -976,11 +1001,11 @@ void SyncEngine::slotDiscoveryJobFinished(int discoveryResult)
_temporarilyUnavailablePaths.clear();
_renamedFolders.clear();
- if (csync_walk_local_tree(_csync_ctx.data(), &treewalkLocal, 0) < 0) {
+ if (csync_walk_local_tree(_csync_ctx.data(), [this](csync_file_stat_t *f, csync_file_stat_t *o) { return treewalkFile(f, o, false); } ) < 0) {
qCWarning(lcEngine) << "Error in local treewalk.";
walkOk = false;
}
- if (walkOk && csync_walk_remote_tree(_csync_ctx.data(), &treewalkRemote, 0) < 0) {
+ if (walkOk && csync_walk_remote_tree(_csync_ctx.data(), [this](csync_file_stat_t *f, csync_file_stat_t *o) { return treewalkFile(f, o, true); } ) < 0) {
qCWarning(lcEngine) << "Error in remote treewalk.";
}
@@ -1010,7 +1035,9 @@ void SyncEngine::slotDiscoveryJobFinished(int discoveryResult)
if (!invalidFilenamePattern.isEmpty()) {
const QRegExp invalidFilenameRx(invalidFilenamePattern);
for (auto it = syncItems.begin(); it != syncItems.end(); ++it) {
- if ((*it)->_direction == SyncFileItem::Up && (*it)->destination().contains(invalidFilenameRx)) {
+ if ((*it)->_direction == SyncFileItem::Up
+ && isFileModifyingInstruction((*it)->_instruction)
+ && (*it)->destination().contains(invalidFilenameRx)) {
(*it)->_errorString = tr("File name contains at least one invalid character");
(*it)->_instruction = CSYNC_INSTRUCTION_IGNORE;
}
@@ -1020,7 +1047,13 @@ void SyncEngine::slotDiscoveryJobFinished(int discoveryResult)
if (!_hasNoneFiles && _hasRemoveFile) {
qCInfo(lcEngine) << "All the files are going to be changed, asking the user";
bool cancel = false;
- emit aboutToRemoveAllFiles(syncItems.first()->_direction, &cancel);
+ int side = 0; // > 0 means more deleted on the server. < 0 means more deleted on the client
+ foreach (const auto &it, syncItems) {
+ if (it->_instruction == CSYNC_INSTRUCTION_REMOVE) {
+ side += it->_direction == SyncFileItem::Down ? 1 : -1;
+ }
+ }
+ emit aboutToRemoveAllFiles(side >= 0 ? SyncFileItem::Down : SyncFileItem::Up, &cancel);
if (cancel) {
qCInfo(lcEngine) << "User aborted sync";
finalize(false);
@@ -1029,10 +1062,9 @@ void SyncEngine::slotDiscoveryJobFinished(int discoveryResult)
}
auto databaseFingerprint = _journal->dataFingerprint();
- // If databaseFingerprint is null, this means that there was no information in the database
- // (for example, upgrading from a previous version, or first sync)
- // Note that an empty ("") fingerprint is valid and means it was empty on the server before.
- if (!databaseFingerprint.isNull()
+ // If databaseFingerprint is empty, this means that there was no information in the database
+ // (for example, upgrading from a previous version, or first sync, or server not supporting fingerprint)
+ if (!databaseFingerprint.isEmpty()
&& _discoveryMainThread->_dataFingerprint != databaseFingerprint) {
qCInfo(lcEngine) << "data fingerprint changed, assume restore from backup" << databaseFingerprint << _discoveryMainThread->_dataFingerprint;
restoreOldFiles(syncItems);
@@ -1058,6 +1090,7 @@ void SyncEngine::slotDiscoveryJobFinished(int discoveryResult)
// Re-init the csync context to free memory
_csync_ctx->reinitialize();
+ _localDiscoveryPaths.clear();
// To announce the beginning of the sync
emit aboutToPropagate(syncItems);
@@ -1201,6 +1234,8 @@ void SyncEngine::finalize(bool success)
_temporarilyUnavailablePaths.clear();
_renamedFolders.clear();
_uniqueErrors.clear();
+ _localDiscoveryPaths.clear();
+ _localDiscoveryStyle = LocalDiscoveryStyle::FilesystemOnly;
_clearTouchedFilesTimer.start();
}
@@ -1224,6 +1259,14 @@ QString SyncEngine::adjustRenamedPath(const QString &original)
while ((slashPos = original.lastIndexOf('/', slashPos - 1)) > 0) {
QHash<QString, QString>::const_iterator it = _renamedFolders.constFind(original.left(slashPos));
if (it != _renamedFolders.constEnd()) {
+ // This is a band-aid fix for a specific problem:
+ // See issue #6694: "hierarchy inversion" and discussion in PR #6695.
+ // There's a larger unfixed issue here, see testInvertFolderHierarchy().
+ auto original_it = _renamedFolders.constFind(original);
+ if (original_it != _renamedFolders.constEnd() && it->startsWith(*original_it)) {
+ return original;
+ }
+
return *it + original.mid(slashPos);
}
}
@@ -1243,7 +1286,8 @@ void SyncEngine::checkForPermission(SyncFileItemVector &syncItems)
SyncFileItemPtr needle;
for (SyncFileItemVector::iterator it = syncItems.begin(); it != syncItems.end(); ++it) {
- if ((*it)->_direction != SyncFileItem::Up) {
+ if ((*it)->_direction != SyncFileItem::Up
+ || !isFileModifyingInstruction((*it)->_instruction)) {
// Currently we only check server-side permissions
continue;
}
@@ -1510,14 +1554,6 @@ void SyncEngine::checkForPermission(SyncFileItemVector &syncItems)
RemotePermissions SyncEngine::getPermissions(const QString &file) const
{
- static bool isTest = qEnvironmentVariableIntValue("OWNCLOUD_TEST_PERMISSIONS");
- if (isTest) {
- QRegExp rx("_PERM_([^_]*)_[^/]*$");
- if (rx.indexIn(file) != -1) {
- return RemotePermissions(rx.cap(1));
- }
- }
-
// Fetch from the csync context while we still have it.
ASSERT(_csync_ctx->status != CSYNC_STATUS_INIT);
@@ -1610,10 +1646,34 @@ AccountPtr SyncEngine::account() const
return _account;
}
-void SyncEngine::setLocalDiscoveryOptions(LocalDiscoveryStyle style, std::set<QByteArray> dirs)
+void SyncEngine::setLocalDiscoveryOptions(LocalDiscoveryStyle style, std::set<QByteArray> paths)
+{
+ _localDiscoveryStyle = style;
+ _localDiscoveryPaths = std::move(paths);
+}
+
+bool SyncEngine::shouldDiscoverLocally(const QByteArray &path) const
{
- _csync_ctx->local_discovery_style = style;
- _csync_ctx->locally_touched_dirs = std::move(dirs);
+ if (_localDiscoveryStyle == LocalDiscoveryStyle::FilesystemOnly)
+ return true;
+
+ auto it = _localDiscoveryPaths.lower_bound(path);
+ if (it == _localDiscoveryPaths.end() || !it->startsWith(path))
+ return false;
+
+ // maybe an exact match or an empty path?
+ if (it->size() == path.size() || path.isEmpty())
+ return true;
+
+ // check for a prefix + / match
+ forever {
+ if (it->size() > path.size() && it->at(path.size()) == '/')
+ return true;
+ ++it;
+ if (it == _localDiscoveryPaths.end() || !it->startsWith(path))
+ return false;
+ }
+ return false;
}
void SyncEngine::abort()
diff --git a/src/libsync/syncengine.h b/src/libsync/syncengine.h
index 022350fe1..7db26008f 100644
--- a/src/libsync/syncengine.h
+++ b/src/libsync/syncengine.h
@@ -76,6 +76,7 @@ public:
bool isSyncRunning() const { return _syncRunning; }
+ SyncOptions syncOptions() const { return _syncOptions; }
void setSyncOptions(const SyncOptions &options) { _syncOptions = options; }
bool ignoreHiddenFiles() const { return _csync_ctx->ignore_hidden_files; }
void setIgnoreHiddenFiles(bool ignore) { _csync_ctx->ignore_hidden_files = ignore; }
@@ -103,7 +104,7 @@ public:
/**
* Control whether local discovery should read from filesystem or db.
*
- * If style is Partial, the paths is a set of file paths relative to
+ * If style is DatabaseAndFilesystem, paths a set of file paths relative to
* the synced folder. All the parent directories of these paths will not
* be read from the db and scanned on the filesystem.
*
@@ -111,7 +112,16 @@ public:
* revert afterwards. Use _lastLocalDiscoveryStyle to discover the last
* sync's style.
*/
- void setLocalDiscoveryOptions(LocalDiscoveryStyle style, std::set<QByteArray> dirs = {});
+ void setLocalDiscoveryOptions(LocalDiscoveryStyle style, std::set<QByteArray> paths = {});
+
+ /**
+ * Returns whether the given folder-relative path should be locally discovered
+ * given the local discovery options.
+ *
+ * Example: If path is 'foo/bar' and style is DatabaseAndFilesystem and dirs contains
+ * 'foo/bar/touched_file', then the result will be true.
+ */
+ bool shouldDiscoverLocally(const QByteArray &path) const;
/** Access the last sync run's local discovery style */
LocalDiscoveryStyle lastLocalDiscoveryStyle() const { return _lastLocalDiscoveryStyle; }
@@ -195,8 +205,6 @@ private:
QString journalDbFilePath() const;
- static int treewalkLocal(csync_file_stat_t *file, csync_file_stat_t *other, void *);
- static int treewalkRemote(csync_file_stat_t *file, csync_file_stat_t *other, void *);
int treewalkFile(csync_file_stat_t *file, csync_file_stat_t *other, bool);
bool checkErrorBlacklisting(SyncFileItem &item);
@@ -303,7 +311,9 @@ private:
QSet<QString> _uniqueErrors;
/** The kind of local discovery the last sync run used */
- LocalDiscoveryStyle _lastLocalDiscoveryStyle = LocalDiscoveryStyle::DatabaseAndFilesystem;
+ LocalDiscoveryStyle _lastLocalDiscoveryStyle = LocalDiscoveryStyle::FilesystemOnly;
+ LocalDiscoveryStyle _localDiscoveryStyle = LocalDiscoveryStyle::FilesystemOnly;
+ std::set<QByteArray> _localDiscoveryPaths;
};
}
diff --git a/src/libsync/syncfileitem.h b/src/libsync/syncfileitem.h
index 4272bf9e5..39e1b6add 100644
--- a/src/libsync/syncfileitem.h
+++ b/src/libsync/syncfileitem.h
@@ -75,10 +75,9 @@ public:
/** For files whose errors were blacklisted
*
* If an file is blacklisted due to an error it isn't even reattempted. These
- * errors should appear in the issues tab, but not on the account settings and
- * should not cause the sync run to fail.
+ * errors should appear in the issues tab but should be silent otherwise.
*
- * A DetailError that doesn't cause sync failure.
+ * A SoftError caused by blacklisting.
*/
BlacklistedError
};
@@ -224,6 +223,7 @@ public:
RemotePermissions _remotePerm;
QString _errorString; // Contains a string only in case of error
QByteArray _responseTimeStamp;
+ QByteArray _requestId; // X-Request-Id of the failed request
quint32 _affectedItems; // the number of affected items by the operation on this item.
// usually this value is 1, but for removes on dirs, it might be much higher.
diff --git a/src/libsync/syncoptions.h b/src/libsync/syncoptions.h
index d7d320547..680fede87 100644
--- a/src/libsync/syncoptions.h
+++ b/src/libsync/syncoptions.h
@@ -36,6 +36,10 @@ struct SyncOptions
/** If remotely deleted files are needed to move to trash */
bool _moveFilesToTrash = false;
+ /** Create a virtual file for new files instead of downloading */
+ bool _newFilesAreVirtual = false;
+ QString _virtualFileSuffix = ".owncloud";
+
/** The initial un-adjusted chunk size in bytes for chunked uploads, both
* for old and new chunking algorithm, which classifies the item to be chunked
*
diff --git a/src/libsync/syncresult.cpp b/src/libsync/syncresult.cpp
index 92af7fa82..8550b4628 100644
--- a/src/libsync/syncresult.cpp
+++ b/src/libsync/syncresult.cpp
@@ -185,10 +185,8 @@ void SyncResult::processCompletedItem(const SyncFileItemPtr &item)
// nothing.
break;
}
- } else if (item->_direction == SyncFileItem::None) {
- if (item->_instruction == CSYNC_INSTRUCTION_IGNORE) {
- _foundFilesNotSynced = true;
- }
+ } else if (item->_instruction == CSYNC_INSTRUCTION_IGNORE) {
+ _foundFilesNotSynced = true;
}
}
}
diff --git a/src/libsync/syncresult.h b/src/libsync/syncresult.h
index 28aac56e7..6c484ee4d 100644
--- a/src/libsync/syncresult.h
+++ b/src/libsync/syncresult.h
@@ -68,6 +68,7 @@ public:
int numRenamedItems() const { return _numRenamedItems; }
int numNewConflictItems() const { return _numNewConflictItems; }
int numOldConflictItems() const { return _numOldConflictItems; }
+ void setNumOldConflictItems(int n) { _numOldConflictItems = n; }
int numErrorItems() const { return _numErrorItems; }
bool hasUnresolvedConflicts() const { return _numNewConflictItems + _numOldConflictItems > 0; }
diff --git a/src/libsync/theme.cpp b/src/libsync/theme.cpp
index 9c5cfbd29..9681d1fba 100644
--- a/src/libsync/theme.cpp
+++ b/src/libsync/theme.cpp
@@ -16,10 +16,13 @@
#include "config.h"
#include "common/utility.h"
#include "version.h"
+#include "configfile.h"
#include <QtCore>
#ifndef TOKEN_AUTH_ONLY
#include <QtGui>
+#include <QStyle>
+#include <QApplication>
#endif
#include <QSslSocket>
@@ -105,12 +108,16 @@ QString Theme::version() const
return MIRALL_VERSION_STRING;
}
+QString Theme::configFileName() const
+{
+ return QStringLiteral(APPLICATION_EXECUTABLE ".cfg");
+}
+
#ifndef TOKEN_AUTH_ONLY
-QIcon Theme::trayFolderIcon(const QString &backend) const
+QIcon Theme::applicationIcon() const
{
- Q_UNUSED(backend)
- return applicationIcon();
+ return themeIcon(QStringLiteral(APPLICATION_ICON_NAME "-icon"));
}
/*
@@ -127,7 +134,7 @@ QIcon Theme::themeIcon(const QString &name, bool sysTray, bool sysTrayMenuVisibl
}
QString key = name + "," + flavor;
- QIcon &cached = _iconCache[key];
+ QIcon &cached = _iconCache[key]; // Take reference, this will also "set" the cache entry
if (cached.isNull()) {
if (QIcon::hasThemeIcon(name)) {
// use from theme
@@ -135,7 +142,7 @@ QIcon Theme::themeIcon(const QString &name, bool sysTray, bool sysTrayMenuVisibl
}
QList<int> sizes;
- sizes << 16 << 22 << 32 << 48 << 64 << 128 << 256;
+ sizes << 16 << 22 << 32 << 48 << 64 << 128 << 256 << 512 << 1024;
foreach (int size, sizes) {
QString pixmapName = QString::fromLatin1(":/client/theme/%1/%2-%3.png").arg(flavor).arg(name).arg(size);
if (QFile::exists(pixmapName)) {
@@ -217,6 +224,21 @@ QString Theme::defaultServerFolder() const
return QLatin1String("/");
}
+QString Theme::helpUrl() const
+{
+ return QString::fromLatin1("https://doc.owncloud.org/desktop/%1.%2/").arg(MIRALL_VERSION_MAJOR).arg(MIRALL_VERSION_MINOR);
+}
+
+QString Theme::conflictHelpUrl() const
+{
+ auto baseUrl = helpUrl();
+ if (baseUrl.isEmpty())
+ return QString();
+ if (!baseUrl.endsWith('/'))
+ baseUrl.append('/');
+ return baseUrl + QStringLiteral("conflicts.html");
+}
+
QString Theme::overrideServerUrl() const
{
return QString();
@@ -311,21 +333,27 @@ QString Theme::gitSHA1() const
QString Theme::about() const
{
- QString re;
- re = tr("<p>Version %1. For more information please visit <a href='%2'>%3</a>.</p>")
- .arg(MIRALL_VERSION_STRING)
- .arg("http://" MIRALL_STRINGIFY(APPLICATION_DOMAIN))
- .arg(MIRALL_STRINGIFY(APPLICATION_DOMAIN));
-
- re += tr("<p>Copyright ownCloud GmbH</p>");
- re += tr("<p>Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.<br/>"
- "%2 and the %2 logo are registered trademarks of %1 in the "
- "United States, other countries, or both.</p>")
- .arg(APPLICATION_VENDOR)
- .arg(APPLICATION_NAME);
+ QString vendor = APPLICATION_VENDOR;
+ // Ideally, the vendor should be "ownCloud GmbH", but it cannot be changed without
+ // changing the location of the settings and other registery keys.
+ if (vendor == "ownCloud") vendor = QLatin1String("ownCloud GmbH");
- re += gitSHA1();
- return re;
+ QString devString;
+ devString = tr("<p>Version %2. For more information visit <a href=\"%3\">https://%4</a></p>"
+ "<p>For known issues and help, please visit: <a href=\"https://central.owncloud.org/c/desktop-client\">https://central.owncloud.org</a></p>"
+ "<p><small>By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, "
+ " Jan-Christoph Borchardt, and others.</small></p>")
+ .arg(Utility::escape(MIRALL_VERSION_STRING),
+ Utility::escape("https://" MIRALL_STRINGIFY(APPLICATION_DOMAIN)),
+ Utility::escape(MIRALL_STRINGIFY(APPLICATION_DOMAIN)));
+ devString += tr("<p>Copyright ownCloud GmbH</p>");
+ devString += tr("<p>Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.<br/>"
+ "%2 and the %2 logo are registered trademarks of %1 in the "
+ "United States, other countries, or both.</p>")
+ .arg(Utility::escape(vendor), Utility::escape(APPLICATION_NAME));
+
+ devString += gitSHA1();
+ return devString;
}
#ifndef TOKEN_AUTH_ONLY
@@ -528,5 +556,9 @@ QString Theme::versionSwitchOutput() const
return helpText;
}
+bool Theme::showVirtualFilesOption() const
+{
+ return ConfigFile().showExperimentalOptions();
+}
} // end namespace client
diff --git a/src/libsync/theme.h b/src/libsync/theme.h
index c2cd4922f..408b8c0d7 100644
--- a/src/libsync/theme.h
+++ b/src/libsync/theme.h
@@ -84,24 +84,19 @@ public:
* @brief configFileName
* @return the name of the config file.
*/
- virtual QString configFileName() const = 0;
+ virtual QString configFileName() const;
#ifndef TOKEN_AUTH_ONLY
static QString hidpiFileName(const QString &fileName, QPaintDevice *dev = 0);
/**
- * the icon that is shown in the tray context menu left of the folder name
- */
- virtual QIcon trayFolderIcon(const QString &) const;
-
- /**
* get an sync state icon
*/
virtual QIcon syncStateIcon(SyncResult::Status, bool sysTray = false, bool sysTrayMenuVisible = false) const;
virtual QIcon folderDisabledIcon() const;
virtual QIcon folderOfflineIcon(bool sysTray = false, bool sysTrayMenuVisible = false) const;
- virtual QIcon applicationIcon() const = 0;
+ virtual QIcon applicationIcon() const;
#endif
virtual QString statusHeaderText(SyncResult::Status) const;
@@ -118,9 +113,27 @@ public:
virtual bool multiAccount() const;
/**
- * URL to help file
+ * URL to documentation.
+ *
+ * This is opened in the browser when the "Help" action is selected from the tray menu.
+ *
+ * If the function is overridden to return an empty string the action is removed from
+ * the menu.
+ *
+ * Defaults to ownCloud's client documentation website.
*/
- virtual QString helpUrl() const { return QString(); }
+ virtual QString helpUrl() const;
+
+ /**
+ * The url to use for showing help on conflicts.
+ *
+ * If the function is overridden to return an empty string no help link will be shown.
+ *
+ * Defaults to helpUrl() + "conflicts.html", which is a page in ownCloud's client
+ * documentation website. If helpUrl() is empty, this function will also return the
+ * empty string.
+ */
+ virtual QString conflictHelpUrl() const;
/**
* Setting a value here will pre-define the server url.
@@ -336,6 +349,14 @@ public:
virtual QString versionSwitchOutput() const;
+ /**
+ * @brief Whether to show the option to create folders using "virtual files".
+ *
+ * By default, the options are not shown unless experimental options are
+ * manually enabled in the configuration file.
+ */
+ virtual bool showVirtualFilesOption() const;
+
protected:
#ifndef TOKEN_AUTH_ONLY
QIcon themeIcon(const QString &name, bool sysTray = false, bool sysTrayMenuVisible = false) const;
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index d6a99c67d..71a38b4c4 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -40,16 +40,21 @@ owncloud_add_test(ChecksumValidator "")
owncloud_add_test(ExcludedFiles "")
-owncloud_add_test(FileSystem "")
owncloud_add_test(Utility "")
owncloud_add_test(SyncEngine "syncenginetestutils.h")
+owncloud_add_test(SyncVirtualFiles "syncenginetestutils.h")
owncloud_add_test(SyncMove "syncenginetestutils.h")
owncloud_add_test(SyncConflict "syncenginetestutils.h")
owncloud_add_test(SyncFileStatusTracker "syncenginetestutils.h")
+owncloud_add_test(Download "syncenginetestutils.h")
owncloud_add_test(ChunkingNg "syncenginetestutils.h")
owncloud_add_test(Zsync "syncenginetestutils.h")
owncloud_add_test(UploadReset "syncenginetestutils.h")
owncloud_add_test(AllFilesDeleted "syncenginetestutils.h")
+owncloud_add_test(Blacklist "syncenginetestutils.h")
+owncloud_add_test(LocalDiscovery "syncenginetestutils.h")
+owncloud_add_test(RemoteDiscovery "syncenginetestutils.h")
+owncloud_add_test(Permissions "syncenginetestutils.h")
owncloud_add_test(FolderWatcher "${FolderWatcher_SRC}")
if( UNIX AND NOT APPLE )
@@ -66,6 +71,8 @@ list(APPEND FolderMan_SRC ../src/gui/syncrunfilelog.cpp )
list(APPEND FolderMan_SRC ../src/gui/lockwatcher.cpp )
list(APPEND FolderMan_SRC ../src/gui/guiutility.cpp )
list(APPEND FolderMan_SRC ../src/gui/navigationpanehelper.cpp )
+list(APPEND FolderMan_SRC ../src/gui/connectionvalidator.cpp )
+list(APPEND FolderMan_SRC ../src/gui/clientproxy.cpp )
list(APPEND FolderMan_SRC ${FolderWatcher_SRC})
list(APPEND FolderMan_SRC stub.cpp )
owncloud_add_test(FolderMan "${FolderMan_SRC}")
diff --git a/test/csync/CMakeLists.txt b/test/csync/CMakeLists.txt
index a7ec9f133..4e9c1422c 100644
--- a/test/csync/CMakeLists.txt
+++ b/test/csync/CMakeLists.txt
@@ -11,9 +11,9 @@ include_directories(
include_directories(${CHECK_INCLUDE_DIRS})
# create test library
add_library(${TORTURE_LIBRARY} STATIC torture.c cmdline.c)
-target_link_libraries(${TORTURE_LIBRARY} ${CMOCKA_LIBRARIES} ${CSYNC_LIBRARY})
+target_link_libraries(${TORTURE_LIBRARY} ${CMOCKA_LIBRARIES})
-set(TEST_TARGET_LIBRARIES ${TORTURE_LIBRARY} Qt5::Core ocsync)
+set(TEST_TARGET_LIBRARIES ${TORTURE_LIBRARY} Qt5::Core "${csync_NAME}")
# create tests
diff --git a/test/csync/csync_tests/check_csync_exclude.cpp b/test/csync/csync_tests/check_csync_exclude.cpp
index f719aa4aa..3969dcaca 100644
--- a/test/csync/csync_tests/check_csync_exclude.cpp
+++ b/test/csync/csync_tests/check_csync_exclude.cpp
@@ -22,6 +22,8 @@
#include <time.h>
#include <sys/time.h>
+#include <QTemporaryDir>
+
#define CSYNC_TEST 1
#include "csync_exclude.cpp"
@@ -271,7 +273,8 @@ static void check_csync_excluded_traversal(void **)
assert_int_equal(check_file_traversal("subdir/.sync_5bdd60bdfcfa.db"), CSYNC_FILE_SILENTLY_EXCLUDED);
/* Other builtin excludes */
- assert_int_equal(check_file_traversal("foo/Desktop.ini"), CSYNC_FILE_SILENTLY_EXCLUDED);
+ assert_int_equal(check_file_traversal("foo/Desktop.ini"), CSYNC_NOT_EXCLUDED);
+ assert_int_equal(check_file_traversal("Desktop.ini"), CSYNC_FILE_SILENTLY_EXCLUDED);
/* pattern ]*.directory - ignore and remove */
assert_int_equal(check_file_traversal("my.~directory"), CSYNC_FILE_EXCLUDE_AND_REMOVE);
@@ -624,6 +627,34 @@ static void check_csync_exclude_expand_escapes(void **state)
assert_true(0 == strcmp(line.constData(), "\\"));
}
+static void check_version_directive(void **state)
+{
+ (void)state;
+
+ ExcludedFiles excludes;
+ excludes.setClientVersion(ExcludedFiles::Version(2, 5, 0));
+
+ std::vector<std::pair<const char *, bool>> tests = {
+ { "#!version == 2.5.0", true },
+ { "#!version == 2.6.0", false },
+ { "#!version < 2.6.0", true },
+ { "#!version <= 2.6.0", true },
+ { "#!version > 2.6.0", false },
+ { "#!version >= 2.6.0", false },
+ { "#!version < 2.4.0", false },
+ { "#!version <= 2.4.0", false },
+ { "#!version > 2.4.0", true },
+ { "#!version >= 2.4.0", true },
+ { "#!version < 2.5.0", false },
+ { "#!version <= 2.5.0", true },
+ { "#!version > 2.5.0", false },
+ { "#!version >= 2.5.0", true },
+ };
+ for (auto test : tests) {
+ assert_true(excludes.versionDirectiveKeepNextLine(test.first) == test.second);
+ }
+}
+
}; // class ExcludedFilesTest
int torture_run_tests(void)
@@ -642,6 +673,7 @@ int torture_run_tests(void)
cmocka_unit_test_setup_teardown(T::check_csync_is_windows_reserved_word, T::setup_init, T::teardown),
cmocka_unit_test_setup_teardown(T::check_csync_excluded_performance, T::setup_init, T::teardown),
cmocka_unit_test(T::check_csync_exclude_expand_escapes),
+ cmocka_unit_test(T::check_version_directive),
};
return cmocka_run_group_tests(tests, NULL, NULL);
diff --git a/test/csync/csync_tests/check_csync_update.cpp b/test/csync/csync_tests/check_csync_update.cpp
index 504ea2096..b4eca074d 100644
--- a/test/csync/csync_tests/check_csync_update.cpp
+++ b/test/csync/csync_tests/check_csync_update.cpp
@@ -325,16 +325,6 @@ static void check_csync_detect_update_db_new(void **state)
csync_set_status(csync, 0xFFFF);
}
-static void check_csync_detect_update_null(void **state)
-{
- CSYNC *csync = (CSYNC*)*state;
- std::unique_ptr<csync_file_stat_t> fs;
- int rc;
-
- rc = _csync_detect_update(csync, NULL);
- assert_int_equal(rc, -1);
-}
-
static void check_csync_ftw(void **state)
{
CSYNC *csync = (CSYNC*)*state;
@@ -370,7 +360,6 @@ int torture_run_tests(void)
cmocka_unit_test_setup_teardown(check_csync_detect_update_db_eval, setup, teardown),
cmocka_unit_test_setup_teardown(check_csync_detect_update_db_rename, setup, teardown),
cmocka_unit_test_setup_teardown(check_csync_detect_update_db_new, setup, teardown_rm),
- cmocka_unit_test_setup_teardown(check_csync_detect_update_null, setup, teardown_rm),
cmocka_unit_test_setup_teardown(check_csync_ftw, setup_ftw, teardown_rm),
cmocka_unit_test_setup_teardown(check_csync_ftw_empty_uri, setup_ftw, teardown_rm),
diff --git a/test/scripts/txpl/t7.pl b/test/scripts/txpl/t7.pl
deleted file mode 100755
index 6b68a06ef..000000000
--- a/test/scripts/txpl/t7.pl
+++ /dev/null
@@ -1,291 +0,0 @@
-#!/usr/bin/perl
-#
-# Test script for the ownCloud module of csync.
-# This script requires a running ownCloud instance accessible via HTTP.
-# It does quite some fancy tests and asserts the results.
-#
-# Copyright (C) by Klaas Freitag <freitag@owncloud.com>
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-#
-
-use lib ".";
-
-
-use File::Copy;
-use ownCloud::Test;
-
-use strict;
-
-print "Hello, this is t7, a tester for syncing of files in read only directory\n";
-
-# Check if the expected rows in the DB are non-empty. Note that in some cases they might be, then we cannot use this function
-# https://github.comowncloud/client/issues/2038
-sub assertCsyncJournalOk {
- my $path = $_[0];
-
- # FIXME: should test also remoteperm but it's not working with owncloud6
- # my $cmd = 'sqlite3 ' . $path . '._sync_*.db "SELECT count(*) from metadata where length(remotePerm) == 0 or length(fileId) == 0"';
- my $cmd = 'sqlite3 ' . $path . '._sync_*.db "SELECT count(*) from metadata where length(fileId) == 0"';
- my $result = `$cmd`;
- assert($result == "0");
-}
-
-# IMPORTANT NOTE :
-print "This test use the OWNCLOUD_TEST_PERMISSIONS environement variable and _PERM_xxx_ on filenames to set the permission. ";
-print "It does not rely on real permission set on the server. This test is just for testing the propagation choices\n";
-# "It would be nice" to have a test that test with real permissions on the server
-
-$ENV{OWNCLOUD_TEST_PERMISSIONS} = "1";
-
-initTesting();
-
-printInfo( "Init" );
-
-#create some files localy
-my $tmpdir = "/tmp/t7/";
-mkdir($tmpdir);
-createLocalFile( $tmpdir . "normalFile_PERM_WVND_.data", 100 );
-createLocalFile( $tmpdir . "cannotBeRemoved_PERM_WVN_.data", 101 );
-createLocalFile( $tmpdir . "canBeRemoved_PERM_D_.data", 102 );
-my $md5CanotBeModified = createLocalFile( $tmpdir . "canotBeModified_PERM_DVN_.data", 103 );
-createLocalFile( $tmpdir . "canBeModified_PERM_W_.data", 104 );
-
-#put them in some directories
-createRemoteDir( "normalDirectory_PERM_CKDNV_" );
-glob_put( "$tmpdir/*", "normalDirectory_PERM_CKDNV_" );
-createRemoteDir( "readonlyDirectory_PERM_M_" );
-glob_put( "$tmpdir/*", "readonlyDirectory_PERM_M_" );
-createRemoteDir( "readonlyDirectory_PERM_M_/subdir_PERM_CK_" );
-createRemoteDir( "readonlyDirectory_PERM_M_/subdir_PERM_CK_/subsubdir_PERM_CKDNV_" );
-glob_put( "$tmpdir/normalFile_PERM_WVND_.data", "readonlyDirectory_PERM_M_/subdir_PERM_CK_/subsubdir_PERM_CKDNV_" );
-
-
-csync();
-assertCsyncJournalOk(localDir());
-assertLocalAndRemoteDir( '', 0);
-
-system("sleep 1"); #make sure changes have different mtime
-
-printInfo( "Do some changes and see how they propagate" );
-
-#1. remove the file than cannot be removed
-# (they should be recovered)
-unlink( localDir() . 'normalDirectory_PERM_CKDNV_/cannotBeRemoved_PERM_WVN_.data' );
-unlink( localDir() . 'readonlyDirectory_PERM_M_/cannotBeRemoved_PERM_WVN_.data' );
-
-#2. remove the file that can be removed
-# (they should properly be gone)
-unlink( localDir() . 'normalDirectory_PERM_CKDNV_/canBeRemoved_PERM_D_.data' );
-unlink( localDir() . 'readonlyDirectory_PERM_M_/canBeRemoved_PERM_D_.data' );
-
-#3. Edit the files that cannot be modified
-# (they should be recovered, and a conflict shall be created)
-system("echo 'modified' > ". localDir() . "normalDirectory_PERM_CKDNV_/canotBeModified_PERM_DVN_.data");
-system("echo 'modified_' > ". localDir() . "readonlyDirectory_PERM_M_/canotBeModified_PERM_DVN_.data");
-
-#4. Edit other files
-# (they should be uploaded)
-system("echo '__modified' > ". localDir() . "normalDirectory_PERM_CKDNV_/canBeModified_PERM_W_.data");
-system("echo '__modified_' > ". localDir() . "readonlyDirectory_PERM_M_/canBeModified_PERM_W_.data");
-
-#5. Create a new file in a read only folder
-# (should be uploaded)
-createLocalFile( localDir() . "normalDirectory_PERM_CKDNV_/newFile_PERM_WDNV_.data", 106 );
-
-#do the sync
-csync();
-assertCsyncJournalOk(localDir());
-
-#1.
-# File should be recovered
-assert( -e localDir(). 'normalDirectory_PERM_CKDNV_/cannotBeRemoved_PERM_WVN_.data' );
-assert( -e localDir(). 'readonlyDirectory_PERM_M_/cannotBeRemoved_PERM_WVN_.data' );
-
-#2.
-# File should be deleted
-assert( !-e localDir() . 'normalDirectory_PERM_CKDNV_/canBeRemoved_PERM_D_.data' );
-assert( !-e localDir() . 'readonlyDirectory_PERM_M_/canBeRemoved_PERM_D_.data' );
-
-#3.
-# File should be recovered
-assert($md5CanotBeModified eq md5OfFile( localDir().'normalDirectory_PERM_CKDNV_/canotBeModified_PERM_DVN_.data' ));
-assert($md5CanotBeModified eq md5OfFile( localDir().'readonlyDirectory_PERM_M_/canotBeModified_PERM_DVN_.data' ));
-# and conflict created
-# TODO check that the conflict file has the right content
-assert( -e glob(localDir().'normalDirectory_PERM_CKDNV_/canotBeModified_PERM_DVN__conflict-*.data' ) );
-assert( -e glob(localDir().'readonlyDirectory_PERM_M_/canotBeModified_PERM_DVN__conflict-*.data' ) );
-# remove the conflicts for the next assertLocalAndRemoteDir
-system("rm " . localDir().'normalDirectory_PERM_CKDNV_/canotBeModified_PERM_DVN__conflict-*.data' );
-system("rm " . localDir().'readonlyDirectory_PERM_M_/canotBeModified_PERM_DVN__conflict-*.data' );
-
-#4. File should be updated, that's tested by assertLocalAndRemoteDir
-
-#5.
-# the file should be in the server and local
-assert( -e localDir() . "normalDirectory_PERM_CKDNV_/newFile_PERM_WDNV_.data" );
-
-### Both side should still be the same
-assertLocalAndRemoteDir( '', 0);
-
-# Next test
-
-#6. Create a new file in a read only folder
-# (they should not be uploaded)
-createLocalFile( localDir() . "readonlyDirectory_PERM_M_/newFile_PERM_WDNV_.data", 105 );
-
-# error: can't upload to readonly
-csync(1);
-assertCsyncJournalOk(localDir());
-
-#6.
-# The file should not exist on the remote
-# TODO: test that the file is NOT on the server
-# but still be there
-assert( -e localDir() . "readonlyDirectory_PERM_M_/newFile_PERM_WDNV_.data" );
-# remove it so assertLocalAndRemoteDir succeed.
-unlink(localDir() . "readonlyDirectory_PERM_M_/newFile_PERM_WDNV_.data");
-
-### Both side should still be the same
-assertLocalAndRemoteDir( '', 0);
-
-
-
-
-#######################################################################
-printInfo( "remove the read only directory" );
-# -> It must be recovered
-system("rm -r " . localDir().'readonlyDirectory_PERM_M_' );
-csync();
-assertCsyncJournalOk(localDir());
-assert( -e localDir(). 'readonlyDirectory_PERM_M_/cannotBeRemoved_PERM_WVN_.data' );
-assert( -e localDir(). 'readonlyDirectory_PERM_M_/subdir_PERM_CK_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data' );
-assertLocalAndRemoteDir( '', 0);
-
-
-#######################################################################
-printInfo( "move a directory in a outside read only folder" );
-system("sqlite3 " . localDir().'._sync_*.db .dump');
-
-#Missing directory should be restored
-#new directory should be uploaded
-system("mv " . localDir().'readonlyDirectory_PERM_M_/subdir_PERM_CK_ ' . localDir().'normalDirectory_PERM_CKDNV_/subdir_PERM_CKDNV_' );
-
-csync();
-system("sqlite3 " . localDir().'._sync_*.db .dump');
-assertCsyncJournalOk(localDir());
-
-# old name restored
-assert( -e localDir(). 'readonlyDirectory_PERM_M_/subdir_PERM_CK_/subsubdir_PERM_CKDNV_/' );
-assert( -e localDir(). 'readonlyDirectory_PERM_M_/subdir_PERM_CK_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data' );
-
-# new still exist
-assert( -e localDir(). 'normalDirectory_PERM_CKDNV_/subdir_PERM_CKDNV_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data' );
-
-assertLocalAndRemoteDir( '', 0);
-
-
-
-
-
-#######################################################################
-printInfo( "rename a directory in a read only folder and move a directory to a read-only" );
-
-# do a sync to update the database
-csync();
-
-#1. rename a directory in a read only folder
-#Missing directory should be restored
-#new directory should stay but not be uploaded
-system("mv " . localDir().'readonlyDirectory_PERM_M_/subdir_PERM_CK_ ' . localDir().'readonlyDirectory_PERM_M_/newname_PERM_CK_' );
-
-#2. move a directory from read to read only (move the directory from previous step)
-system("mv " . localDir().'normalDirectory_PERM_CKDNV_/subdir_PERM_CKDNV_ ' . localDir().'readonlyDirectory_PERM_M_/moved_PERM_CK_' );
-
-# error: can't upload to readonly!
-csync(1);
-assertCsyncJournalOk(localDir());
-
-#1.
-# old name restored
-assert( -e localDir(). 'readonlyDirectory_PERM_M_/subdir_PERM_CK_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data' );
-
-# new still exist
-assert( -e localDir(). 'readonlyDirectory_PERM_M_/newname_PERM_CK_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data' );
-# but is not on server: so remove for assertLocalAndRemoteDir
-system("rm -r " . localDir(). "readonlyDirectory_PERM_M_/newname_PERM_CK_");
-
-#2.
-# old removed
-assert( ! -e localDir(). 'normalDirectory_PERM_CKDNV_/subdir_PERM_CKDNV_/' );
-# new still there
-assert( -e localDir(). 'readonlyDirectory_PERM_M_/moved_PERM_CK_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data' );
-#but not on server
-system("rm -r " . localDir(). "readonlyDirectory_PERM_M_/moved_PERM_CK_");
-
-assertLocalAndRemoteDir( '', 0);
-
-system("sqlite3 " . localDir().'._sync_*.db .dump');
-
-
-#######################################################################
-printInfo( "multiple restores of a file create different conflict files" );
-
-system("sleep 1"); #make sure changes have different mtime
-
-system("echo 'modified_1' > ". localDir() . "readonlyDirectory_PERM_M_/canotBeModified_PERM_DVN_.data");
-
-#do the sync
-csync();
-assertCsyncJournalOk(localDir());
-
-system("sleep 1"); #make sure changes have different mtime
-
-system("echo 'modified_2' > ". localDir() . "readonlyDirectory_PERM_M_/canotBeModified_PERM_DVN_.data");
-
-#do the sync
-csync();
-assertCsyncJournalOk(localDir());
-
-# there should be two conflict files
-# TODO check that the conflict file has the right content
-my @conflicts = glob(localDir().'readonlyDirectory_PERM_M_/canotBeModified_PERM_DVN__conflict-*.data' );
-assert( scalar @conflicts == 2 );
-# remove the conflicts for the next assertLocalAndRemoteDir
-system("rm " . localDir().'readonlyDirectory_PERM_M_/canotBeModified_PERM_DVN__conflict-*.data' );
-
-### Both side should still be the same
-assertLocalAndRemoteDir( '', 0);
-
-
-
-cleanup();
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/test/syncenginetestutils.h b/test/syncenginetestutils.h
index 1f0a12431..14f173ba4 100644
--- a/test/syncenginetestutils.h
+++ b/test/syncenginetestutils.h
@@ -317,6 +317,7 @@ public:
QString name;
bool isDir = true;
bool isShared = false;
+ OCC::RemotePermissions permissions; // When uset, defaults to everything
QDateTime lastModified = QDateTime::currentDateTime().addDays(-7);
QString etag = generateEtag();
QByteArray fileId = generateFileId();
@@ -390,7 +391,9 @@ public:
xml.writeTextElement(davUri, QStringLiteral("getlastmodified"), stringDate);
xml.writeTextElement(davUri, QStringLiteral("getcontentlength"), QString::number(fileInfo.size));
xml.writeTextElement(davUri, QStringLiteral("getetag"), fileInfo.etag);
- xml.writeTextElement(ocUri, QStringLiteral("permissions"), fileInfo.isShared ? QStringLiteral("SRDNVCKW") : QStringLiteral("RDNVCKW"));
+ xml.writeTextElement(ocUri, QStringLiteral("permissions"), !fileInfo.permissions.isNull()
+ ? QString(fileInfo.permissions.toString())
+ : fileInfo.isShared ? QStringLiteral("SRDNVCKW") : QStringLiteral("RDNVCKW"));
xml.writeTextElement(ocUri, QStringLiteral("id"), fileInfo.fileId);
xml.writeTextElement(ocUri, QStringLiteral("checksums"), fileInfo.checksums);
xml.writeTextElement(ocUri, QStringLiteral("zsync"), QStringLiteral("true"));
@@ -475,6 +478,7 @@ public:
emit uploadProgress(fileInfo->size, fileInfo->size);
setRawHeader("OC-ETag", fileInfo->etag.toLatin1());
setRawHeader("ETag", fileInfo->etag.toLatin1());
+ setRawHeader("OC-FileID", fileInfo->fileId);
setRawHeader("X-OC-MTime", "accepted"); // Prevents Q_ASSERT(!_runningNow) since we'll call PropagateItemJob::done twice in that case.
setAttribute(QNetworkRequest::HttpStatusCodeAttribute, 200);
emit metaDataChanged();
@@ -938,8 +942,8 @@ class FakeErrorReply : public QNetworkReply
Q_OBJECT
public:
FakeErrorReply(QNetworkAccessManager::Operation op, const QNetworkRequest &request,
- QObject *parent, int httpErrorCode)
- : QNetworkReply{parent}, _httpErrorCode(httpErrorCode) {
+ QObject *parent, int httpErrorCode, const QByteArray &body = QByteArray())
+ : QNetworkReply{parent}, _httpErrorCode(httpErrorCode), _body(body) {
setRequest(request);
setUrl(request.url());
setOperation(op);
@@ -951,13 +955,31 @@ public:
setAttribute(QNetworkRequest::HttpStatusCodeAttribute, _httpErrorCode);
setError(InternalServerError, "Internal Server Fake Error");
emit metaDataChanged();
+ emit readyRead();
+ // finishing can come strictly after readyRead was called
+ QTimer::singleShot(5, this, &FakeErrorReply::slotSetFinished);
+ }
+
+public slots:
+ void slotSetFinished() {
+ setFinished(true);
emit finished();
}
+public:
void abort() override { }
- qint64 readData(char *, qint64) override { return 0; }
+ qint64 readData(char *buf, qint64 max) override {
+ max = qMin<qint64>(max, _body.size());
+ memcpy(buf, _body.constData(), max);
+ _body = _body.mid(max);
+ return max;
+ }
+ qint64 bytesAvailable() const override {
+ return _body.size();
+ }
int _httpErrorCode;
+ QByteArray _body;
};
// A reply that never responds
@@ -974,7 +996,14 @@ public:
open(QIODevice::ReadOnly);
}
- void abort() override {}
+ void abort() override {
+ // Follow more or less the implementation of QNetworkReplyImpl::abort
+ close();
+ setError(OperationCanceledError, tr("Operation canceled"));
+ emit error(OperationCanceledError);
+ setFinished(true);
+ emit finished();
+ }
qint64 readData(char *, qint64) override { return 0; }
};
@@ -1103,6 +1132,7 @@ public:
_account = OCC::Account::create();
_account->setUrl(QUrl(QStringLiteral("http://admin:admin@localhost/owncloud")));
_account->setCredentials(new FakeCredentials{_fakeQnam});
+ _account->setDavDisplayName("fakename");
_journalDb.reset(new OCC::SyncJournalDb(localPath() + "._sync_test.db"));
_syncEngine.reset(new OCC::SyncEngine(_account, localPath(), "", _journalDb.get()));
@@ -1216,13 +1246,30 @@ private:
qWarning() << "Empty file at:" << diskChild.filePath();
continue;
}
- char contentChar = f.read(1).at(0);
+ char contentChar = content.at(0);
templateFi.children.insert(diskChild.fileName(), FileInfo{diskChild.fileName(), diskChild.size(), contentChar});
}
}
}
};
+/* Return the FileInfo for a conflict file for the specified relative filename */
+inline const FileInfo *findConflict(FileInfo &dir, const QString &filename)
+{
+ QFileInfo info(filename);
+ const FileInfo *parentDir = dir.find(info.path());
+ if (!parentDir)
+ return nullptr;
+ QString start = info.baseName() + " (conflicted copy";
+ for (const auto &item : parentDir->children) {
+ if (item.name.startsWith(start)) {
+ return &item;
+ }
+ }
+ return nullptr;
+}
+
+
// QTest::toString overloads
namespace OCC {
inline char *toString(const SyncFileStatus &s) {
diff --git a/test/testallfilesdeleted.cpp b/test/testallfilesdeleted.cpp
index 856fe73e3..e0dbbdd44 100644
--- a/test/testallfilesdeleted.cpp
+++ b/test/testallfilesdeleted.cpp
@@ -151,6 +151,108 @@ private slots:
QCOMPARE(fakeFolder.currentLocalState(), expectedState);
QCOMPARE(fakeFolder.currentRemoteState(), expectedState);
}
+
+ void testResetServer()
+ {
+ FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
+
+ int aboutToRemoveAllFilesCalled = 0;
+ QObject::connect(&fakeFolder.syncEngine(), &SyncEngine::aboutToRemoveAllFiles,
+ [&](SyncFileItem::Direction dir, bool *cancel) {
+ QCOMPARE(aboutToRemoveAllFilesCalled, 0);
+ aboutToRemoveAllFilesCalled++;
+ QCOMPARE(dir, SyncFileItem::Down);
+ *cancel = false;
+ });
+
+ // Some small changes
+ fakeFolder.localModifier().mkdir("Q");
+ fakeFolder.localModifier().insert("Q/q1");
+ fakeFolder.localModifier().appendByte("B/b1");
+ QVERIFY(fakeFolder.syncOnce());
+ QCOMPARE(aboutToRemoveAllFilesCalled, 0);
+
+ // Do some change localy
+ fakeFolder.localModifier().appendByte("A/a1");
+
+ // reset the server.
+ fakeFolder.remoteModifier() = FileInfo::A12_B12_C12_S12();
+
+ // Now, aboutToRemoveAllFiles with down as a direction
+ QVERIFY(fakeFolder.syncOnce());
+ QCOMPARE(aboutToRemoveAllFilesCalled, 1);
+
+ }
+
+ void testDataFingetPrint_data()
+ {
+ QTest::addColumn<bool>("hasInitialFingerPrint");
+ QTest::newRow("initial finger print") << true;
+ QTest::newRow("no initial finger print") << false;
+ }
+
+ void testDataFingetPrint()
+ {
+ QFETCH(bool, hasInitialFingerPrint);
+ FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() };
+ fakeFolder.remoteModifier().setContents("C/c1", 'N');
+ fakeFolder.remoteModifier().setModTime("C/c1", QDateTime::currentDateTimeUtc().addDays(-2));
+ fakeFolder.remoteModifier().remove("C/c2");
+ if (hasInitialFingerPrint) {
+ fakeFolder.remoteModifier().extraDavProperties = "<oc:data-fingerprint>initial_finger_print</oc:data-fingerprint>";
+ } else {
+ //Server support finger print, but none is set.
+ fakeFolder.remoteModifier().extraDavProperties = "<oc:data-fingerprint></oc:data-fingerprint>";
+ }
+ QVERIFY(fakeFolder.syncOnce());
+ // First sync, we did not change the finger print, so the file should be downloaded as normal
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ QCOMPARE(fakeFolder.currentRemoteState().find("C/c1")->contentChar, 'N');
+ QVERIFY(!fakeFolder.currentRemoteState().find("C/c2"));
+
+ /* Simulate a backup restoration */
+
+ // A/a1 is an old file
+ fakeFolder.remoteModifier().setContents("A/a1", 'O');
+ fakeFolder.remoteModifier().setModTime("A/a1", QDateTime::currentDateTimeUtc().addDays(-2));
+ // B/b1 did not exist at the time of the backup
+ fakeFolder.remoteModifier().remove("B/b1");
+ // B/b2 was uploaded by another user in the mean time.
+ fakeFolder.remoteModifier().setContents("B/b2", 'N');
+ fakeFolder.remoteModifier().setModTime("B/b2", QDateTime::currentDateTimeUtc().addDays(2));
+
+ // C/c3 was removed since we made the backup
+ fakeFolder.remoteModifier().insert("C/c3_removed");
+ // C/c4 was moved to A/a2 since we made the backup
+ fakeFolder.remoteModifier().rename("A/a2", "C/old_a2_location");
+
+ // The admin sets the data-fingerprint property
+ fakeFolder.remoteModifier().extraDavProperties = "<oc:data-fingerprint>new_finger_print</oc:data-fingerprint>";
+
+ QVERIFY(fakeFolder.syncOnce());
+ auto currentState = fakeFolder.currentLocalState();
+ // Altough the local file is kept as a conflict, the server file is downloaded
+ QCOMPARE(currentState.find("A/a1")->contentChar, 'O');
+ auto conflict = findConflict(currentState, "A/a1");
+ QVERIFY(conflict);
+ QCOMPARE(conflict->contentChar, 'W');
+ fakeFolder.localModifier().remove(conflict->path());
+ // b1 was restored (re-uploaded)
+ QVERIFY(currentState.find("B/b1"));
+
+ // b2 has the new content (was not restored), since its mode time goes forward in time
+ QCOMPARE(currentState.find("B/b2")->contentChar, 'N');
+ conflict = findConflict(currentState, "B/b2");
+ QVERIFY(conflict); // Just to be sure, we kept the old file in a conflict
+ QCOMPARE(conflict->contentChar, 'W');
+ fakeFolder.localModifier().remove(conflict->path());
+
+ // We actually do not remove files that technically should have been removed (we don't want data-loss)
+ QVERIFY(currentState.find("C/c3_removed"));
+ QVERIFY(currentState.find("C/old_a2_location"));
+
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ }
};
QTEST_GUILESS_MAIN(TestAllFilesDeleted)
diff --git a/test/testblacklist.cpp b/test/testblacklist.cpp
new file mode 100644
index 000000000..cad9f35f2
--- /dev/null
+++ b/test/testblacklist.cpp
@@ -0,0 +1,193 @@
+/*
+ * This software is in the public domain, furnished "as is", without technical
+ * support, and with no warranty, express or implied, as to its usefulness for
+ * any purpose.
+ *
+ */
+
+#include <QtTest>
+#include "syncenginetestutils.h"
+#include <syncengine.h>
+
+using namespace OCC;
+
+SyncFileItemPtr findItem(const QSignalSpy &spy, const QString &path)
+{
+ for (const QList<QVariant> &args : spy) {
+ auto item = args[0].value<SyncFileItemPtr>();
+ if (item->destination() == path)
+ return item;
+ }
+ return SyncFileItemPtr(new SyncFileItem);
+}
+
+SyncJournalFileRecord journalRecord(FakeFolder &folder, const QByteArray &path)
+{
+ SyncJournalFileRecord rec;
+ folder.syncJournal().getFileRecord(path, &rec);
+ return rec;
+}
+
+class TestBlacklist : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void testBlacklistBasic_data()
+ {
+ QTest::addColumn<bool>("remote");
+ QTest::newRow("remote") << true;
+ QTest::newRow("local") << false;
+ }
+
+ void testBlacklistBasic()
+ {
+ QFETCH(bool, remote);
+
+ FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() };
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ QSignalSpy completeSpy(&fakeFolder.syncEngine(), SIGNAL(itemCompleted(const SyncFileItemPtr &)));
+
+ auto &modifier = remote ? fakeFolder.remoteModifier() : fakeFolder.localModifier();
+
+ int counter = 0;
+ QByteArray reqId;
+ fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *) -> QNetworkReply * {
+ reqId = req.rawHeader("X-Request-ID");
+ if (!remote && op == QNetworkAccessManager::PutOperation)
+ ++counter;
+ if (remote && op == QNetworkAccessManager::GetOperation)
+ ++counter;
+ return nullptr;
+ });
+
+ auto cleanup = [&]() {
+ completeSpy.clear();
+ };
+
+ auto initialEtag = journalRecord(fakeFolder, "A")._etag;
+ QVERIFY(!initialEtag.isEmpty());
+
+ // The first sync and the download will fail - the item will be blacklisted
+ modifier.insert("A/new");
+ fakeFolder.serverErrorPaths().append("A/new", 500); // will be blacklisted
+ QVERIFY(!fakeFolder.syncOnce());
+ {
+ auto it = findItem(completeSpy, "A/new");
+ QVERIFY(it);
+ QCOMPARE(it->_status, SyncFileItem::NormalError); // initial error visible
+ QCOMPARE(it->_instruction, CSYNC_INSTRUCTION_NEW);
+
+ auto entry = fakeFolder.syncJournal().errorBlacklistEntry("A/new");
+ QVERIFY(entry.isValid());
+ QCOMPARE(entry._errorCategory, SyncJournalErrorBlacklistRecord::Normal);
+ QCOMPARE(entry._retryCount, 1);
+ QCOMPARE(counter, 1);
+ QVERIFY(entry._ignoreDuration > 0);
+ QCOMPARE(entry._requestId, reqId);
+
+ if (remote)
+ QCOMPARE(journalRecord(fakeFolder, "A")._etag, initialEtag);
+ }
+ cleanup();
+
+ // Ignored during the second run - but soft errors are also errors
+ QVERIFY(!fakeFolder.syncOnce());
+ {
+ auto it = findItem(completeSpy, "A/new");
+ QVERIFY(it);
+ QCOMPARE(it->_status, SyncFileItem::BlacklistedError);
+ QCOMPARE(it->_instruction, CSYNC_INSTRUCTION_IGNORE); // no retry happened!
+
+ auto entry = fakeFolder.syncJournal().errorBlacklistEntry("A/new");
+ QVERIFY(entry.isValid());
+ QCOMPARE(entry._errorCategory, SyncJournalErrorBlacklistRecord::Normal);
+ QCOMPARE(entry._retryCount, 1);
+ QCOMPARE(counter, 1);
+ QVERIFY(entry._ignoreDuration > 0);
+ QCOMPARE(entry._requestId, reqId);
+
+ if (remote)
+ QCOMPARE(journalRecord(fakeFolder, "A")._etag, initialEtag);
+ }
+ cleanup();
+
+ // Let's expire the blacklist entry to verify it gets retried
+ {
+ auto entry = fakeFolder.syncJournal().errorBlacklistEntry("A/new");
+ entry._ignoreDuration = 1;
+ entry._lastTryTime -= 1;
+ fakeFolder.syncJournal().setErrorBlacklistEntry(entry);
+ }
+ QVERIFY(!fakeFolder.syncOnce());
+ {
+ auto it = findItem(completeSpy, "A/new");
+ QVERIFY(it);
+ QCOMPARE(it->_status, SyncFileItem::BlacklistedError); // blacklisted as it's just a retry
+ QCOMPARE(it->_instruction, CSYNC_INSTRUCTION_NEW); // retry!
+
+ auto entry = fakeFolder.syncJournal().errorBlacklistEntry("A/new");
+ QVERIFY(entry.isValid());
+ QCOMPARE(entry._errorCategory, SyncJournalErrorBlacklistRecord::Normal);
+ QCOMPARE(entry._retryCount, 2);
+ QCOMPARE(counter, 2);
+ QVERIFY(entry._ignoreDuration > 0);
+ QCOMPARE(entry._requestId, reqId);
+
+ if (remote)
+ QCOMPARE(journalRecord(fakeFolder, "A")._etag, initialEtag);
+ }
+ cleanup();
+
+ // When the file changes a retry happens immediately
+ modifier.appendByte("A/new");
+ QVERIFY(!fakeFolder.syncOnce());
+ {
+ auto it = findItem(completeSpy, "A/new");
+ QVERIFY(it);
+ QCOMPARE(it->_status, SyncFileItem::BlacklistedError);
+ QCOMPARE(it->_instruction, CSYNC_INSTRUCTION_NEW); // retry!
+
+ auto entry = fakeFolder.syncJournal().errorBlacklistEntry("A/new");
+ QVERIFY(entry.isValid());
+ QCOMPARE(entry._errorCategory, SyncJournalErrorBlacklistRecord::Normal);
+ QCOMPARE(entry._retryCount, 3);
+ QCOMPARE(counter, 3);
+ QVERIFY(entry._ignoreDuration > 0);
+ QCOMPARE(entry._requestId, reqId);
+
+ if (remote)
+ QCOMPARE(journalRecord(fakeFolder, "A")._etag, initialEtag);
+ }
+ cleanup();
+
+ // When the error goes away and the item is retried, the sync succeeds
+ fakeFolder.serverErrorPaths().clear();
+ {
+ auto entry = fakeFolder.syncJournal().errorBlacklistEntry("A/new");
+ entry._ignoreDuration = 1;
+ entry._lastTryTime -= 1;
+ fakeFolder.syncJournal().setErrorBlacklistEntry(entry);
+ }
+ QVERIFY(fakeFolder.syncOnce());
+ {
+ auto it = findItem(completeSpy, "A/new");
+ QVERIFY(it);
+ QCOMPARE(it->_status, SyncFileItem::Success);
+ QCOMPARE(it->_instruction, CSYNC_INSTRUCTION_NEW);
+
+ auto entry = fakeFolder.syncJournal().errorBlacklistEntry("A/new");
+ QVERIFY(!entry.isValid());
+ QCOMPARE(counter, 4);
+
+ if (remote)
+ QCOMPARE(journalRecord(fakeFolder, "A")._etag, fakeFolder.currentRemoteState().find("A")->etag.toUtf8());
+ }
+ cleanup();
+
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ }
+};
+
+QTEST_GUILESS_MAIN(TestBlacklist)
+#include "testblacklist.moc"
diff --git a/test/testchecksumvalidator.cpp b/test/testchecksumvalidator.cpp
index 041dc193c..36e32f897 100644
--- a/test/testchecksumvalidator.cpp
+++ b/test/testchecksumvalidator.cpp
@@ -15,15 +15,14 @@
#include "filesystem.h"
#include "propagatorjobs.h"
-
using namespace OCC;
+using namespace OCC::Utility;
class TestChecksumValidator : public QObject
{
Q_OBJECT
-
private:
- QString _root;
+ QTemporaryDir _root;
QString _testfile;
QString _expectedError;
QByteArray _expected;
@@ -48,17 +47,62 @@ using namespace OCC;
_errorSeen = true;
}
+ static QByteArray shellSum( const QByteArray& cmd, const QString& file )
+ {
+ QProcess md5;
+ QStringList args;
+ args.append(file);
+ md5.start(cmd, args);
+ QByteArray sumShell;
+ qDebug() << "File: "<< file;
+
+ if( md5.waitForFinished() ) {
+
+ sumShell = md5.readAll();
+ sumShell = sumShell.left( sumShell.indexOf(' '));
+ }
+ return sumShell;
+ }
+
private slots:
void initTestCase() {
- _root = QDir::tempPath() + "/" + "test_" + QString::number(qrand());
- QDir rootDir(_root);
-
- rootDir.mkpath(_root );
- _testfile = _root+"/csFile";
+ _testfile = _root.path()+"/csFile";
Utility::writeRandomFile( _testfile);
}
+ void testMd5Calc()
+ {
+ QString file( _root.path() + "/file_a.bin");
+ QVERIFY(writeRandomFile(file));
+ QFileInfo fi(file);
+ QVERIFY(fi.exists());
+ QByteArray sum = calcMd5(file);
+
+ QByteArray sSum = shellSum("md5sum", file);
+ if (sSum.isEmpty())
+ QSKIP("Couldn't execute md5sum to calculate checksum, executable missing?", SkipSingle);
+
+ QVERIFY(!sum.isEmpty());
+ QCOMPARE(sSum, sum);
+ }
+
+ void testSha1Calc()
+ {
+ QString file( _root.path() + "/file_b.bin");
+ writeRandomFile(file);
+ QFileInfo fi(file);
+ QVERIFY(fi.exists());
+ QByteArray sum = calcSha1(file);
+
+ QByteArray sSum = shellSum("sha1sum", file);
+ if (sSum.isEmpty())
+ QSKIP("Couldn't execute sha1sum to calculate checksum, executable missing?", SkipSingle);
+
+ QVERIFY(!sum.isEmpty());
+ QCOMPARE(sSum, sum);
+ }
+
void testUploadChecksummingAdler() {
#ifndef ZLIB_FOUND
QSKIP("ZLIB not found.", SkipSingle);
@@ -69,7 +113,7 @@ using namespace OCC;
connect(vali, SIGNAL(done(QByteArray,QByteArray)), SLOT(slotUpValidated(QByteArray,QByteArray)));
- _expected = FileSystem::calcAdler32( _testfile );
+ _expected = calcAdler32( _testfile );
qDebug() << "XX Expected Checksum: " << _expected;
vali->start(_testfile);
@@ -88,7 +132,7 @@ using namespace OCC;
vali->setChecksumType(_expectedType);
connect(vali, SIGNAL(done(QByteArray,QByteArray)), this, SLOT(slotUpValidated(QByteArray,QByteArray)));
- _expected = FileSystem::calcMd5( _testfile );
+ _expected = calcMd5( _testfile );
vali->start(_testfile);
QEventLoop loop;
@@ -105,7 +149,7 @@ using namespace OCC;
vali->setChecksumType(_expectedType);
connect(vali, SIGNAL(done(QByteArray,QByteArray)), this, SLOT(slotUpValidated(QByteArray,QByteArray)));
- _expected = FileSystem::calcSha1( _testfile );
+ _expected = calcSha1( _testfile );
vali->start(_testfile);
@@ -122,7 +166,7 @@ using namespace OCC;
#else
QByteArray adler = checkSumAdlerC;
adler.append(":");
- adler.append(FileSystem::calcAdler32( _testfile ));
+ adler.append(calcAdler32( _testfile ));
_successDown = false;
ValidateChecksumHeader *vali = new ValidateChecksumHeader(this);
diff --git a/test/testchunkingng.cpp b/test/testchunkingng.cpp
index ce7880537..3439f7cfc 100644
--- a/test/testchunkingng.cpp
+++ b/test/testchunkingng.cpp
@@ -40,6 +40,15 @@ static void partialUpload(FakeFolder &fakeFolder, const QString &name, int size)
[](int s, const FileInfo &i) { return s + i.size; }));
}
+// Reduce max chunk size a bit so we get more chunks
+static void setChunkSize(SyncEngine &engine, quint64 size)
+{
+ SyncOptions options;
+ options._maxChunkSize = size;
+ options._initialChunkSize = size;
+ options._minChunkSize = size;
+ engine.setSyncOptions(options);
+}
class TestChunkingNG : public QObject
{
@@ -50,7 +59,9 @@ private slots:
void testFileUpload() {
FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
fakeFolder.syncEngine().account()->setCapabilities({ { "dav", QVariantMap{ {"chunking", "1.0"} } } });
- const int size = 300 * 1000 * 1000; // 300 MB
+ setChunkSize(fakeFolder.syncEngine(), 1 * 1000 * 1000);
+ const int size = 10 * 1000 * 1000; // 10 MB
+
fakeFolder.localModifier().insert("A/a0", size);
QVERIFY(fakeFolder.syncOnce());
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
@@ -64,30 +75,133 @@ private slots:
QCOMPARE(fakeFolder.uploadState().children.count(), 2); // the transfer was done with chunking
}
-
- void testResume () {
+ // Test resuming when there's a confusing chunk added
+ void testResume1() {
FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
fakeFolder.syncEngine().account()->setCapabilities({ { "dav", QVariantMap{ {"chunking", "1.0"} } } });
- const int size = 300 * 1000 * 1000; // 300 MB
+ const int size = 10 * 1000 * 1000; // 10 MB
+ setChunkSize(fakeFolder.syncEngine(), 1 * 1000 * 1000);
+
partialUpload(fakeFolder, "A/a0", size);
QCOMPARE(fakeFolder.uploadState().children.count(), 1);
auto chunkingId = fakeFolder.uploadState().children.first().name;
const auto &chunkMap = fakeFolder.uploadState().children.first().children;
quint64 uploadedSize = std::accumulate(chunkMap.begin(), chunkMap.end(), 0LL, [](quint64 s, const FileInfo &f) { return s + f.size; });
- QVERIFY(uploadedSize > 50 * 1000 * 1000); // at least 50 MB
+ QVERIFY(uploadedSize > 2 * 1000 * 1000); // at least 2 MB
- // Add a fake file to make sure it gets deleted
+ // Add a fake chunk to make sure it gets deleted
fakeFolder.uploadState().children.first().insert("10000", size);
fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *) -> QNetworkReply * {
if (op == QNetworkAccessManager::PutOperation) {
// Test that we properly resuming and are not sending past data again.
Q_ASSERT(request.rawHeader("OC-Chunk-Offset").toULongLong() >= uploadedSize);
+ } else if (op == QNetworkAccessManager::DeleteOperation) {
+ Q_ASSERT(request.url().path().endsWith("/10000"));
+ }
+ return nullptr;
+ });
+
+ QVERIFY(fakeFolder.syncOnce());
+
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ QCOMPARE(fakeFolder.currentRemoteState().find("A/a0")->size, size);
+ // The same chunk id was re-used
+ QCOMPARE(fakeFolder.uploadState().children.count(), 1);
+ QCOMPARE(fakeFolder.uploadState().children.first().name, chunkingId);
+ }
+
+ // Test resuming when one of the uploaded chunks got removed
+ void testResume2() {
+ FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
+ fakeFolder.syncEngine().account()->setCapabilities({ { "dav", QVariantMap{ {"chunking", "1.0"} } } });
+ setChunkSize(fakeFolder.syncEngine(), 1 * 1000 * 1000);
+ const int size = 150 * 1000 * 1000; // 30 MB
+ partialUpload(fakeFolder, "A/a0", size);
+ QCOMPARE(fakeFolder.uploadState().children.count(), 1);
+ auto chunkingId = fakeFolder.uploadState().children.first().name;
+ const auto &chunkMap = fakeFolder.uploadState().children.first().children;
+ quint64 uploadedSize = std::accumulate(chunkMap.begin(), chunkMap.end(), 0LL, [](quint64 s, const FileInfo &f) { return s + f.size; });
+ QVERIFY(uploadedSize > 2 * 1000 * 1000); // at least 50 MB
+ QVERIFY(chunkMap.size() >= 3); // at least three chunks
+
+ QStringList chunksToDelete;
+
+ // Remove the second chunk, so all further chunks will be deleted and resent
+ auto firstChunk = chunkMap.first();
+ auto secondChunk = *(chunkMap.begin() + 1);
+ for (const auto& name : chunkMap.keys().mid(2)) {
+ chunksToDelete.append(name);
+ }
+ fakeFolder.uploadState().children.first().remove(secondChunk.name);
+
+ QStringList deletedPaths;
+ fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *) -> QNetworkReply * {
+ if (op == QNetworkAccessManager::PutOperation) {
+ // Test that we properly resuming, not resending the first chunk
+ Q_ASSERT(request.rawHeader("OC-Chunk-Offset").toLongLong() >= firstChunk.size);
+ } else if (op == QNetworkAccessManager::DeleteOperation) {
+ deletedPaths.append(request.url().path());
+ }
+ return nullptr;
+ });
+
+ QVERIFY(fakeFolder.syncOnce());
+
+ for (const auto& toDelete : chunksToDelete) {
+ bool wasDeleted = false;
+ for (const auto& deleted : deletedPaths) {
+ if (deleted.mid(deleted.lastIndexOf('/') + 1) == toDelete) {
+ wasDeleted = true;
+ break;
+ }
+ }
+ QVERIFY(wasDeleted);
+ }
+
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ QCOMPARE(fakeFolder.currentRemoteState().find("A/a0")->size, size);
+ // The same chunk id was re-used
+ QCOMPARE(fakeFolder.uploadState().children.count(), 1);
+ QCOMPARE(fakeFolder.uploadState().children.first().name, chunkingId);
+ }
+
+ // Test resuming when all chunks are already present
+ void testResume3() {
+ FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
+ fakeFolder.syncEngine().account()->setCapabilities({ { "dav", QVariantMap{ {"chunking", "1.0"} } } });
+ const int size = 30 * 1000 * 1000; // 30 MB
+ setChunkSize(fakeFolder.syncEngine(), 1 * 1000 * 1000);
+
+ partialUpload(fakeFolder, "A/a0", size);
+ QCOMPARE(fakeFolder.uploadState().children.count(), 1);
+ auto chunkingId = fakeFolder.uploadState().children.first().name;
+ const auto &chunkMap = fakeFolder.uploadState().children.first().children;
+ quint64 uploadedSize = std::accumulate(chunkMap.begin(), chunkMap.end(), 0LL, [](quint64 s, const FileInfo &f) { return s + f.size; });
+ QVERIFY(uploadedSize > 5 * 1000 * 1000); // at least 5 MB
+
+ // Add a chunk that makes the file completely uploaded
+ fakeFolder.uploadState().children.first().insert(
+ QString::number(chunkMap.size()).rightJustified(8, '0'), size - uploadedSize);
+
+ bool sawPut = false;
+ bool sawDelete = false;
+ bool sawMove = false;
+ fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *) -> QNetworkReply * {
+ if (op == QNetworkAccessManager::PutOperation) {
+ sawPut = true;
+ } else if (op == QNetworkAccessManager::DeleteOperation) {
+ sawDelete = true;
+ } else if (request.attribute(QNetworkRequest::CustomVerbAttribute) == "MOVE") {
+ sawMove = true;
}
return nullptr;
});
QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(sawMove);
+ QVERIFY(!sawPut);
+ QVERIFY(!sawDelete);
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
QCOMPARE(fakeFolder.currentRemoteState().find("A/a0")->size, size);
@@ -96,19 +210,48 @@ private slots:
QCOMPARE(fakeFolder.uploadState().children.first().name, chunkingId);
}
+ // Test resuming (or rather not resuming!) for the error case of the sum of
+ // chunk sizes being larger than the file size
+ void testResume4() {
+ FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
+ fakeFolder.syncEngine().account()->setCapabilities({ { "dav", QVariantMap{ {"chunking", "1.0"} } } });
+ const int size = 30 * 1000 * 1000; // 300 MB
+ setChunkSize(fakeFolder.syncEngine(), 1 * 1000 * 1000);
+
+ partialUpload(fakeFolder, "A/a0", size);
+ QCOMPARE(fakeFolder.uploadState().children.count(), 1);
+ auto chunkingId = fakeFolder.uploadState().children.first().name;
+ const auto &chunkMap = fakeFolder.uploadState().children.first().children;
+ quint64 uploadedSize = std::accumulate(chunkMap.begin(), chunkMap.end(), 0LL, [](quint64 s, const FileInfo &f) { return s + f.size; });
+ QVERIFY(uploadedSize > 5 * 1000 * 1000); // at least 5 MB
+
+ // Add a chunk that makes the file more than completely uploaded
+ fakeFolder.uploadState().children.first().insert(
+ QString::number(chunkMap.size()).rightJustified(8, '0'), size - uploadedSize + 100);
+
+ QVERIFY(fakeFolder.syncOnce());
+
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ QCOMPARE(fakeFolder.currentRemoteState().find("A/a0")->size, size);
+ // Used a new transfer id but wiped the old one
+ QCOMPARE(fakeFolder.uploadState().children.count(), 1);
+ QVERIFY(fakeFolder.uploadState().children.first().name != chunkingId);
+ }
+
// Check what happens when we abort during the final MOVE and the
// the final MOVE takes longer than the abort-delay
void testLateAbortHard()
{
FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() };
fakeFolder.syncEngine().account()->setCapabilities({ { "dav", QVariantMap{ { "chunking", "1.0" } } }, { "checksums", QVariantMap{ { "supportedTypes", QStringList() << "SHA1" } } } });
- const int size = 150 * 1000 * 1000;
+ const int size = 15 * 1000 * 1000;
+ setChunkSize(fakeFolder.syncEngine(), 1 * 1000 * 1000);
// Make the MOVE never reply, but trigger a client-abort and apply the change remotely
auto parent = new QObject;
QByteArray moveChecksumHeader;
int nGET = 0;
- int responseDelay = 10000; // bigger than abort-wait timeout
+ int responseDelay = 100000; // bigger than abort-wait timeout
fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *) -> QNetworkReply * {
if (request.attribute(QNetworkRequest::CustomVerbAttribute) == "MOVE") {
QTimer::singleShot(50, parent, [&]() { fakeFolder.syncEngine().abort(); });
@@ -185,25 +328,20 @@ private slots:
{
FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() };
fakeFolder.syncEngine().account()->setCapabilities({ { "dav", QVariantMap{ { "chunking", "1.0" } } }, { "checksums", QVariantMap{ { "supportedTypes", QStringList() << "SHA1" } } } });
- const int size = 150 * 1000 * 1000;
+ const int size = 15 * 1000 * 1000;
+ setChunkSize(fakeFolder.syncEngine(), 1 * 1000 * 1000);
// Make the MOVE never reply, but trigger a client-abort and apply the change remotely
auto parent = new QObject;
- QByteArray moveChecksumHeader;
- int nGET = 0;
- int responseDelay = 2000; // smaller than abort-wait timeout
+ int responseDelay = 200; // smaller than abort-wait timeout
fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *) -> QNetworkReply * {
if (request.attribute(QNetworkRequest::CustomVerbAttribute) == "MOVE") {
QTimer::singleShot(50, parent, [&]() { fakeFolder.syncEngine().abort(); });
- moveChecksumHeader = request.rawHeader("OC-Checksum");
return new DelayedReply<FakeChunkMoveReply>(responseDelay, fakeFolder.uploadState(), fakeFolder.remoteModifier(), op, request, parent);
- } else if (op == QNetworkAccessManager::GetOperation) {
- nGET++;
}
return nullptr;
});
-
// Test 1: NEW file aborted
fakeFolder.localModifier().insert("A/a0", size);
QVERIFY(fakeFolder.syncOnce());
@@ -220,7 +358,9 @@ private slots:
FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
fakeFolder.syncEngine().account()->setCapabilities({ { "dav", QVariantMap{ {"chunking", "1.0"} } } });
- const int size = 300 * 1000 * 1000; // 300 MB
+ const int size = 10 * 1000 * 1000; // 10 MB
+ setChunkSize(fakeFolder.syncEngine(), 1 * 1000 * 1000);
+
partialUpload(fakeFolder, "A/a0", size);
QCOMPARE(fakeFolder.uploadState().children.count(), 1);
auto chunkingId = fakeFolder.uploadState().children.first().name;
@@ -243,7 +383,9 @@ private slots:
FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
fakeFolder.syncEngine().account()->setCapabilities({ { "dav", QVariantMap{ {"chunking", "1.0"} } } });
- const int size = 300 * 1000 * 1000; // 300 MB
+ const int size = 10 * 1000 * 1000; // 10 MB
+ setChunkSize(fakeFolder.syncEngine(), 1 * 1000 * 1000);
+
partialUpload(fakeFolder, "A/a0", size);
QCOMPARE(fakeFolder.uploadState().children.count(), 1);
@@ -257,7 +399,8 @@ private slots:
void testCreateConflictWhileSyncing() {
FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
fakeFolder.syncEngine().account()->setCapabilities({ { "dav", QVariantMap{ {"chunking", "1.0"} } } });
- const int size = 150 * 1000 * 1000; // 150 MB
+ const int size = 10 * 1000 * 1000; // 10 MB
+ setChunkSize(fakeFolder.syncEngine(), 1 * 1000 * 1000);
// Put a file on the server and download it.
fakeFolder.remoteModifier().insert("A/a0", size);
@@ -294,7 +437,7 @@ private slots:
// There is a conflict file with our version
auto &stateAChildren = localState.find("A")->children;
auto it = std::find_if(stateAChildren.cbegin(), stateAChildren.cend(), [&](const FileInfo &fi) {
- return fi.name.startsWith("a0_conflict");
+ return fi.name.startsWith("a0 (conflicted copy");
});
QVERIFY(it != stateAChildren.cend());
QCOMPARE(it->contentChar, 'B');
@@ -312,7 +455,8 @@ private slots:
FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
fakeFolder.syncEngine().account()->setCapabilities({ { "dav", QVariantMap{ {"chunking", "1.0"} } } });
- const int size = 150 * 1000 * 1000; // 150 MB
+ const int size = 10 * 1000 * 1000; // 100 MB
+ setChunkSize(fakeFolder.syncEngine(), 1 * 1000 * 1000);
fakeFolder.localModifier().insert("A/a0", size);
@@ -350,7 +494,8 @@ private slots:
FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
fakeFolder.syncEngine().account()->setCapabilities({ { "dav", QVariantMap{ {"chunking", "1.0"} } } });
- const int size = 300 * 1000 * 1000; // 300 MB
+ const int size = 30 * 1000 * 1000; // 30 MB
+ setChunkSize(fakeFolder.syncEngine(), 1 * 1000 * 1000);
partialUpload(fakeFolder, "A/a0", size);
QCOMPARE(fakeFolder.uploadState().children.count(), 1);
auto chunkingId = fakeFolder.uploadState().children.first().name;
@@ -380,7 +525,8 @@ private slots:
QFETCH(bool, chunking);
FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() };
fakeFolder.syncEngine().account()->setCapabilities({ { "dav", QVariantMap{ { "chunking", "1.0" } } }, { "checksums", QVariantMap{ { "supportedTypes", QStringList() << "SHA1" } } } });
- const int size = chunking ? 150 * 1000 * 1000 : 300;
+ const int size = chunking ? 1 * 1000 * 1000 : 300;
+ setChunkSize(fakeFolder.syncEngine(), 300 * 1000);
// Make the MOVE never reply, but trigger a client-abort and apply the change remotely
QByteArray checksumHeader;
@@ -389,6 +535,10 @@ private slots:
int responseDelay = AbstractNetworkJob::httpTimeout * 1000 * 1000; // much bigger than http timeout (so a timeout will occur)
// This will perform the operation on the server, but the reply will not come to the client
fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *outgoingData) -> QNetworkReply * {
+ if (!chunking) {
+ Q_ASSERT(!request.url().path().contains("/uploads/")
+ && "Should not touch uploads endpoint when not chunking");
+ }
if (!chunking && op == QNetworkAccessManager::PutOperation) {
checksumHeader = request.rawHeader("OC-Checksum");
return new DelayedReply<FakePutReply>(responseDelay, fakeFolder.remoteModifier(), op, request, outgoingData->readAll(), &fakeFolder.syncEngine());
@@ -401,7 +551,6 @@ private slots:
return nullptr;
});
-
// Test 1: a NEW file
fakeFolder.localModifier().insert("A/a0", size);
QVERIFY(!fakeFolder.syncOnce()); // timeout!
diff --git a/test/testdownload.cpp b/test/testdownload.cpp
new file mode 100644
index 000000000..3301e0e6d
--- /dev/null
+++ b/test/testdownload.cpp
@@ -0,0 +1,125 @@
+/*
+ * This software is in the public domain, furnished "as is", without technical
+ * support, and with no warranty, express or implied, as to its usefulness for
+ * any purpose.
+ *
+ */
+
+#include <QtTest>
+#include "syncenginetestutils.h"
+#include <syncengine.h>
+
+using namespace OCC;
+
+static constexpr quint64 stopAfter = 3'123'668;
+
+/* A FakeGetReply that sends max 'fakeSize' bytes, but whose ContentLength has the corect size */
+class BrokenFakeGetReply : public FakeGetReply
+{
+ Q_OBJECT
+public:
+ using FakeGetReply::FakeGetReply;
+ int fakeSize = stopAfter;
+
+ qint64 bytesAvailable() const override
+ {
+ if (aborted)
+ return 0;
+ return std::min(size, fakeSize) + QIODevice::bytesAvailable();
+ }
+
+ qint64 readData(char *data, qint64 maxlen) override
+ {
+ qint64 len = std::min(qint64{ fakeSize }, maxlen);
+ std::fill_n(data, len, payload);
+ size -= len;
+ fakeSize -= len;
+ return len;
+ }
+};
+
+
+SyncFileItemPtr getItem(const QSignalSpy &spy, const QString &path)
+{
+ for (const QList<QVariant> &args : spy) {
+ auto item = args[0].value<SyncFileItemPtr>();
+ if (item->destination() == path)
+ return item;
+ }
+ return {};
+}
+
+
+class TestDownload : public QObject
+{
+ Q_OBJECT
+
+private slots:
+
+ void testResume()
+ {
+ FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() };
+ QSignalSpy completeSpy(&fakeFolder.syncEngine(), SIGNAL(itemCompleted(const SyncFileItemPtr &)));
+ auto size = 30 * 1000 * 1000;
+ fakeFolder.remoteModifier().insert("A/a0", size);
+
+ // First, download only the first 3 MB of the file
+ fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *) -> QNetworkReply * {
+ if (op == QNetworkAccessManager::GetOperation && request.url().path().endsWith("A/a0")) {
+ return new BrokenFakeGetReply(fakeFolder.remoteModifier(), op, request, this);
+ }
+ return nullptr;
+ });
+
+ QVERIFY(!fakeFolder.syncOnce()); // The sync must fail because not all the file was downloaded
+ QCOMPARE(getItem(completeSpy, "A/a0")->_status, SyncFileItem::SoftError);
+ QCOMPARE(getItem(completeSpy, "A/a0")->_errorString, QString("The file could not be downloaded completely."));
+ QVERIFY(fakeFolder.syncEngine().isAnotherSyncNeeded());
+
+ // Now, we need to restart, this time, it should resume.
+ QByteArray ranges;
+ fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *) -> QNetworkReply * {
+ if (op == QNetworkAccessManager::GetOperation && request.url().path().endsWith("A/a0")) {
+ ranges = request.rawHeader("Range");
+ }
+ return nullptr;
+ });
+ QVERIFY(fakeFolder.syncOnce()); // now this succeeds
+ QCOMPARE(ranges, QByteArray("bytes=" + QByteArray::number(stopAfter) + "-"));
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ }
+
+ void testErrorMessage () {
+ // This test's main goal is to test that the error string from the server is shown in the UI
+
+ FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
+ QSignalSpy completeSpy(&fakeFolder.syncEngine(), SIGNAL(itemCompleted(const SyncFileItemPtr &)));
+ auto size = 3'500'000;
+ fakeFolder.remoteModifier().insert("A/broken", size);
+
+ QByteArray serverMessage = "The file was not downloaded because the tests wants so!";
+
+ // First, download only the first 3 MB of the file
+ fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *) -> QNetworkReply * {
+ if (op == QNetworkAccessManager::GetOperation && request.url().path().endsWith("A/broken")) {
+ return new FakeErrorReply(op, request, this, 400,
+ "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+ "<d:error xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\">\n"
+ "<s:exception>Sabre\\DAV\\Exception\\Forbidden</s:exception>\n"
+ "<s:message>"+serverMessage+"</s:message>\n"
+ "</d:error>");
+ }
+ return nullptr;
+ });
+
+ bool timedOut = false;
+ QTimer::singleShot(10000, &fakeFolder.syncEngine(), [&]() { timedOut = true; fakeFolder.syncEngine().abort(); });
+ QVERIFY(!fakeFolder.syncOnce()); // Fail because A/broken
+ QVERIFY(!timedOut);
+ QCOMPARE(getItem(completeSpy, "A/broken")->_status, SyncFileItem::NormalError);
+ QVERIFY(getItem(completeSpy, "A/broken")->_errorString.contains(serverMessage));
+ }
+};
+
+QTEST_GUILESS_MAIN(TestDownload)
+#include "testdownload.moc"
diff --git a/test/testexcludedfiles.cpp b/test/testexcludedfiles.cpp
index 5043768ec..11d0a3282 100644
--- a/test/testexcludedfiles.cpp
+++ b/test/testexcludedfiles.cpp
@@ -37,6 +37,7 @@ private slots:
QVERIFY(!excluded.isExcluded("/a/.b", "/a", keepHidden));
QVERIFY(excluded.isExcluded("/a/.Trashes", "/a", keepHidden));
QVERIFY(excluded.isExcluded("/a/foo_conflict-bar", "/a", keepHidden));
+ QVERIFY(excluded.isExcluded("/a/foo (conflicted copy bar)", "/a", keepHidden));
QVERIFY(excluded.isExcluded("/a/.b", "/a", excludeHidden));
}
};
diff --git a/test/testfilesystem.cpp b/test/testfilesystem.cpp
deleted file mode 100644
index 0b8b61246..000000000
--- a/test/testfilesystem.cpp
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- This software is in the public domain, furnished "as is", without technical
- support, and with no warranty, express or implied, as to its usefulness for
- any purpose.
-*/
-
-#include <QtTest>
-#include <QDebug>
-
-#include "filesystem.h"
-#include "common/utility.h"
-
-using namespace OCC::Utility;
-using namespace OCC::FileSystem;
-
-class TestFileSystem : public QObject
-{
- Q_OBJECT
-
- QTemporaryDir _root;
-
-
- QByteArray shellSum( const QByteArray& cmd, const QString& file )
- {
- QProcess md5;
- QStringList args;
- args.append(file);
- md5.start(cmd, args);
- QByteArray sumShell;
- qDebug() << "File: "<< file;
-
- if( md5.waitForFinished() ) {
-
- sumShell = md5.readAll();
- sumShell = sumShell.left( sumShell.indexOf(' '));
- }
- return sumShell;
- }
-
-private slots:
- void testMd5Calc()
- {
- QString file( _root.path() + "/file_a.bin");
- QVERIFY(writeRandomFile(file));
- QFileInfo fi(file);
- QVERIFY(fi.exists());
- QByteArray sum = calcMd5(file);
-
- QByteArray sSum = shellSum("md5sum", file);
- if (sSum.isEmpty())
- QSKIP("Couldn't execute md5sum to calculate checksum, executable missing?", SkipSingle);
-
- QVERIFY(!sum.isEmpty());
- QCOMPARE(sSum, sum);
- }
-
- void testSha1Calc()
- {
- QString file( _root.path() + "/file_b.bin");
- writeRandomFile(file);
- QFileInfo fi(file);
- QVERIFY(fi.exists());
- QByteArray sum = calcSha1(file);
-
- QByteArray sSum = shellSum("sha1sum", file);
- if (sSum.isEmpty())
- QSKIP("Couldn't execute sha1sum to calculate checksum, executable missing?", SkipSingle);
-
- QVERIFY(!sum.isEmpty());
- QCOMPARE(sSum, sum);
- }
-
-};
-
-QTEST_APPLESS_MAIN(TestFileSystem)
-#include "testfilesystem.moc"
diff --git a/test/testfolderman.cpp b/test/testfolderman.cpp
index 15f044ba1..9aec8faf0 100644
--- a/test/testfolderman.cpp
+++ b/test/testfolderman.cpp
@@ -146,6 +146,12 @@ private slots:
// Invalid paths
QVERIFY(!folderman->checkPathValidityForNewFolder("").isNull());
+
+
+ // REMOVE ownCloud2 from the filesystem, but keep a folder sync'ed to it.
+ QDir(dirPath + "/ownCloud2/").removeRecursively();
+ QVERIFY(!folderman->checkPathValidityForNewFolder(dirPath + "/ownCloud2/blublu").isNull());
+ QVERIFY(!folderman->checkPathValidityForNewFolder(dirPath + "/ownCloud2/sub/subsub/sub").isNull());
}
void testFindGoodPathForNewSyncFolder()
@@ -169,6 +175,7 @@ private slots:
HttpCredentialsTest *cred = new HttpCredentialsTest("testuser", "secret");
account->setCredentials(cred);
account->setUrl( url );
+ url.setUserName(cred->user());
AccountStatePtr newAccountState(new AccountState(account));
FolderMan *folderman = FolderMan::instance();
@@ -190,6 +197,14 @@ private slots:
QString(dirPath + "/ownCloud2/bar"));
QCOMPARE(folderman->findGoodPathForNewSyncFolder(dirPath + "/sub", url),
QString(dirPath + "/sub2"));
+
+ // REMOVE ownCloud2 from the filesystem, but keep a folder sync'ed to it.
+ // We should still not suggest this folder as a new folder.
+ QDir(dirPath + "/ownCloud2/").removeRecursively();
+ QCOMPARE(folderman->findGoodPathForNewSyncFolder(dirPath + "/ownCloud", url),
+ QString(dirPath + "/ownCloud3"));
+ QCOMPARE(folderman->findGoodPathForNewSyncFolder(dirPath + "/ownCloud2", url),
+ QString(dirPath + "/ownCloud22"));
}
};
diff --git a/test/testfolderwatcher.cpp b/test/testfolderwatcher.cpp
index 0f8551db6..d90856828 100644
--- a/test/testfolderwatcher.cpp
+++ b/test/testfolderwatcher.cpp
@@ -113,7 +113,8 @@ public:
Utility::writeRandomFile( _rootPath+"/a2/renamefile");
Utility::writeRandomFile( _rootPath+"/a1/movefile");
- _watcher.reset(new FolderWatcher(_rootPath));
+ _watcher.reset(new FolderWatcher);
+ _watcher->init(_rootPath);
_pathChangedSpy.reset(new QSignalSpy(_watcher.data(), SIGNAL(pathChanged(QString))));
}
diff --git a/test/testlocaldiscovery.cpp b/test/testlocaldiscovery.cpp
new file mode 100644
index 000000000..03754af51
--- /dev/null
+++ b/test/testlocaldiscovery.cpp
@@ -0,0 +1,155 @@
+/*
+ * This software is in the public domain, furnished "as is", without technical
+ * support, and with no warranty, express or implied, as to its usefulness for
+ * any purpose.
+ *
+ */
+
+#include <QtTest>
+#include "syncenginetestutils.h"
+#include <syncengine.h>
+#include <localdiscoverytracker.h>
+
+using namespace OCC;
+
+class TestLocalDiscovery : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ // Check correct behavior when local discovery is partially drawn from the db
+ void testLocalDiscoveryStyle()
+ {
+ FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() };
+
+ LocalDiscoveryTracker tracker;
+ connect(&fakeFolder.syncEngine(), &SyncEngine::itemCompleted, &tracker, &LocalDiscoveryTracker::slotItemCompleted);
+ connect(&fakeFolder.syncEngine(), &SyncEngine::finished, &tracker, &LocalDiscoveryTracker::slotSyncFinished);
+
+ // More subdirectories are useful for testing
+ fakeFolder.localModifier().mkdir("A/X");
+ fakeFolder.localModifier().mkdir("A/Y");
+ fakeFolder.localModifier().insert("A/X/x1");
+ fakeFolder.localModifier().insert("A/Y/y1");
+ tracker.addTouchedPath("A/X");
+
+ tracker.startSyncFullDiscovery();
+ QVERIFY(fakeFolder.syncOnce());
+
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ QVERIFY(tracker.localDiscoveryPaths().empty());
+
+ // Test begins
+ fakeFolder.localModifier().insert("A/a3");
+ fakeFolder.localModifier().insert("A/X/x2");
+ fakeFolder.localModifier().insert("A/Y/y2");
+ fakeFolder.localModifier().insert("B/b3");
+ fakeFolder.remoteModifier().insert("C/c3");
+ tracker.addTouchedPath("A/X");
+
+ fakeFolder.syncEngine().setLocalDiscoveryOptions(LocalDiscoveryStyle::DatabaseAndFilesystem, tracker.localDiscoveryPaths());
+ tracker.startSyncPartialDiscovery();
+ QVERIFY(fakeFolder.syncOnce());
+
+ QVERIFY(fakeFolder.currentRemoteState().find("A/a3"));
+ QVERIFY(fakeFolder.currentRemoteState().find("A/X/x2"));
+ QVERIFY(!fakeFolder.currentRemoteState().find("A/Y/y2"));
+ QVERIFY(!fakeFolder.currentRemoteState().find("B/b3"));
+ QVERIFY(fakeFolder.currentLocalState().find("C/c3"));
+ QCOMPARE(fakeFolder.syncEngine().lastLocalDiscoveryStyle(), LocalDiscoveryStyle::DatabaseAndFilesystem);
+ QVERIFY(tracker.localDiscoveryPaths().empty());
+
+ QVERIFY(fakeFolder.syncOnce());
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ QCOMPARE(fakeFolder.syncEngine().lastLocalDiscoveryStyle(), LocalDiscoveryStyle::FilesystemOnly);
+ QVERIFY(tracker.localDiscoveryPaths().empty());
+ }
+
+ void testLocalDiscoveryDecision()
+ {
+ FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() };
+ auto &engine = fakeFolder.syncEngine();
+
+ QVERIFY(engine.shouldDiscoverLocally(""));
+ QVERIFY(engine.shouldDiscoverLocally("A"));
+ QVERIFY(engine.shouldDiscoverLocally("A/X"));
+
+ fakeFolder.syncEngine().setLocalDiscoveryOptions(
+ LocalDiscoveryStyle::DatabaseAndFilesystem,
+ { "A/X", "foo bar space/touch", "foo/", "zzz" });
+
+ QVERIFY(engine.shouldDiscoverLocally(""));
+ QVERIFY(engine.shouldDiscoverLocally("A"));
+ QVERIFY(engine.shouldDiscoverLocally("A/X"));
+ QVERIFY(!engine.shouldDiscoverLocally("B"));
+ QVERIFY(!engine.shouldDiscoverLocally("A B"));
+ QVERIFY(!engine.shouldDiscoverLocally("B/X"));
+ QVERIFY(!engine.shouldDiscoverLocally("A/X/Y"));
+ QVERIFY(engine.shouldDiscoverLocally("foo bar space"));
+ QVERIFY(engine.shouldDiscoverLocally("foo"));
+ QVERIFY(!engine.shouldDiscoverLocally("foo bar"));
+ QVERIFY(!engine.shouldDiscoverLocally("foo bar/touch"));
+
+ fakeFolder.syncEngine().setLocalDiscoveryOptions(
+ LocalDiscoveryStyle::DatabaseAndFilesystem,
+ {});
+
+ QVERIFY(!engine.shouldDiscoverLocally(""));
+ }
+
+ // Check whether item success and item failure adjusts the
+ // tracker correctly.
+ void testTrackerItemCompletion()
+ {
+ FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() };
+
+ LocalDiscoveryTracker tracker;
+ connect(&fakeFolder.syncEngine(), &SyncEngine::itemCompleted, &tracker, &LocalDiscoveryTracker::slotItemCompleted);
+ connect(&fakeFolder.syncEngine(), &SyncEngine::finished, &tracker, &LocalDiscoveryTracker::slotSyncFinished);
+ auto trackerContains = [&](const char *path) {
+ return tracker.localDiscoveryPaths().find(path) != tracker.localDiscoveryPaths().end();
+ };
+
+ tracker.addTouchedPath("A/spurious");
+
+ fakeFolder.localModifier().insert("A/a3");
+ tracker.addTouchedPath("A/a3");
+
+ fakeFolder.localModifier().insert("A/a4");
+ fakeFolder.serverErrorPaths().append("A/a4");
+ // We're not adding a4 as touched, it's in the same folder as a3 and will be seen.
+ // And due to the error it should be added to the explicit list while a3 gets removed.
+
+ fakeFolder.syncEngine().setLocalDiscoveryOptions(LocalDiscoveryStyle::DatabaseAndFilesystem, tracker.localDiscoveryPaths());
+ tracker.startSyncPartialDiscovery();
+ QVERIFY(!fakeFolder.syncOnce());
+
+ QVERIFY(fakeFolder.currentRemoteState().find("A/a3"));
+ QVERIFY(!fakeFolder.currentRemoteState().find("A/a4"));
+ QVERIFY(!trackerContains("A/a3"));
+ QVERIFY(trackerContains("A/a4"));
+ QVERIFY(trackerContains("A/spurious")); // not removed since overall sync not successful
+
+ fakeFolder.syncEngine().setLocalDiscoveryOptions(LocalDiscoveryStyle::FilesystemOnly);
+ tracker.startSyncFullDiscovery();
+ QVERIFY(!fakeFolder.syncOnce());
+
+ QVERIFY(!fakeFolder.currentRemoteState().find("A/a4"));
+ QVERIFY(trackerContains("A/a4")); // had an error, still here
+ QVERIFY(!trackerContains("A/spurious")); // removed due to full discovery
+
+ fakeFolder.serverErrorPaths().clear();
+ fakeFolder.syncJournal().wipeErrorBlacklist();
+ tracker.addTouchedPath("A/newspurious"); // will be removed due to successful sync
+
+ fakeFolder.syncEngine().setLocalDiscoveryOptions(LocalDiscoveryStyle::DatabaseAndFilesystem, tracker.localDiscoveryPaths());
+ tracker.startSyncPartialDiscovery();
+ QVERIFY(fakeFolder.syncOnce());
+
+ QVERIFY(fakeFolder.currentRemoteState().find("A/a4"));
+ QVERIFY(tracker.localDiscoveryPaths().empty());
+ }
+};
+
+QTEST_GUILESS_MAIN(TestLocalDiscovery)
+#include "testlocaldiscovery.moc"
diff --git a/test/testoauth.cpp b/test/testoauth.cpp
index 49eb3ce6c..72126c55e 100644
--- a/test/testoauth.cpp
+++ b/test/testoauth.cpp
@@ -22,7 +22,7 @@ signals:
void hooked(const QUrl &);
public:
DesktopServiceHook() { QDesktopServices::setUrlHandler("oauthtest", this, "hooked"); }
-} desktopServiceHook;
+};
static const QUrl sOAuthTestServer("oauthtest://someserver/owncloud");
@@ -90,6 +90,7 @@ public:
class OAuthTestCase : public QObject
{
Q_OBJECT
+ DesktopServiceHook desktopServiceHook;
public:
enum State { StartState, BrowserOpened, TokenAsked, CustomState } state = StartState;
Q_ENUM(State);
diff --git a/test/testownsql.cpp b/test/testownsql.cpp
index 77541794a..86ec77d28 100644
--- a/test/testownsql.cpp
+++ b/test/testownsql.cpp
@@ -126,6 +126,21 @@ private slots:
}
}
+ void testDestructor()
+ {
+ // This test make sure that the destructor of SqlQuery works even if the SqlDatabase
+ // is destroyed before
+ QScopedPointer<SqlDatabase> db(new SqlDatabase());
+ SqlQuery q1(_db);
+ SqlQuery q2(_db);
+ q2.prepare("SELECT * FROM addresses");
+ SqlQuery q3("SELECT * FROM addresses", _db);
+ SqlQuery q4;
+ SqlQuery q5;
+ q5.initOrReset("SELECT * FROM addresses", _db);
+ db.reset();
+ }
+
private:
SqlDatabase _db;
};
diff --git a/test/testpermissions.cpp b/test/testpermissions.cpp
new file mode 100644
index 000000000..57aac6eaf
--- /dev/null
+++ b/test/testpermissions.cpp
@@ -0,0 +1,292 @@
+/*
+ * This software is in the public domain, furnished "as is", without technical
+ * support, and with no warranty, express or implied, as to its usefulness for
+ * any purpose.
+ *
+ */
+
+#include <QtTest>
+#include "syncenginetestutils.h"
+#include <syncengine.h>
+#include "common/ownsql.h"
+
+using namespace OCC;
+
+static void applyPermissionsFromName(FileInfo &info) {
+ static QRegularExpression rx("_PERM_([^_]*)_[^/]*$");
+ auto m = rx.match(info.name);
+ if (m.hasMatch()) {
+ info.permissions = RemotePermissions::fromServerString(m.captured(1));
+ }
+
+ for (FileInfo &sub : info.children)
+ applyPermissionsFromName(sub);
+}
+
+// Check if the expected rows in the DB are non-empty. Note that in some cases they might be, then we cannot use this function
+// https://github.com/owncloud/client/issues/2038
+static void assertCsyncJournalOk(SyncJournalDb &journal)
+{
+ SqlDatabase db;
+ QVERIFY(db.openReadOnly(journal.databaseFilePath()));
+ SqlQuery q("SELECT count(*) from metadata where length(fileId) == 0", db);
+ QVERIFY(q.exec());
+ QVERIFY(q.next());
+ QCOMPARE(q.intValue(0), 0);
+#if defined(Q_OS_WIN) // Make sure the file does not appear in the FileInfo
+ FileSystem::setFileHidden(journal.databaseFilePath() + "-shm", true);
+#endif
+}
+
+
+class TestPermissions : public QObject
+{
+ Q_OBJECT
+
+private slots:
+
+ void t7pl()
+ {
+ FakeFolder fakeFolder{ FileInfo() };
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+
+ const int cannotBeModifiedSize = 133;
+ const int canBeModifiedSize = 144;
+
+ //create some files
+ auto insertIn = [&](const QString &dir) {
+ fakeFolder.remoteModifier().insert(dir + "normalFile_PERM_WVND_.data", 100 );
+ fakeFolder.remoteModifier().insert(dir + "cannotBeRemoved_PERM_WVN_.data", 101 );
+ fakeFolder.remoteModifier().insert(dir + "canBeRemoved_PERM_D_.data", 102 );
+ fakeFolder.remoteModifier().insert(dir + "cannotBeModified_PERM_DVN_.data", cannotBeModifiedSize , 'A');
+ fakeFolder.remoteModifier().insert(dir + "canBeModified_PERM_W_.data", canBeModifiedSize );
+ };
+
+ //put them in some directories
+ fakeFolder.remoteModifier().mkdir("normalDirectory_PERM_CKDNV_");
+ insertIn("normalDirectory_PERM_CKDNV_/");
+ fakeFolder.remoteModifier().mkdir("readonlyDirectory_PERM_M_" );
+ insertIn("readonlyDirectory_PERM_M_/" );
+ fakeFolder.remoteModifier().mkdir("readonlyDirectory_PERM_M_/subdir_PERM_CK_");
+ fakeFolder.remoteModifier().mkdir("readonlyDirectory_PERM_M_/subdir_PERM_CK_/subsubdir_PERM_CKDNV_");
+ fakeFolder.remoteModifier().insert("readonlyDirectory_PERM_M_/subdir_PERM_CK_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data", 100);
+ applyPermissionsFromName(fakeFolder.remoteModifier());
+
+ QVERIFY(fakeFolder.syncOnce());
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ assertCsyncJournalOk(fakeFolder.syncJournal());
+ qInfo("Do some changes and see how they propagate");
+
+ //1. remove the file than cannot be removed
+ // (they should be recovered)
+ fakeFolder.localModifier().remove("normalDirectory_PERM_CKDNV_/cannotBeRemoved_PERM_WVN_.data");
+ fakeFolder.localModifier().remove("readonlyDirectory_PERM_M_/cannotBeRemoved_PERM_WVN_.data");
+
+ //2. remove the file that can be removed
+ // (they should properly be gone)
+ auto removeReadOnly = [&] (const QString &file) {
+ QVERIFY(!QFileInfo(fakeFolder.localPath() + file).permission(QFile::WriteOwner));
+ QFile(fakeFolder.localPath() + file).setPermissions(QFile::WriteOwner | QFile::ReadOwner);
+ fakeFolder.localModifier().remove(file);
+ };
+ removeReadOnly("normalDirectory_PERM_CKDNV_/canBeRemoved_PERM_D_.data");
+ removeReadOnly("readonlyDirectory_PERM_M_/canBeRemoved_PERM_D_.data");
+
+ //3. Edit the files that cannot be modified
+ // (they should be recovered, and a conflict shall be created)
+ auto editReadOnly = [&] (const QString &file) {
+ QVERIFY(!QFileInfo(fakeFolder.localPath() + file).permission(QFile::WriteOwner));
+ QFile(fakeFolder.localPath() + file).setPermissions(QFile::WriteOwner | QFile::ReadOwner);
+ fakeFolder.localModifier().appendByte(file);
+ };
+ editReadOnly("normalDirectory_PERM_CKDNV_/cannotBeModified_PERM_DVN_.data");
+ editReadOnly("readonlyDirectory_PERM_M_/cannotBeModified_PERM_DVN_.data");
+
+ //4. Edit other files
+ // (they should be uploaded)
+ fakeFolder.localModifier().appendByte("normalDirectory_PERM_CKDNV_/canBeModified_PERM_W_.data");
+ fakeFolder.localModifier().appendByte("readonlyDirectory_PERM_M_/canBeModified_PERM_W_.data");
+
+ //5. Create a new file in a read write folder
+ // (should be uploaded)
+ fakeFolder.localModifier().insert("normalDirectory_PERM_CKDNV_/newFile_PERM_WDNV_.data", 106 );
+ applyPermissionsFromName(fakeFolder.remoteModifier());
+
+ //do the sync
+ QVERIFY(fakeFolder.syncOnce());
+ assertCsyncJournalOk(fakeFolder.syncJournal());
+ auto currentLocalState = fakeFolder.currentLocalState();
+
+ //1.
+ // File should be recovered
+ QVERIFY(currentLocalState.find("normalDirectory_PERM_CKDNV_/cannotBeRemoved_PERM_WVN_.data"));
+ QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/cannotBeRemoved_PERM_WVN_.data"));
+
+ //2.
+ // File should be deleted
+ QVERIFY(!currentLocalState.find("normalDirectory_PERM_CKDNV_/canBeRemoved_PERM_D_.data"));
+ QVERIFY(!currentLocalState.find("readonlyDirectory_PERM_M_/canBeRemoved_PERM_D_.data"));
+
+ //3.
+ // File should be recovered
+ QCOMPARE(currentLocalState.find("normalDirectory_PERM_CKDNV_/cannotBeModified_PERM_DVN_.data")->size, cannotBeModifiedSize);
+ QCOMPARE(currentLocalState.find("readonlyDirectory_PERM_M_/cannotBeModified_PERM_DVN_.data")->size, cannotBeModifiedSize);
+ // and conflict created
+ auto c1 = findConflict(currentLocalState, "normalDirectory_PERM_CKDNV_/cannotBeModified_PERM_DVN_.data");
+ QVERIFY(c1);
+ QCOMPARE(c1->size, cannotBeModifiedSize + 1);
+ auto c2 = findConflict(currentLocalState, "readonlyDirectory_PERM_M_/cannotBeModified_PERM_DVN_.data");
+ QVERIFY(c2);
+ QCOMPARE(c2->size, cannotBeModifiedSize + 1);
+ // remove the conflicts for the next state comparison
+ fakeFolder.localModifier().remove(c1->path());
+ fakeFolder.localModifier().remove(c2->path());
+
+ //4. File should be updated, that's tested by assertLocalAndRemoteDir
+ QCOMPARE(currentLocalState.find("normalDirectory_PERM_CKDNV_/canBeModified_PERM_W_.data")->size, canBeModifiedSize + 1);
+ QCOMPARE(currentLocalState.find("readonlyDirectory_PERM_M_/canBeModified_PERM_W_.data")->size, canBeModifiedSize + 1);
+
+ //5.
+ // the file should be in the server and local
+ QVERIFY(currentLocalState.find("normalDirectory_PERM_CKDNV_/newFile_PERM_WDNV_.data"));
+
+ // Both side should still be the same
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+
+ // Next test
+
+ //6. Create a new file in a read only folder
+ // (they should not be uploaded)
+ fakeFolder.localModifier().insert("readonlyDirectory_PERM_M_/newFile_PERM_WDNV_.data", 105 );
+
+ applyPermissionsFromName(fakeFolder.remoteModifier());
+ // error: can't upload to readonly
+ QVERIFY(!fakeFolder.syncOnce());
+
+ assertCsyncJournalOk(fakeFolder.syncJournal());
+ currentLocalState = fakeFolder.currentLocalState();
+
+ //6.
+ // The file should not exist on the remote, but still be there
+ QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/newFile_PERM_WDNV_.data"));
+ QVERIFY(!fakeFolder.currentRemoteState().find("readonlyDirectory_PERM_M_/newFile_PERM_WDNV_.data"));
+ // remove it so next test succeed.
+ fakeFolder.localModifier().remove("readonlyDirectory_PERM_M_/newFile_PERM_WDNV_.data");
+ // Both side should still be the same
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+
+
+ //######################################################################
+ qInfo( "remove the read only directory" );
+ // -> It must be recovered
+ fakeFolder.localModifier().remove("readonlyDirectory_PERM_M_");
+ applyPermissionsFromName(fakeFolder.remoteModifier());
+ QVERIFY(fakeFolder.syncOnce());
+ assertCsyncJournalOk(fakeFolder.syncJournal());
+ currentLocalState = fakeFolder.currentLocalState();
+ QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/cannotBeRemoved_PERM_WVN_.data"));
+ QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/subdir_PERM_CK_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data"));
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+
+
+ //######################################################################
+ qInfo( "move a directory in a outside read only folder" );
+
+ //Missing directory should be restored
+ //new directory should be uploaded
+ fakeFolder.localModifier().rename("readonlyDirectory_PERM_M_/subdir_PERM_CK_", "normalDirectory_PERM_CKDNV_/subdir_PERM_CKDNV_");
+ applyPermissionsFromName(fakeFolder.remoteModifier());
+ fakeFolder.syncOnce();
+ if (fakeFolder.syncEngine().isAnotherSyncNeeded() == ImmediateFollowUp) {
+ QVERIFY(fakeFolder.syncOnce());
+ }
+ assertCsyncJournalOk(fakeFolder.syncJournal());
+ currentLocalState = fakeFolder.currentLocalState();
+
+ // old name restored
+ QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/subdir_PERM_CK_/subsubdir_PERM_CKDNV_"));
+ QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/subdir_PERM_CK_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data"));
+
+ // new still exist (and is uploaded)
+ QVERIFY(currentLocalState.find("normalDirectory_PERM_CKDNV_/subdir_PERM_CKDNV_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data"));
+
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+
+ //######################################################################
+ qInfo( "rename a directory in a read only folder and move a directory to a read-only" );
+
+ // do a sync to update the database
+ applyPermissionsFromName(fakeFolder.remoteModifier());
+ QVERIFY(fakeFolder.syncOnce());
+
+ //1. rename a directory in a read only folder
+ //Missing directory should be restored
+ //new directory should stay but not be uploaded
+ fakeFolder.localModifier().rename("readonlyDirectory_PERM_M_/subdir_PERM_CK_", "readonlyDirectory_PERM_M_/newname_PERM_CK_" );
+
+ //2. move a directory from read to read only (move the directory from previous step)
+ fakeFolder.localModifier().rename("normalDirectory_PERM_CKDNV_/subdir_PERM_CKDNV_", "readonlyDirectory_PERM_M_/moved_PERM_CK_" );
+
+ // error: can't upload to readonly!
+ QVERIFY(!fakeFolder.syncOnce());
+ if (fakeFolder.syncEngine().isAnotherSyncNeeded() == ImmediateFollowUp) {
+ QVERIFY(!fakeFolder.syncOnce());
+ }
+ assertCsyncJournalOk(fakeFolder.syncJournal());
+ currentLocalState = fakeFolder.currentLocalState();
+
+ //1.
+ // old name restored
+ QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/subdir_PERM_CK_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data" ));
+ // new still exist
+ QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/newname_PERM_CK_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data" ));
+ // but is not on server: so remove it localy for the future comarison
+ fakeFolder.localModifier().remove("readonlyDirectory_PERM_M_/newname_PERM_CK_");
+
+ //2.
+ // old removed
+ QVERIFY(!currentLocalState.find("normalDirectory_PERM_CKDNV_/subdir_PERM_CKDNV_"));
+ // new still there
+ QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/moved_PERM_CK_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data" ));
+ //but not on server
+ fakeFolder.localModifier().remove("readonlyDirectory_PERM_M_/moved_PERM_CK_");
+
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+
+
+ //######################################################################
+ qInfo( "multiple restores of a file create different conflict files" );
+
+ editReadOnly("readonlyDirectory_PERM_M_/cannotBeModified_PERM_DVN_.data");
+ fakeFolder.localModifier().setContents("readonlyDirectory_PERM_M_/cannotBeModified_PERM_DVN_.data", 's');
+ //do the sync
+ applyPermissionsFromName(fakeFolder.remoteModifier());
+ QVERIFY(fakeFolder.syncOnce());
+ assertCsyncJournalOk(fakeFolder.syncJournal());
+
+ QThread::sleep(1); // make sure changes have different mtime
+ editReadOnly("readonlyDirectory_PERM_M_/cannotBeModified_PERM_DVN_.data");
+ fakeFolder.localModifier().setContents("readonlyDirectory_PERM_M_/cannotBeModified_PERM_DVN_.data", 'd');
+
+ //do the sync
+ applyPermissionsFromName(fakeFolder.remoteModifier());
+ QVERIFY(fakeFolder.syncOnce());
+ assertCsyncJournalOk(fakeFolder.syncJournal());
+
+ // there should be two conflict files
+ currentLocalState = fakeFolder.currentLocalState();
+ int count = 0;
+ while (auto i = findConflict(currentLocalState, "readonlyDirectory_PERM_M_/cannotBeModified_PERM_DVN_.data")) {
+ QVERIFY((i->contentChar == 's') || (i->contentChar == 'd'));
+ fakeFolder.localModifier().remove(i->path());
+ currentLocalState = fakeFolder.currentLocalState();
+ count++;
+ }
+ QCOMPARE(count, 2);
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ }
+
+};
+
+QTEST_GUILESS_MAIN(TestPermissions)
+#include "testpermissions.moc"
diff --git a/test/testremotediscovery.cpp b/test/testremotediscovery.cpp
new file mode 100644
index 000000000..4945bbf4c
--- /dev/null
+++ b/test/testremotediscovery.cpp
@@ -0,0 +1,128 @@
+/*
+ * This software is in the public domain, furnished "as is", without technical
+ * support, and with no warranty, express or implied, as to its usefulness for
+ * any purpose.
+ *
+ */
+
+#include <QtTest>
+#include "syncenginetestutils.h"
+#include <syncengine.h>
+#include <localdiscoverytracker.h>
+
+using namespace OCC;
+
+struct FakeBrokenXmlPropfindReply : FakePropfindReply {
+ FakeBrokenXmlPropfindReply(FileInfo &remoteRootFileInfo, QNetworkAccessManager::Operation op,
+ const QNetworkRequest &request, QObject *parent)
+ : FakePropfindReply(remoteRootFileInfo, op, request, parent) {
+ QVERIFY(payload.size() > 50);
+ // turncate the XML
+ payload.chop(20);
+ }
+};
+
+struct MissingPermissionsPropfindReply : FakePropfindReply {
+ MissingPermissionsPropfindReply(FileInfo &remoteRootFileInfo, QNetworkAccessManager::Operation op,
+ const QNetworkRequest &request, QObject *parent)
+ : FakePropfindReply(remoteRootFileInfo, op, request, parent) {
+ // If the propfind contains a single file without permissions, this is a server error
+ const char toRemove[] = "<oc:permissions>RDNVCKW</oc:permissions>";
+ auto pos = payload.indexOf(toRemove, payload.size()/2);
+ QVERIFY(pos > 0);
+ payload.remove(pos, sizeof(toRemove) - 1);
+ }
+};
+
+
+enum ErrorKind : int {
+ // Lower code are corresponding to HTML error code
+ InvalidXML = 1000,
+ MissingPermissions,
+ Timeout,
+};
+
+Q_DECLARE_METATYPE(ErrorCategory)
+
+class TestRemoteDiscovery : public QObject
+{
+ Q_OBJECT
+
+private slots:
+
+ void testRemoteDiscoveryError_data()
+ {
+ qRegisterMetaType<ErrorCategory>();
+ QTest::addColumn<int>("errorKind");
+ QTest::addColumn<QString>("expectedErrorString");
+
+ QTest::newRow("404") << 404 << "B"; // The filename should be in the error message
+ QTest::newRow("500") << 500 << "Internal Server Fake Error"; // the message from FakeErrorReply
+ QTest::newRow("503") << 503 << "";
+ QTest::newRow("200") << 200 << ""; // 200 should be an error since propfind should return 207
+ QTest::newRow("InvalidXML") << +InvalidXML << "";
+ QTest::newRow("MissingPermissions") << +MissingPermissions << "missing data";
+ QTest::newRow("Timeout") << +Timeout << "";
+ }
+
+
+ // Check what happens when there is an error.
+ void testRemoteDiscoveryError()
+ {
+ QFETCH(int, errorKind);
+ QFETCH(QString, expectedErrorString);
+ bool syncSucceeds = errorKind == 503; // 503 just ignore the temporarily unavailable directory
+
+ FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() };
+
+ // Do Some change as well
+ fakeFolder.localModifier().insert("A/z1");
+ fakeFolder.localModifier().insert("B/z1");
+ fakeFolder.localModifier().insert("C/z1");
+ fakeFolder.remoteModifier().insert("A/z2");
+ fakeFolder.remoteModifier().insert("B/z2");
+ fakeFolder.remoteModifier().insert("C/z2");
+
+ auto oldLocalState = fakeFolder.currentLocalState();
+ auto oldRemoteState = fakeFolder.currentRemoteState();
+
+ fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *)
+ -> QNetworkReply *{
+ if (req.attribute(QNetworkRequest::CustomVerbAttribute) == "PROPFIND" && req.url().path().endsWith("/B")) {
+ if (errorKind == InvalidXML) {
+ return new FakeBrokenXmlPropfindReply(fakeFolder.remoteModifier(), op, req, this);
+ } else if (errorKind == MissingPermissions) {
+ return new MissingPermissionsPropfindReply(fakeFolder.remoteModifier(), op, req, this);
+ } else if (errorKind == Timeout) {
+ return new FakeHangingReply(op, req, this);
+ } else if (errorKind < 1000) {
+ return new FakeErrorReply(op, req, this, errorKind);
+ }
+ }
+ return nullptr;
+ });
+
+ // So the test that test timeout finishes fast
+ QScopedValueRollback<int> setHttpTimeout(AbstractNetworkJob::httpTimeout, errorKind == Timeout ? 1 : 10000);
+
+ QSignalSpy errorSpy(&fakeFolder.syncEngine(), &SyncEngine::syncError);
+ QCOMPARE(fakeFolder.syncOnce(), false);
+ qDebug() << "errorSpy=" << errorSpy;
+
+ // The folder B should not have been sync'ed (and in particular not removed)
+ QCOMPARE(oldLocalState.children["B"], fakeFolder.currentLocalState().children["B"]);
+ QCOMPARE(oldRemoteState.children["B"], fakeFolder.currentRemoteState().children["B"]);
+ if (!syncSucceeds) {
+ // Check we got the right error
+ QCOMPARE(errorSpy.count(), 1);
+ QVERIFY(errorSpy[0][0].toString().contains(expectedErrorString));
+ } else {
+ // The other folder should have been sync'ed as the sync just ignored the faulty dir
+ QCOMPARE(fakeFolder.currentRemoteState().children["A"], fakeFolder.currentLocalState().children["A"]);
+ QCOMPARE(fakeFolder.currentRemoteState().children["C"], fakeFolder.currentLocalState().children["C"]);
+ }
+ }
+};
+
+QTEST_GUILESS_MAIN(TestRemoteDiscovery)
+#include "testremotediscovery.moc"
diff --git a/test/testsyncconflict.cpp b/test/testsyncconflict.cpp
index daf7eab0d..9052592ef 100644
--- a/test/testsyncconflict.cpp
+++ b/test/testsyncconflict.cpp
@@ -42,7 +42,7 @@ QStringList findConflicts(const FileInfo &dir)
{
QStringList conflicts;
for (const auto &item : dir.children) {
- if (item.name.contains("conflict")) {
+ if (item.name.contains("(conflicted copy")) {
conflicts.append(item.path());
}
}
@@ -56,7 +56,7 @@ bool expectAndWipeConflict(FileModifier &local, FileInfo state, const QString pa
if (!base)
return false;
for (const auto &item : base->children) {
- if (item.name.startsWith(pathComponents.fileName()) && item.name.contains("_conflict")) {
+ if (item.name.startsWith(pathComponents.fileName()) && item.name.contains("(conflicted copy")) {
local.remove(item.path());
return true;
}
@@ -80,6 +80,12 @@ private slots:
fakeFolder.remoteModifier().appendByte("A/a2");
fakeFolder.remoteModifier().appendByte("A/a2");
QVERIFY(fakeFolder.syncOnce());
+
+ // Verify that the conflict names don't have the user name
+ for (const auto &name : findConflicts(fakeFolder.currentLocalState().children["A"])) {
+ QVERIFY(!name.contains(fakeFolder.syncEngine().account()->davDisplayName()));
+ }
+
QVERIFY(expectAndWipeConflict(fakeFolder.localModifier(), fakeFolder.currentLocalState(), "A/a1"));
QVERIFY(expectAndWipeConflict(fakeFolder.localModifier(), fakeFolder.currentLocalState(), "A/a2"));
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
@@ -94,11 +100,15 @@ private slots:
QMap<QByteArray, QString> conflictMap;
fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *) -> QNetworkReply * {
if (op == QNetworkAccessManager::PutOperation) {
- auto baseFileId = request.rawHeader("OC-ConflictBaseFileId");
- if (!baseFileId.isEmpty()) {
+ if (request.rawHeader("OC-Conflict") == "1") {
+ auto baseFileId = request.rawHeader("OC-ConflictBaseFileId");
auto components = request.url().toString().split('/');
QString conflictFile = components.mid(components.size() - 2).join('/');
conflictMap[baseFileId] = conflictFile;
+ [&] {
+ QVERIFY(!baseFileId.isEmpty());
+ QCOMPARE(request.rawHeader("OC-ConflictInitialBasePath"), Utility::conflictFileBaseName(conflictFile.toUtf8()));
+ }();
}
}
return nullptr;
@@ -121,6 +131,9 @@ private slots:
QCOMPARE(conflictMap.size(), 2);
QCOMPARE(Utility::conflictFileBaseName(conflictMap[a1FileId].toUtf8()), QByteArray("A/a1"));
+ // Check that the conflict file contains the username
+ QVERIFY(conflictMap[a1FileId].contains(QString("(conflicted copy %1 ").arg(fakeFolder.syncEngine().account()->davDisplayName())));
+
QCOMPARE(remote.find(conflictMap[a1FileId])->contentChar, 'L');
QCOMPARE(remote.find("A/a1")->contentChar, 'R');
@@ -137,11 +150,15 @@ private slots:
QMap<QByteArray, QString> conflictMap;
fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *) -> QNetworkReply * {
if (op == QNetworkAccessManager::PutOperation) {
- auto baseFileId = request.rawHeader("OC-ConflictBaseFileId");
- if (!baseFileId.isEmpty()) {
+ if (request.rawHeader("OC-Conflict") == "1") {
+ auto baseFileId = request.rawHeader("OC-ConflictBaseFileId");
auto components = request.url().toString().split('/');
QString conflictFile = components.mid(components.size() - 2).join('/');
conflictMap[baseFileId] = conflictFile;
+ [&] {
+ QVERIFY(!baseFileId.isEmpty());
+ QCOMPARE(request.rawHeader("OC-ConflictInitialBasePath"), Utility::conflictFileBaseName(conflictFile.toUtf8()));
+ }();
}
}
return nullptr;
@@ -151,11 +168,12 @@ private slots:
// file didn't finish in the same sync run that the conflict was created.
// To do that we need to create a mock conflict record.
auto a1FileId = fakeFolder.remoteModifier().find("A/a1")->fileId;
- QString conflictName = QLatin1String("A/a1_conflict-me-1234");
+ QString conflictName = QLatin1String("A/a1 (conflicted copy me 1234)");
fakeFolder.localModifier().insert(conflictName, 64, 'L');
ConflictRecord conflictRecord;
conflictRecord.path = conflictName.toUtf8();
conflictRecord.baseFileId = a1FileId;
+ conflictRecord.initialBasePath = "A/a1";
fakeFolder.syncJournal().setConflictRecord(conflictRecord);
QVERIFY(fakeFolder.syncOnce());
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
@@ -201,12 +219,13 @@ private slots:
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
// With no headers from the server
- fakeFolder.remoteModifier().insert("A/a1_conflict-1234");
+ fakeFolder.remoteModifier().insert("A/a1 (conflicted copy 1234)");
QVERIFY(fakeFolder.syncOnce());
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
- auto conflictRecord = fakeFolder.syncJournal().conflictRecord("A/a1_conflict-1234");
+ auto conflictRecord = fakeFolder.syncJournal().conflictRecord("A/a1 (conflicted copy 1234)");
QVERIFY(conflictRecord.isValid());
QCOMPARE(conflictRecord.baseFileId, fakeFolder.remoteModifier().find("A/a1")->fileId);
+ QCOMPARE(conflictRecord.initialBasePath, QByteArray("A/a1"));
// Now with server headers
QObject parent;
@@ -218,6 +237,7 @@ private slots:
reply->setRawHeader("OC-ConflictBaseFileId", a2FileId);
reply->setRawHeader("OC-ConflictBaseMtime", "1234");
reply->setRawHeader("OC-ConflictBaseEtag", "etag");
+ reply->setRawHeader("OC-ConflictInitialBasePath", "A/original");
return reply;
}
return nullptr;
@@ -230,6 +250,7 @@ private slots:
QCOMPARE(conflictRecord.baseFileId, a2FileId);
QCOMPARE(conflictRecord.baseModtime, 1234);
QCOMPARE(conflictRecord.baseEtag, QByteArray("etag"));
+ QCOMPARE(conflictRecord.initialBasePath, QByteArray("A/original"));
}
// Check that conflict records are removed when the file is gone
@@ -303,40 +324,72 @@ private slots:
QTest::addColumn<QString>("input");
QTest::addColumn<QString>("output");
- QTest::newRow("")
+ QTest::newRow("nomatch1")
<< "a/b/foo"
<< "";
- QTest::newRow("")
+ QTest::newRow("nomatch2")
<< "a/b/foo.txt"
<< "";
- QTest::newRow("")
+ QTest::newRow("nomatch3")
<< "a/b/foo_conflict"
<< "";
- QTest::newRow("")
+ QTest::newRow("nomatch4")
<< "a/b/foo_conflict.txt"
<< "";
- QTest::newRow("")
+ QTest::newRow("match1")
<< "a/b/foo_conflict-123.txt"
<< "a/b/foo.txt";
- QTest::newRow("")
+ QTest::newRow("match2")
<< "a/b/foo_conflict-foo-123.txt"
<< "a/b/foo.txt";
- QTest::newRow("")
+ QTest::newRow("match3")
<< "a/b/foo_conflict-123"
<< "a/b/foo";
- QTest::newRow("")
+ QTest::newRow("match4")
<< "a/b/foo_conflict-foo-123"
<< "a/b/foo";
+ // new style
+ QTest::newRow("newmatch1")
+ << "a/b/foo (conflicted copy 123).txt"
+ << "a/b/foo.txt";
+ QTest::newRow("newmatch2")
+ << "a/b/foo (conflicted copy foo 123).txt"
+ << "a/b/foo.txt";
+
+ QTest::newRow("newmatch3")
+ << "a/b/foo (conflicted copy 123)"
+ << "a/b/foo";
+ QTest::newRow("newmatch4")
+ << "a/b/foo (conflicted copy foo 123)"
+ << "a/b/foo";
+
+ QTest::newRow("newmatch5")
+ << "a/b/foo (conflicted copy foo 123) bla"
+ << "a/b/foo bla";
+
+ QTest::newRow("newmatch6")
+ << "a/b/foo (conflicted copy foo.bar 123)"
+ << "a/b/foo";
+
// double conflict files
- QTest::newRow("")
+ QTest::newRow("double1")
<< "a/b/foo_conflict-123_conflict-456.txt"
<< "a/b/foo_conflict-123.txt";
- QTest::newRow("")
+ QTest::newRow("double2")
<< "a/b/foo_conflict-foo-123_conflict-bar-456.txt"
<< "a/b/foo_conflict-foo-123.txt";
+ QTest::newRow("double3")
+ << "a/b/foo (conflicted copy 123) (conflicted copy 456).txt"
+ << "a/b/foo (conflicted copy 123).txt";
+ QTest::newRow("double4")
+ << "a/b/foo (conflicted copy 123)_conflict-456.txt"
+ << "a/b/foo (conflicted copy 123).txt";
+ QTest::newRow("double5")
+ << "a/b/foo_conflict-123 (conflicted copy 456).txt"
+ << "a/b/foo_conflict-123.txt";
}
void testConflictFileBaseName()
@@ -500,8 +553,8 @@ private slots:
auto conflicts = findConflicts(fakeFolder.currentLocalState());
std::sort(conflicts.begin(), conflicts.end());
QVERIFY(conflicts.size() == 2);
- QVERIFY(conflicts[0].contains("A_conflict"));
- QVERIFY(conflicts[1].contains("B_conflict"));
+ QVERIFY(conflicts[0].contains("A (conflicted copy"));
+ QVERIFY(conflicts[1].contains("B (conflicted copy"));
for (auto conflict : conflicts)
QDir(fakeFolder.localPath() + conflict).removeRecursively();
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
@@ -539,7 +592,7 @@ private slots:
// inside of them!
auto conflicts = findConflicts(fakeFolder.currentLocalState());
QVERIFY(conflicts.size() == 1);
- QVERIFY(conflicts[0].contains("A_conflict"));
+ QVERIFY(conflicts[0].contains("A (conflicted copy"));
for (auto conflict : conflicts)
QDir(fakeFolder.localPath() + conflict).removeRecursively();
diff --git a/test/testsyncengine.cpp b/test/testsyncengine.cpp
index ff291cc39..5628befdc 100644
--- a/test/testsyncengine.cpp
+++ b/test/testsyncengine.cpp
@@ -172,6 +172,14 @@ private slots:
fakeFolder.syncEngine().journal()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList,
{"parentFolder/subFolderA/"});
fakeFolder.syncEngine().journal()->avoidReadFromDbOnNextSync(QByteArrayLiteral("parentFolder/subFolderA/"));
+ auto getEtag = [&](const QByteArray &file) {
+ SyncJournalFileRecord rec;
+ fakeFolder.syncJournal().getFileRecord(file, &rec);
+ return rec._etag;
+ };
+ QVERIFY(getEtag("parentFolder") == "_invalid_");
+ QVERIFY(getEtag("parentFolder/subFolderA") == "_invalid_");
+ QVERIFY(getEtag("parentFolder/subFolderA/subsubFolder") != "_invalid_");
// But touch local file before the next sync, such that the local folder
// can't be removed
@@ -247,7 +255,8 @@ private slots:
} else if(item->_file == "Y/Z/d3") {
QVERIFY(item->_status != SyncFileItem::Success);
}
- QVERIFY(item->_file != "Y/Z/d9"); // we should have aborted the sync before d9 starts
+ // We do not know about the other files - maybe the sync was aborted,
+ // maybe they finished before the error caused the abort.
}
}
@@ -563,40 +572,6 @@ private slots:
QVERIFY(!fakeFolder.currentRemoteState().find("C/myfile.txt"));
}
- // Check correct behavior when local discovery is partially drawn from the db
- void testLocalDiscoveryStyle()
- {
- FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() };
-
- // More subdirectories are useful for testing
- fakeFolder.localModifier().mkdir("A/X");
- fakeFolder.localModifier().mkdir("A/Y");
- fakeFolder.localModifier().insert("A/X/x1");
- fakeFolder.localModifier().insert("A/Y/y1");
- QVERIFY(fakeFolder.syncOnce());
- QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
-
- // Test begins
- fakeFolder.localModifier().insert("A/a3");
- fakeFolder.localModifier().insert("A/X/x2");
- fakeFolder.localModifier().insert("A/Y/y2");
- fakeFolder.localModifier().insert("B/b3");
- fakeFolder.remoteModifier().insert("C/c3");
-
- fakeFolder.syncEngine().setLocalDiscoveryOptions(LocalDiscoveryStyle::DatabaseAndFilesystem, { "A/X" });
- QVERIFY(fakeFolder.syncOnce());
- QVERIFY(fakeFolder.currentRemoteState().find("A/a3"));
- QVERIFY(fakeFolder.currentRemoteState().find("A/X/x2"));
- QVERIFY(!fakeFolder.currentRemoteState().find("A/Y/y2"));
- QVERIFY(!fakeFolder.currentRemoteState().find("B/b3"));
- QVERIFY(fakeFolder.currentLocalState().find("C/c3"));
- QCOMPARE(fakeFolder.syncEngine().lastLocalDiscoveryStyle(), LocalDiscoveryStyle::DatabaseAndFilesystem);
-
- QVERIFY(fakeFolder.syncOnce());
- QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
- QCOMPARE(fakeFolder.syncEngine().lastLocalDiscoveryStyle(), LocalDiscoveryStyle::FilesystemOnly);
- }
-
void testDiscoveryHiddenFile()
{
FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() };
@@ -641,6 +616,7 @@ private slots:
QVERIFY(fakeFolder.currentLocalState().find("A/tößt"));
QVERIFY(fakeFolder.currentLocalState().find("A/t𠜎t"));
+#if !defined(Q_OS_MAC) && !defined(Q_OS_WIN)
// Try again with a locale that can represent ö but not 𠜎 (4-byte utf8).
QTextCodec::setCodecForLocale(QTextCodec::codecForName("ISO-8859-15"));
QVERIFY(QTextCodec::codecForLocale()->mibEnum() == 111);
@@ -671,6 +647,7 @@ private slots:
QVERIFY(fakeFolder.currentRemoteState().find("C/tößt"));
QTextCodec::setCodecForLocale(utf8Locale);
+#endif
}
};
diff --git a/test/testsyncjournaldb.cpp b/test/testsyncjournaldb.cpp
index 389330ffa..4748f64f7 100644
--- a/test/testsyncjournaldb.cpp
+++ b/test/testsyncjournaldb.cpp
@@ -57,7 +57,7 @@ private slots:
record._type = ItemTypeDirectory;
record._etag = "789789";
record._fileId = "abcd";
- record._remotePerm = RemotePermissions("RW");
+ record._remotePerm = RemotePermissions::fromDbValue("RW");
record._fileSize = 213089055;
record._checksumHeader = "MD5:mychecksum";
QVERIFY(_db.setFileRecord(record));
@@ -79,7 +79,7 @@ private slots:
record._type = ItemTypeFile;
record._etag = "789FFF";
record._fileId = "efg";
- record._remotePerm = RemotePermissions("NV");
+ record._remotePerm = RemotePermissions::fromDbValue("NV");
record._fileSize = 289055;
_db.setFileRecordMetadata(record);
QVERIFY(_db.getFileRecord(QByteArrayLiteral("foo"), &storedRecord));
@@ -96,7 +96,7 @@ private slots:
{
SyncJournalFileRecord record;
record._path = "foo-checksum";
- record._remotePerm = RemotePermissions("RW");
+ record._remotePerm = RemotePermissions::fromDbValue(" ");
record._checksumHeader = "MD5:mychecksum";
record._modtime = Utility::qDateTimeToTime_t(QDateTime::currentDateTimeUtc());
QVERIFY(_db.setFileRecord(record));
@@ -117,7 +117,7 @@ private slots:
{
SyncJournalFileRecord record;
record._path = "foo-nochecksum";
- record._remotePerm = RemotePermissions("RWN");
+ record._remotePerm = RemotePermissions();
record._modtime = Utility::qDateTimeToTime_t(QDateTime::currentDateTimeUtc());
QVERIFY(_db.setFileRecord(record));
@@ -176,11 +176,15 @@ private slots:
// Typical 8-digit padded id
record._fileId = "00000001abcd";
- QCOMPARE(record.numericFileId(), QByteArray("00000001"));
+ QCOMPARE(record.legacyDeriveNumericFileId(), QByteArray("00000001"));
+
+ // Typical 8-digit padded id with instanceid that starts with a digit
+ record._fileId = "00000001999";
+ QCOMPARE(record.legacyDeriveNumericFileId(), QByteArray("00000001"));
// When the numeric id overflows the 8-digit boundary
record._fileId = "123456789ocidblaabcd";
- QCOMPARE(record.numericFileId(), QByteArray("123456789"));
+ QCOMPARE(record.legacyDeriveNumericFileId(), QByteArray("123456789"));
}
void testConflictRecord()
@@ -205,6 +209,124 @@ private slots:
QVERIFY(!_db.conflictRecord(record.path).isValid());
}
+ void testAvoidReadFromDbOnNextSync()
+ {
+ auto invalidEtag = QByteArray("_invalid_");
+ auto initialEtag = QByteArray("etag");
+ auto makeEntry = [&](const QByteArray &path, ItemType type) {
+ SyncJournalFileRecord record;
+ record._path = path;
+ record._type = type;
+ record._etag = initialEtag;
+ _db.setFileRecord(record);
+ };
+ auto getEtag = [&](const QByteArray &path) {
+ SyncJournalFileRecord record;
+ _db.getFileRecord(path, &record);
+ return record._etag;
+ };
+
+ const auto dirType = ItemTypeDirectory;
+ const auto fileType = ItemTypeFile;
+
+ makeEntry("foodir", dirType);
+ makeEntry("otherdir", dirType);
+ makeEntry("foo%", dirType); // wildcards don't apply
+ makeEntry("foodi_", dirType); // wildcards don't apply
+ makeEntry("foodir/file", fileType);
+ makeEntry("foodir/subdir", dirType);
+ makeEntry("foodir/subdir/file", fileType);
+ makeEntry("foodir/otherdir", dirType);
+ makeEntry("fo", dirType); // prefix, but does not match
+ makeEntry("foodir/sub", dirType); // prefix, but does not match
+ makeEntry("foodir/subdir/subsubdir", dirType);
+ makeEntry("foodir/subdir/subsubdir/file", fileType);
+ makeEntry("foodir/subdir/otherdir", dirType);
+
+ _db.avoidReadFromDbOnNextSync(QByteArray("foodir/subdir"));
+
+ // Direct effects of parent directories being set to _invalid_
+ QCOMPARE(getEtag("foodir"), invalidEtag);
+ QCOMPARE(getEtag("foodir/subdir"), invalidEtag);
+ QCOMPARE(getEtag("foodir/subdir/subsubdir"), initialEtag);
+
+ QCOMPARE(getEtag("foodir/file"), initialEtag);
+ QCOMPARE(getEtag("foodir/subdir/file"), initialEtag);
+ QCOMPARE(getEtag("foodir/subdir/subsubdir/file"), initialEtag);
+
+ QCOMPARE(getEtag("fo"), initialEtag);
+ QCOMPARE(getEtag("foo%"), initialEtag);
+ QCOMPARE(getEtag("foodi_"), initialEtag);
+ QCOMPARE(getEtag("otherdir"), initialEtag);
+ QCOMPARE(getEtag("foodir/otherdir"), initialEtag);
+ QCOMPARE(getEtag("foodir/sub"), initialEtag);
+ QCOMPARE(getEtag("foodir/subdir/otherdir"), initialEtag);
+
+ // Indirect effects: setFileRecord() calls filter etags
+ initialEtag = "etag2";
+
+ makeEntry("foodir", dirType);
+ QCOMPARE(getEtag("foodir"), invalidEtag);
+ makeEntry("foodir/subdir", dirType);
+ QCOMPARE(getEtag("foodir/subdir"), invalidEtag);
+ makeEntry("foodir/subdir/subsubdir", dirType);
+ QCOMPARE(getEtag("foodir/subdir/subsubdir"), initialEtag);
+ makeEntry("fo", dirType);
+ QCOMPARE(getEtag("fo"), initialEtag);
+ makeEntry("foodir/sub", dirType);
+ QCOMPARE(getEtag("foodir/sub"), initialEtag);
+ }
+
+ void testRecursiveDelete()
+ {
+ auto makeEntry = [&](const QByteArray &path) {
+ SyncJournalFileRecord record;
+ record._path = path;
+ _db.setFileRecord(record);
+ };
+
+ QByteArrayList elements;
+ elements
+ << "foo"
+ << "foo/file"
+ << "bar"
+ << "moo"
+ << "moo/file"
+ << "foo%bar"
+ << "foo bla bar/file"
+ << "fo_"
+ << "fo_/file";
+ for (auto elem : elements)
+ makeEntry(elem);
+
+ auto checkElements = [&]() {
+ bool ok = true;
+ for (auto elem : elements) {
+ SyncJournalFileRecord record;
+ _db.getFileRecord(elem, &record);
+ if (!record.isValid()) {
+ qWarning() << "Missing record: " << elem;
+ ok = false;
+ }
+ }
+ return ok;
+ };
+
+ _db.deleteFileRecord("moo", true);
+ elements.removeAll("moo");
+ elements.removeAll("moo/file");
+ QVERIFY(checkElements());
+
+ _db.deleteFileRecord("fo_", true);
+ elements.removeAll("fo_");
+ elements.removeAll("fo_/file");
+ QVERIFY(checkElements());
+
+ _db.deleteFileRecord("foo%bar", true);
+ elements.removeAll("foo%bar");
+ QVERIFY(checkElements());
+ }
+
private:
SyncJournalDb _db;
};
diff --git a/test/testsyncmove.cpp b/test/testsyncmove.cpp
index 67d3c22be..4a80a6295 100644
--- a/test/testsyncmove.cpp
+++ b/test/testsyncmove.cpp
@@ -42,7 +42,7 @@ QStringList findConflicts(const FileInfo &dir)
{
QStringList conflicts;
for (const auto &item : dir.children) {
- if (item.name.contains("conflict")) {
+ if (item.name.contains("(conflicted copy")) {
conflicts.append(item.path());
}
}
@@ -56,7 +56,7 @@ bool expectAndWipeConflict(FileModifier &local, FileInfo state, const QString pa
if (!base)
return false;
for (const auto &item : base->children) {
- if (item.name.startsWith(pathComponents.fileName()) && item.name.contains("_conflict")) {
+ if (item.name.startsWith(pathComponents.fileName()) && item.name.contains("(conflicted copy")) {
local.remove(item.path());
return true;
}
@@ -576,6 +576,87 @@ private slots:
//QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
}
}
+
+ // https://github.com/owncloud/client/issues/6629#issuecomment-402450691
+ // When a file is moved and the server mtime was not in sync, the local mtime should be kept
+ void testMoveAndMTimeChange()
+ {
+ FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() };
+ int nPUT = 0;
+ int nDELETE = 0;
+ int nGET = 0;
+ int nMOVE = 0;
+ fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *) {
+ if (op == QNetworkAccessManager::PutOperation)
+ ++nPUT;
+ if (op == QNetworkAccessManager::DeleteOperation)
+ ++nDELETE;
+ if (op == QNetworkAccessManager::GetOperation)
+ ++nGET;
+ if (req.attribute(QNetworkRequest::CustomVerbAttribute) == "MOVE")
+ ++nMOVE;
+ return nullptr;
+ });
+
+ // Changing the mtime on the server (without invalidating the etag)
+ fakeFolder.remoteModifier().find("A/a1")->lastModified = QDateTime::currentDateTimeUtc().addSecs(-50000);
+ fakeFolder.remoteModifier().find("A/a2")->lastModified = QDateTime::currentDateTimeUtc().addSecs(-40000);
+
+ // Move a few files
+ fakeFolder.remoteModifier().rename("A/a1", "A/a1_server_renamed");
+ fakeFolder.localModifier().rename("A/a2", "A/a2_local_renamed");
+
+ QVERIFY(fakeFolder.syncOnce());
+ QCOMPARE(nGET, 0);
+ QCOMPARE(nPUT, 0);
+ QCOMPARE(nMOVE, 1);
+ QCOMPARE(nDELETE, 0);
+
+ // Another sync should do nothing
+ QVERIFY(fakeFolder.syncOnce());
+ QCOMPARE(nGET, 0);
+ QCOMPARE(nPUT, 0);
+ QCOMPARE(nMOVE, 1);
+ QCOMPARE(nDELETE, 0);
+
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ }
+
+ // Test for https://github.com/owncloud/client/issues/6694
+ void testInvertFolderHierarchy()
+ {
+ FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() };
+ fakeFolder.remoteModifier().mkdir("A/Empty");
+ fakeFolder.remoteModifier().mkdir("A/Empty/Foo");
+ fakeFolder.remoteModifier().mkdir("C/AllEmpty");
+ fakeFolder.remoteModifier().mkdir("C/AllEmpty/Bar");
+ QVERIFY(fakeFolder.syncOnce());
+
+ // "Empty" is after "A", alphabetically
+ fakeFolder.localModifier().rename("A/Empty", "Empty");
+ fakeFolder.localModifier().rename("A", "Empty/A");
+
+ // "AllEmpty" is before "C", alphabetically
+ fakeFolder.localModifier().rename("C/AllEmpty", "AllEmpty");
+ fakeFolder.localModifier().rename("C", "AllEmpty/C");
+
+ auto expectedState = fakeFolder.currentLocalState();
+ QVERIFY(fakeFolder.syncOnce());
+ QCOMPARE(fakeFolder.currentLocalState(), expectedState);
+ QCOMPARE(fakeFolder.currentRemoteState(), expectedState);
+
+ /* FIXME - likely addressed by ogoffart's sync code refactor
+ // Now, the revert, but "crossed"
+ fakeFolder.localModifier().rename("Empty/A", "A");
+ fakeFolder.localModifier().rename("AllEmpty/C", "C");
+ fakeFolder.localModifier().rename("Empty", "C/Empty");
+ fakeFolder.localModifier().rename("AllEmpty", "A/AllEmpty");
+ expectedState = fakeFolder.currentLocalState();
+ QVERIFY(fakeFolder.syncOnce());
+ QCOMPARE(fakeFolder.currentLocalState(), expectedState);
+ QCOMPARE(fakeFolder.currentRemoteState(), expectedState);
+ */
+ }
};
QTEST_GUILESS_MAIN(TestSyncMove)
diff --git a/test/testsyncvirtualfiles.cpp b/test/testsyncvirtualfiles.cpp
new file mode 100644
index 000000000..bc603e9a5
--- /dev/null
+++ b/test/testsyncvirtualfiles.cpp
@@ -0,0 +1,631 @@
+/*
+ * This software is in the public domain, furnished "as is", without technical
+ * support, and with no warranty, express or implied, as to its usefulness for
+ * any purpose.
+ *
+ */
+
+#include <QtTest>
+#include "syncenginetestutils.h"
+#include <syncengine.h>
+
+using namespace OCC;
+
+SyncFileItemPtr findItem(const QSignalSpy &spy, const QString &path)
+{
+ for (const QList<QVariant> &args : spy) {
+ auto item = args[0].value<SyncFileItemPtr>();
+ if (item->destination() == path)
+ return item;
+ }
+ return SyncFileItemPtr(new SyncFileItem);
+}
+
+bool itemInstruction(const QSignalSpy &spy, const QString &path, const csync_instructions_e instr)
+{
+ auto item = findItem(spy, path);
+ return item->_instruction == instr;
+}
+
+SyncJournalFileRecord dbRecord(FakeFolder &folder, const QString &path)
+{
+ SyncJournalFileRecord record;
+ folder.syncJournal().getFileRecord(path, &record);
+ return record;
+}
+
+class TestSyncVirtualFiles : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void testVirtualFileLifecycle_data()
+ {
+ QTest::addColumn<bool>("doLocalDiscovery");
+
+ QTest::newRow("full local discovery") << true;
+ QTest::newRow("skip local discovery") << false;
+ }
+
+ void testVirtualFileLifecycle()
+ {
+ QFETCH(bool, doLocalDiscovery);
+
+ FakeFolder fakeFolder{ FileInfo() };
+ SyncOptions syncOptions;
+ syncOptions._newFilesAreVirtual = true;
+ fakeFolder.syncEngine().setSyncOptions(syncOptions);
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ QSignalSpy completeSpy(&fakeFolder.syncEngine(), SIGNAL(itemCompleted(const SyncFileItemPtr &)));
+
+ auto cleanup = [&]() {
+ completeSpy.clear();
+ if (!doLocalDiscovery)
+ fakeFolder.syncEngine().setLocalDiscoveryOptions(LocalDiscoveryStyle::DatabaseAndFilesystem);
+ };
+ cleanup();
+
+ // Create a virtual file for a new remote file
+ fakeFolder.remoteModifier().mkdir("A");
+ fakeFolder.remoteModifier().insert("A/a1", 64);
+ auto someDate = QDateTime(QDate(1984, 07, 30), QTime(1,3,2));
+ fakeFolder.remoteModifier().setModTime("A/a1", someDate);
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a1"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/a1.owncloud"));
+ QCOMPARE(QFileInfo(fakeFolder.localPath() + "A/a1.owncloud").lastModified(), someDate);
+ QVERIFY(fakeFolder.currentRemoteState().find("A/a1"));
+ QVERIFY(itemInstruction(completeSpy, "A/a1.owncloud", CSYNC_INSTRUCTION_NEW));
+ QCOMPARE(dbRecord(fakeFolder, "A/a1.owncloud")._type, ItemTypeVirtualFile);
+ cleanup();
+
+ // Another sync doesn't actually lead to changes
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a1"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/a1.owncloud"));
+ QCOMPARE(QFileInfo(fakeFolder.localPath() + "A/a1.owncloud").lastModified(), someDate);
+ QVERIFY(fakeFolder.currentRemoteState().find("A/a1"));
+ QCOMPARE(dbRecord(fakeFolder, "A/a1.owncloud")._type, ItemTypeVirtualFile);
+ QVERIFY(completeSpy.isEmpty());
+ cleanup();
+
+ // Not even when the remote is rediscovered
+ fakeFolder.syncJournal().forceRemoteDiscoveryNextSync();
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a1"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/a1.owncloud"));
+ QCOMPARE(QFileInfo(fakeFolder.localPath() + "A/a1.owncloud").lastModified(), someDate);
+ QVERIFY(fakeFolder.currentRemoteState().find("A/a1"));
+ QCOMPARE(dbRecord(fakeFolder, "A/a1.owncloud")._type, ItemTypeVirtualFile);
+ QVERIFY(completeSpy.isEmpty());
+ cleanup();
+
+ // Neither does a remote change
+ fakeFolder.remoteModifier().appendByte("A/a1");
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a1"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/a1.owncloud"));
+ QVERIFY(fakeFolder.currentRemoteState().find("A/a1"));
+ QVERIFY(itemInstruction(completeSpy, "A/a1.owncloud", CSYNC_INSTRUCTION_UPDATE_METADATA));
+ QCOMPARE(dbRecord(fakeFolder, "A/a1.owncloud")._type, ItemTypeVirtualFile);
+ QCOMPARE(dbRecord(fakeFolder, "A/a1.owncloud")._fileSize, 65);
+ cleanup();
+
+ // If the local virtual file file is removed, it'll just be recreated
+ if (!doLocalDiscovery)
+ fakeFolder.syncEngine().setLocalDiscoveryOptions(LocalDiscoveryStyle::DatabaseAndFilesystem, { "A" });
+ fakeFolder.localModifier().remove("A/a1.owncloud");
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a1"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/a1.owncloud"));
+ QVERIFY(fakeFolder.currentRemoteState().find("A/a1"));
+ QVERIFY(itemInstruction(completeSpy, "A/a1.owncloud", CSYNC_INSTRUCTION_NEW));
+ QCOMPARE(dbRecord(fakeFolder, "A/a1.owncloud")._type, ItemTypeVirtualFile);
+ QCOMPARE(dbRecord(fakeFolder, "A/a1.owncloud")._fileSize, 65);
+ cleanup();
+
+ // Remote rename is propagated
+ fakeFolder.remoteModifier().rename("A/a1", "A/a1m");
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a1"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a1m"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a1.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/a1m.owncloud"));
+ QVERIFY(!fakeFolder.currentRemoteState().find("A/a1"));
+ QVERIFY(fakeFolder.currentRemoteState().find("A/a1m"));
+ QVERIFY(itemInstruction(completeSpy, "A/a1m.owncloud", CSYNC_INSTRUCTION_RENAME));
+ QCOMPARE(dbRecord(fakeFolder, "A/a1m.owncloud")._type, ItemTypeVirtualFile);
+ cleanup();
+
+ // Remote remove is propagated
+ fakeFolder.remoteModifier().remove("A/a1m");
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a1m.owncloud"));
+ QVERIFY(!fakeFolder.currentRemoteState().find("A/a1m"));
+ QVERIFY(itemInstruction(completeSpy, "A/a1m.owncloud", CSYNC_INSTRUCTION_REMOVE));
+ QVERIFY(!dbRecord(fakeFolder, "A/a1.owncloud").isValid());
+ QVERIFY(!dbRecord(fakeFolder, "A/a1m.owncloud").isValid());
+ cleanup();
+
+ // Edge case: Local virtual file but no db entry for some reason
+ fakeFolder.remoteModifier().insert("A/a2", 64);
+ fakeFolder.remoteModifier().insert("A/a3", 64);
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(fakeFolder.currentLocalState().find("A/a2.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/a3.owncloud"));
+ cleanup();
+
+ fakeFolder.syncEngine().journal()->deleteFileRecord("A/a2.owncloud");
+ fakeFolder.syncEngine().journal()->deleteFileRecord("A/a3.owncloud");
+ fakeFolder.remoteModifier().remove("A/a3");
+ fakeFolder.syncEngine().setLocalDiscoveryOptions(LocalDiscoveryStyle::FilesystemOnly);
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(fakeFolder.currentLocalState().find("A/a2.owncloud"));
+ QVERIFY(itemInstruction(completeSpy, "A/a2.owncloud", CSYNC_INSTRUCTION_NEW));
+ QVERIFY(dbRecord(fakeFolder, "A/a2.owncloud").isValid());
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a3.owncloud"));
+ QVERIFY(!dbRecord(fakeFolder, "A/a3.owncloud").isValid());
+ cleanup();
+ }
+
+ void testVirtualFileConflict()
+ {
+ FakeFolder fakeFolder{ FileInfo() };
+ SyncOptions syncOptions;
+ syncOptions._newFilesAreVirtual = true;
+ fakeFolder.syncEngine().setSyncOptions(syncOptions);
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ QSignalSpy completeSpy(&fakeFolder.syncEngine(), SIGNAL(itemCompleted(const SyncFileItemPtr &)));
+
+ auto cleanup = [&]() {
+ completeSpy.clear();
+ };
+ cleanup();
+
+ // Create a virtual file for a new remote file
+ fakeFolder.remoteModifier().mkdir("A");
+ fakeFolder.remoteModifier().insert("A/a1", 64);
+ fakeFolder.remoteModifier().insert("A/a2", 64);
+ fakeFolder.remoteModifier().mkdir("B");
+ fakeFolder.remoteModifier().insert("B/b1", 64);
+ fakeFolder.remoteModifier().insert("B/b2", 64);
+ fakeFolder.remoteModifier().mkdir("C");
+ fakeFolder.remoteModifier().insert("C/c1", 64);
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(fakeFolder.currentLocalState().find("A/a1.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("B/b2.owncloud"));
+ cleanup();
+
+ // A: the correct file and a conflicting file are added, virtual files stay
+ // B: same setup, but the virtual files are deleted by the user
+ // C: user adds a *directory* locally
+ fakeFolder.localModifier().insert("A/a1", 64);
+ fakeFolder.localModifier().insert("A/a2", 30);
+ fakeFolder.localModifier().insert("B/b1", 64);
+ fakeFolder.localModifier().insert("B/b2", 30);
+ fakeFolder.localModifier().remove("B/b1.owncloud");
+ fakeFolder.localModifier().remove("B/b2.owncloud");
+ fakeFolder.localModifier().mkdir("C/c1");
+ fakeFolder.localModifier().insert("C/c1/foo");
+ QVERIFY(fakeFolder.syncOnce());
+
+ // Everything is CONFLICT since mtimes are different even for a1/b1
+ QVERIFY(itemInstruction(completeSpy, "A/a1", CSYNC_INSTRUCTION_CONFLICT));
+ QVERIFY(itemInstruction(completeSpy, "A/a2", CSYNC_INSTRUCTION_CONFLICT));
+ QVERIFY(itemInstruction(completeSpy, "B/b1", CSYNC_INSTRUCTION_CONFLICT));
+ QVERIFY(itemInstruction(completeSpy, "B/b2", CSYNC_INSTRUCTION_CONFLICT));
+ QVERIFY(itemInstruction(completeSpy, "C/c1", CSYNC_INSTRUCTION_CONFLICT));
+
+ // no virtual file files should remain
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a1.owncloud"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a2.owncloud"));
+ QVERIFY(!fakeFolder.currentLocalState().find("B/b1.owncloud"));
+ QVERIFY(!fakeFolder.currentLocalState().find("B/b2.owncloud"));
+ QVERIFY(!fakeFolder.currentLocalState().find("C/c1.owncloud"));
+
+ // conflict files should exist
+ QCOMPARE(fakeFolder.syncJournal().conflictRecordPaths().size(), 3);
+
+ // nothing should have the virtual file tag
+ QCOMPARE(dbRecord(fakeFolder, "A/a1")._type, ItemTypeFile);
+ QCOMPARE(dbRecord(fakeFolder, "A/a2")._type, ItemTypeFile);
+ QCOMPARE(dbRecord(fakeFolder, "B/b1")._type, ItemTypeFile);
+ QCOMPARE(dbRecord(fakeFolder, "B/b2")._type, ItemTypeFile);
+ QCOMPARE(dbRecord(fakeFolder, "C/c1")._type, ItemTypeFile);
+ QVERIFY(!dbRecord(fakeFolder, "A/a1.owncloud").isValid());
+ QVERIFY(!dbRecord(fakeFolder, "A/a2.owncloud").isValid());
+ QVERIFY(!dbRecord(fakeFolder, "B/b1.owncloud").isValid());
+ QVERIFY(!dbRecord(fakeFolder, "B/b2.owncloud").isValid());
+ QVERIFY(!dbRecord(fakeFolder, "C/c1.owncloud").isValid());
+
+ cleanup();
+ }
+
+ void testWithNormalSync()
+ {
+ FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() };
+ SyncOptions syncOptions;
+ syncOptions._newFilesAreVirtual = true;
+ fakeFolder.syncEngine().setSyncOptions(syncOptions);
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ QSignalSpy completeSpy(&fakeFolder.syncEngine(), SIGNAL(itemCompleted(const SyncFileItemPtr &)));
+
+ auto cleanup = [&]() {
+ completeSpy.clear();
+ };
+ cleanup();
+
+ // No effect sync
+ QVERIFY(fakeFolder.syncOnce());
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ cleanup();
+
+ // Existing files are propagated just fine in both directions
+ fakeFolder.localModifier().appendByte("A/a1");
+ fakeFolder.localModifier().insert("A/a3");
+ fakeFolder.remoteModifier().appendByte("A/a2");
+ QVERIFY(fakeFolder.syncOnce());
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ cleanup();
+
+ // New files on the remote create virtual files
+ fakeFolder.remoteModifier().insert("A/new");
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(!fakeFolder.currentLocalState().find("A/new"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/new.owncloud"));
+ QVERIFY(fakeFolder.currentRemoteState().find("A/new"));
+ QVERIFY(itemInstruction(completeSpy, "A/new.owncloud", CSYNC_INSTRUCTION_NEW));
+ QCOMPARE(dbRecord(fakeFolder, "A/new.owncloud")._type, ItemTypeVirtualFile);
+ cleanup();
+ }
+
+ void testVirtualFileDownload()
+ {
+ FakeFolder fakeFolder{ FileInfo() };
+ SyncOptions syncOptions;
+ syncOptions._newFilesAreVirtual = true;
+ fakeFolder.syncEngine().setSyncOptions(syncOptions);
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ QSignalSpy completeSpy(&fakeFolder.syncEngine(), SIGNAL(itemCompleted(const SyncFileItemPtr &)));
+
+ auto cleanup = [&]() {
+ completeSpy.clear();
+ };
+ cleanup();
+
+ auto triggerDownload = [&](const QByteArray &path) {
+ auto &journal = fakeFolder.syncJournal();
+ SyncJournalFileRecord record;
+ journal.getFileRecord(path + ".owncloud", &record);
+ if (!record.isValid())
+ return;
+ record._type = ItemTypeVirtualFileDownload;
+ journal.setFileRecord(record);
+ };
+
+ // Create a virtual file for remote files
+ fakeFolder.remoteModifier().mkdir("A");
+ fakeFolder.remoteModifier().insert("A/a1");
+ fakeFolder.remoteModifier().insert("A/a2");
+ fakeFolder.remoteModifier().insert("A/a3");
+ fakeFolder.remoteModifier().insert("A/a4");
+ fakeFolder.remoteModifier().insert("A/a5");
+ fakeFolder.remoteModifier().insert("A/a6");
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(fakeFolder.currentLocalState().find("A/a1.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/a2.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/a3.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/a4.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/a5.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/a6.owncloud"));
+ cleanup();
+
+ // Download by changing the db entry
+ triggerDownload("A/a1");
+ triggerDownload("A/a2");
+ triggerDownload("A/a3");
+ triggerDownload("A/a4");
+ triggerDownload("A/a5");
+ triggerDownload("A/a6");
+ fakeFolder.remoteModifier().appendByte("A/a2");
+ fakeFolder.remoteModifier().remove("A/a3");
+ fakeFolder.remoteModifier().rename("A/a4", "A/a4m");
+ fakeFolder.localModifier().insert("A/a5");
+ fakeFolder.localModifier().insert("A/a6");
+ fakeFolder.localModifier().remove("A/a6.owncloud");
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(itemInstruction(completeSpy, "A/a1", CSYNC_INSTRUCTION_NEW));
+ QVERIFY(itemInstruction(completeSpy, "A/a1.owncloud", CSYNC_INSTRUCTION_NONE));
+ QVERIFY(itemInstruction(completeSpy, "A/a2", CSYNC_INSTRUCTION_NEW));
+ QVERIFY(itemInstruction(completeSpy, "A/a2.owncloud", CSYNC_INSTRUCTION_NONE));
+ QVERIFY(itemInstruction(completeSpy, "A/a3.owncloud", CSYNC_INSTRUCTION_REMOVE));
+ QVERIFY(itemInstruction(completeSpy, "A/a4m", CSYNC_INSTRUCTION_NEW));
+ QVERIFY(itemInstruction(completeSpy, "A/a4.owncloud", CSYNC_INSTRUCTION_REMOVE));
+ QVERIFY(itemInstruction(completeSpy, "A/a5", CSYNC_INSTRUCTION_CONFLICT));
+ QVERIFY(itemInstruction(completeSpy, "A/a5.owncloud", CSYNC_INSTRUCTION_NONE));
+ QVERIFY(itemInstruction(completeSpy, "A/a6", CSYNC_INSTRUCTION_CONFLICT));
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ QCOMPARE(dbRecord(fakeFolder, "A/a1")._type, ItemTypeFile);
+ QCOMPARE(dbRecord(fakeFolder, "A/a2")._type, ItemTypeFile);
+ QVERIFY(!dbRecord(fakeFolder, "A/a3").isValid());
+ QCOMPARE(dbRecord(fakeFolder, "A/a4m")._type, ItemTypeFile);
+ QCOMPARE(dbRecord(fakeFolder, "A/a5")._type, ItemTypeFile);
+ QCOMPARE(dbRecord(fakeFolder, "A/a6")._type, ItemTypeFile);
+ QVERIFY(!dbRecord(fakeFolder, "A/a1.owncloud").isValid());
+ QVERIFY(!dbRecord(fakeFolder, "A/a2.owncloud").isValid());
+ QVERIFY(!dbRecord(fakeFolder, "A/a3.owncloud").isValid());
+ QVERIFY(!dbRecord(fakeFolder, "A/a4.owncloud").isValid());
+ QVERIFY(!dbRecord(fakeFolder, "A/a5.owncloud").isValid());
+ QVERIFY(!dbRecord(fakeFolder, "A/a6.owncloud").isValid());
+ }
+
+ void testVirtualFileDownloadResume()
+ {
+ FakeFolder fakeFolder{ FileInfo() };
+ SyncOptions syncOptions;
+ syncOptions._newFilesAreVirtual = true;
+ fakeFolder.syncEngine().setSyncOptions(syncOptions);
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ QSignalSpy completeSpy(&fakeFolder.syncEngine(), SIGNAL(itemCompleted(const SyncFileItemPtr &)));
+
+ auto cleanup = [&]() {
+ completeSpy.clear();
+ fakeFolder.syncJournal().wipeErrorBlacklist();
+ };
+ cleanup();
+
+ auto triggerDownload = [&](const QByteArray &path) {
+ auto &journal = fakeFolder.syncJournal();
+ SyncJournalFileRecord record;
+ journal.getFileRecord(path + ".owncloud", &record);
+ if (!record.isValid())
+ return;
+ record._type = ItemTypeVirtualFileDownload;
+ journal.setFileRecord(record);
+ journal.avoidReadFromDbOnNextSync(record._path);
+ };
+
+ // Create a virtual file for remote files
+ fakeFolder.remoteModifier().mkdir("A");
+ fakeFolder.remoteModifier().insert("A/a1");
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(fakeFolder.currentLocalState().find("A/a1.owncloud"));
+ cleanup();
+
+ // Download by changing the db entry
+ triggerDownload("A/a1");
+ fakeFolder.serverErrorPaths().append("A/a1", 500);
+ QVERIFY(!fakeFolder.syncOnce());
+ QVERIFY(itemInstruction(completeSpy, "A/a1", CSYNC_INSTRUCTION_NEW));
+ QVERIFY(itemInstruction(completeSpy, "A/a1.owncloud", CSYNC_INSTRUCTION_NONE));
+ QVERIFY(fakeFolder.currentLocalState().find("A/a1.owncloud"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a1"));
+ QCOMPARE(dbRecord(fakeFolder, "A/a1.owncloud")._type, ItemTypeVirtualFileDownload);
+ QVERIFY(!dbRecord(fakeFolder, "A/a1").isValid());
+ cleanup();
+
+ fakeFolder.serverErrorPaths().clear();
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(itemInstruction(completeSpy, "A/a1", CSYNC_INSTRUCTION_NEW));
+ QVERIFY(itemInstruction(completeSpy, "A/a1.owncloud", CSYNC_INSTRUCTION_NONE));
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ QCOMPARE(dbRecord(fakeFolder, "A/a1")._type, ItemTypeFile);
+ QVERIFY(!dbRecord(fakeFolder, "A/a1.owncloud").isValid());
+ }
+
+ // Check what might happen if an older sync client encounters virtual files
+ void testOldVersion1()
+ {
+ FakeFolder fakeFolder{ FileInfo() };
+ SyncOptions syncOptions;
+ syncOptions._newFilesAreVirtual = true;
+ fakeFolder.syncEngine().setSyncOptions(syncOptions);
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+
+ // Create a virtual file
+ fakeFolder.remoteModifier().mkdir("A");
+ fakeFolder.remoteModifier().insert("A/a1");
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(fakeFolder.currentLocalState().find("A/a1.owncloud"));
+
+ // Simulate an old client by switching the type of all ItemTypeVirtualFile
+ // entries in the db to an invalid type.
+ auto &db = fakeFolder.syncJournal();
+ SyncJournalFileRecord rec;
+ db.getFileRecord(QByteArray("A/a1.owncloud"), &rec);
+ QVERIFY(rec.isValid());
+ QCOMPARE(rec._type, ItemTypeVirtualFile);
+ rec._type = static_cast<ItemType>(-1);
+ db.setFileRecord(rec);
+
+ // Also switch off new files becoming virtual files
+ syncOptions._newFilesAreVirtual = false;
+ fakeFolder.syncEngine().setSyncOptions(syncOptions);
+
+ // A sync that doesn't do remote discovery has no effect
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(fakeFolder.currentLocalState().find("A/a1.owncloud"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a1"));
+ QVERIFY(fakeFolder.currentRemoteState().find("A/a1"));
+ QVERIFY(!fakeFolder.currentRemoteState().find("A/a1.owncloud"));
+
+ // But with a remote discovery the virtual files will be removed and
+ // the remote files will be downloaded.
+ db.forceRemoteDiscoveryNextSync();
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(fakeFolder.currentLocalState().find("A/a1"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a1.owncloud"));
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ }
+
+ // Older versions may leave db entries for foo and foo.owncloud
+ void testOldVersion2()
+ {
+ FakeFolder fakeFolder{ FileInfo() };
+
+ // Sync a file
+ fakeFolder.remoteModifier().mkdir("A");
+ fakeFolder.remoteModifier().insert("A/a1");
+ QVERIFY(fakeFolder.syncOnce());
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+
+ // Create the virtual file too
+ // In the wild, the new version would create the virtual file and the db entry
+ // while the old version would download the plain file.
+ fakeFolder.localModifier().insert("A/a1.owncloud");
+ auto &db = fakeFolder.syncJournal();
+ SyncJournalFileRecord rec;
+ db.getFileRecord(QByteArray("A/a1"), &rec);
+ rec._type = ItemTypeVirtualFile;
+ rec._path = "A/a1.owncloud";
+ db.setFileRecord(rec);
+
+ SyncOptions syncOptions;
+ syncOptions._newFilesAreVirtual = true;
+ fakeFolder.syncEngine().setSyncOptions(syncOptions);
+
+ // Check that a sync removes the virtual file and its db entry
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a1.owncloud"));
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ QVERIFY(!dbRecord(fakeFolder, "A/a1.owncloud").isValid());
+ }
+
+ void testDownloadRecursive()
+ {
+ FakeFolder fakeFolder{ FileInfo() };
+ SyncOptions syncOptions;
+ syncOptions._newFilesAreVirtual = true;
+ fakeFolder.syncEngine().setSyncOptions(syncOptions);
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+
+ // Create a virtual file for remote files
+ fakeFolder.remoteModifier().mkdir("A");
+ fakeFolder.remoteModifier().mkdir("A/Sub");
+ fakeFolder.remoteModifier().mkdir("A/Sub/SubSub");
+ fakeFolder.remoteModifier().mkdir("A/Sub2");
+ fakeFolder.remoteModifier().mkdir("B");
+ fakeFolder.remoteModifier().mkdir("B/Sub");
+ fakeFolder.remoteModifier().insert("A/a1");
+ fakeFolder.remoteModifier().insert("A/a2");
+ fakeFolder.remoteModifier().insert("A/Sub/a3");
+ fakeFolder.remoteModifier().insert("A/Sub/a4");
+ fakeFolder.remoteModifier().insert("A/Sub/SubSub/a5");
+ fakeFolder.remoteModifier().insert("A/Sub2/a6");
+ fakeFolder.remoteModifier().insert("B/b1");
+ fakeFolder.remoteModifier().insert("B/Sub/b2");
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(fakeFolder.currentLocalState().find("A/a1.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/a2.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/Sub/a3.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/Sub/a4.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/Sub/SubSub/a5.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/Sub2/a6.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("B/b1.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("B/Sub/b2.owncloud"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a1"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a2"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/Sub/a3"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/Sub/a4"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/Sub/SubSub/a5"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/Sub2/a6"));
+ QVERIFY(!fakeFolder.currentLocalState().find("B/b1"));
+ QVERIFY(!fakeFolder.currentLocalState().find("B/Sub/b2"));
+
+
+ // Download All file in the directory A/Sub
+ // (as in Folder::downloadVirtualFile)
+ fakeFolder.syncJournal().markVirtualFileForDownloadRecursively("A/Sub");
+
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(fakeFolder.currentLocalState().find("A/a1.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/a2.owncloud"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/Sub/a3.owncloud"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/Sub/a4.owncloud"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/Sub/SubSub/a5.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/Sub2/a6.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("B/b1.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("B/Sub/b2.owncloud"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a1"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a2"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/Sub/a3"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/Sub/a4"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/Sub/SubSub/a5"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/Sub2/a6"));
+ QVERIFY(!fakeFolder.currentLocalState().find("B/b1"));
+ QVERIFY(!fakeFolder.currentLocalState().find("B/Sub/b2"));
+
+ // Add a file in a subfolder that was downloaded
+ // Currently, this continue to add it as a virtual file.
+ fakeFolder.remoteModifier().insert("A/Sub/SubSub/a7");
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(fakeFolder.currentLocalState().find("A/Sub/SubSub/a7.owncloud"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/Sub/SubSub/a7"));
+
+ // Now download all files in "A"
+ fakeFolder.syncJournal().markVirtualFileForDownloadRecursively("A");
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a1.owncloud"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a2.owncloud"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/Sub/a3.owncloud"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/Sub/a4.owncloud"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/Sub/SubSub/a5.owncloud"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/Sub2/a6.owncloud"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/Sub/SubSub/a7.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("B/b1.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("B/Sub/b2.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/a1"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/a2"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/Sub/a3"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/Sub/a4"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/Sub/SubSub/a5"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/Sub2/a6"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/Sub/SubSub/a7"));
+ QVERIFY(!fakeFolder.currentLocalState().find("B/b1"));
+ QVERIFY(!fakeFolder.currentLocalState().find("B/Sub/b2"));
+
+ // Now download remaining files in "B"
+ fakeFolder.syncJournal().markVirtualFileForDownloadRecursively("B");
+ QVERIFY(fakeFolder.syncOnce());
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ }
+
+ void testRenameToVirtual()
+ {
+ FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() };
+ SyncOptions syncOptions;
+ syncOptions._newFilesAreVirtual = true;
+ fakeFolder.syncEngine().setSyncOptions(syncOptions);
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ QSignalSpy completeSpy(&fakeFolder.syncEngine(), SIGNAL(itemCompleted(const SyncFileItemPtr &)));
+
+ auto cleanup = [&]() {
+ completeSpy.clear();
+ };
+ cleanup();
+
+ // If a file is renamed to <name>.owncloud, it becomes virtual
+ fakeFolder.localModifier().rename("A/a1", "A/a1.owncloud");
+ // If a file is renamed to <random>.owncloud, the file sticks around (to preserve user data)
+ fakeFolder.localModifier().rename("A/a2", "A/rand.owncloud");
+ QVERIFY(fakeFolder.syncOnce());
+
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a1"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/a1.owncloud"));
+ QVERIFY(fakeFolder.currentRemoteState().find("A/a1"));
+ QVERIFY(itemInstruction(completeSpy, "A/a1.owncloud", CSYNC_INSTRUCTION_NEW));
+ QCOMPARE(dbRecord(fakeFolder, "A/a1.owncloud")._type, ItemTypeVirtualFile);
+
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a2"));
+ QVERIFY(!fakeFolder.currentLocalState().find("A/a2.owncloud"));
+ QVERIFY(fakeFolder.currentLocalState().find("A/rand.owncloud"));
+ QVERIFY(!fakeFolder.currentRemoteState().find("A/a2"));
+ QVERIFY(itemInstruction(completeSpy, "A/a2", CSYNC_INSTRUCTION_REMOVE));
+ QVERIFY(!dbRecord(fakeFolder, "A/rand.owncloud").isValid());
+
+ cleanup();
+ }
+};
+
+QTEST_GUILESS_MAIN(TestSyncVirtualFiles)
+#include "testsyncvirtualfiles.moc"
diff --git a/test/testuploadreset.cpp b/test/testuploadreset.cpp
index ba5489c3a..2250618e0 100644
--- a/test/testuploadreset.cpp
+++ b/test/testuploadreset.cpp
@@ -36,6 +36,7 @@ private slots:
uploadInfo._transferid = 1;
uploadInfo._valid = true;
uploadInfo._modtime = Utility::qDateTimeToTime_t(modTime);
+ uploadInfo._size = size;
fakeFolder.syncEngine().journal()->setUploadInfo("A/a0", uploadInfo);
fakeFolder.uploadState().mkdir("1");
diff --git a/test/testutility.cpp b/test/testutility.cpp
index c83b14199..20fb0a458 100644
--- a/test/testutility.cpp
+++ b/test/testutility.cpp
@@ -11,6 +11,10 @@
using namespace OCC::Utility;
+namespace OCC {
+OCSYNC_EXPORT extern bool fsCasePreserving_override;
+}
+
class TestUtility : public QObject
{
Q_OBJECT
@@ -150,12 +154,12 @@ private slots:
void testFsCasePreserving()
{
- qputenv("OWNCLOUD_TEST_CASE_PRESERVING", "1");
+ QVERIFY(isMac() || isWindows() ? fsCasePreserving() : ! fsCasePreserving());
+ QScopedValueRollback<bool> scope(OCC::fsCasePreserving_override);
+ OCC::fsCasePreserving_override = 1;
QVERIFY(fsCasePreserving());
- qputenv("OWNCLOUD_TEST_CASE_PRESERVING", "0");
+ OCC::fsCasePreserving_override = 0;
QVERIFY(! fsCasePreserving());
- qunsetenv("OWNCLOUD_TEST_CASE_PRESERVING");
- QVERIFY(isMac() || isWindows() ? fsCasePreserving() : ! fsCasePreserving());
}
void testFileNamesEqual()
@@ -178,16 +182,36 @@ private slots:
QVERIFY(fileNamesEqual(a+"/test", b+"/test")); // both exist
QVERIFY(fileNamesEqual(a+"/test/TESTI", b+"/test/../test/TESTI")); // both exist
- qputenv("OWNCLOUD_TEST_CASE_PRESERVING", "1");
+ QScopedValueRollback<bool> scope(OCC::fsCasePreserving_override, true);
QVERIFY(fileNamesEqual(a+"/test", b+"/TEST")); // both exist
QVERIFY(!fileNamesEqual(a+"/test", b+"/test/TESTI")); // both are different
dir.remove();
- qunsetenv("OWNCLOUD_TEST_CASE_PRESERVING");
}
+ void testSanitizeForFileName_data()
+ {
+ QTest::addColumn<QString>("input");
+ QTest::addColumn<QString>("output");
+
+ QTest::newRow("")
+ << "foobar"
+ << "foobar";
+ QTest::newRow("")
+ << "a/b?c<d>e\\f:g*h|i\"j"
+ << "abcdefghij";
+ QTest::newRow("")
+ << QString::fromLatin1("a\x01 b\x1f c\x80 d\x9f")
+ << "a b c d";
+ }
+ void testSanitizeForFileName()
+ {
+ QFETCH(QString, input);
+ QFETCH(QString, output);
+ QCOMPARE(sanitizeForFileName(input), output);
+ }
};
QTEST_GUILESS_MAIN(TestUtility)
diff --git a/translations/client_ca.ts b/translations/client_ca.ts
index be35103fe..05bb2421b 100644
--- a/translations/client_ca.ts
+++ b/translations/client_ca.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="ca" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,17 +95,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Temps d&apos;espera de la connexió esgotat.</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation type="unfinished"/>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Cancel·la</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Compte</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Trieu què sincronitzar</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Força la sincronització ara</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>Reinicia la sincronització</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>Elimina la connexió de la carpeta sincronitzada</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Ha fallat la creació de la carpeta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;No s&apos;ha pogut crear la carpeta local &lt;i&gt;%1&lt;/i&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>Confirma l&apos;eliminació de la connexió de la carpeta sincronitzada</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>Elimina la connexió de la carpeta sincronitzada</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>S&apos;està sincronitzant</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>S&apos;està sincronitzant.&lt;br/&gt;Voleu parar-la?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 en ús</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 com a &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>La versió del servidor %1 és antiga i fora de suport! Continua sota la teva responsabilitat.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Connectat a %1</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>El servidor %1 no està disponible temporalment</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>S&apos;ha desconnectat de %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>No hi ha connexió amb %1 a %2.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Inici de sessió</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>Hi ha carpetes que no s&apos;han sincronitzat perquè són massa grans:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>Hi ha carpetes que no s&apos;han sincronitzat perquè són fonts d&apos;emmagatzematge externes:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation>Hi ha carpetes que no s&apos;han sincronitzat perquè són massa grans o són fonts d&apos;emmagatzematge externes:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Confirmeu l&apos;eliminació del compte</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Segur que voleu eliminar la connexió al compte &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Nota:&lt;/b&gt; això &lt;b&gt;no&lt;/b&gt; esborrarà cap fitxer.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Elimina la connexió</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Obre la carpeta</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Surt</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Continua la sincronització</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Pausa la sincronització</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Segur que voleu aturar la sincronització de la carpeta &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Nota:&lt;/b&gt; això &lt;b&gt;no&lt;/b&gt; esborrarà cap fitxer.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1 (%3%) de %2 en ús. Algunes carpetes, incloent les carpetes muntades a través de xarxa o les compartides, poden tenir límits diferents.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%1 de %2 en ús</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Actualment no hi ha informació disponible de l&apos;ús d&apos;emmagatzemament.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>La connexió %1 no està configurada.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>S&apos;ha desconnectat</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Desconnectat</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Connectat</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Servei no disponible</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
- <translation type="unfinished"/>
+ <translation>Mode de manteniment</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Error de xarxa</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Error de configuració</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Estat del compte desconegut</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Activitat del servidor</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Protocol de sincronització</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>No sincronitzat</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>No sincronitzat (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>La llista de l&apos;activitat del servidor s&apos;ha copiat al porta-retalls.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>La llista d&apos;activitat de sincronització s&apos;ha copiat al porta-retalls</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>S&apos;ha copiat una llista d&apos;elements no sincronitzats al porta-retalls.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>S&apos;ha copiat al porta-retalls</translation>
</message>
@@ -469,47 +488,47 @@
<translation>TextLabel</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Activitats del servidor</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Còpia</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Copia la llista d&apos;activitats al porta-retalls.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Es requereix una acció: Notificacions</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;El compte %1 no té les activitats habilitades.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation><numerusform>Heu rebut %n nova notificació de %2.</numerusform><numerusform>Heu rebut %n noves notificacions de %2.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation><numerusform>Heu rebut %n nova notificació de %1 i %2.</numerusform><numerusform>Heu rebut %n noves notificacions de %1 i %2.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>Heu rebut noves notificacions de %1, %2 i altres comptes.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>%1 notificacions - Es requereix una acció</translation>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Surt</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Continua</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation>S&apos;ha produït un error en accedir al fitxer de configuració</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation>Hi ha hagut un error en accedir al fitxer de configuració a %1.</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>Surt de l&apos;ownCloud</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>Error en escriure les metadades a la base de dades</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>No hi ha cap compte d&apos;OwnCloud configurat</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>El servidor configurat per aquest client és massa antic</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Actualitzeu el servidor a l&apos;última versió i reestabliu el client.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Error d&apos;autentificació: Aquest nom d&apos;usuari o contrasenya son incorrectes.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>temps excedit</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>Les credencials proporcionades no són correctes</translation>
</message>
@@ -637,135 +681,162 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Aturat per l&apos;usuari</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>El fitxer local %1 no existeix.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 hauria de ser una carpeta, però no ho és.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>No es pot llegir %1.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>S&apos;ha esborrat &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>S&apos;ha descarregat %1</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>S&apos;ha actualitzat %1</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 s&apos;ha reanomenat a %2.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 s&apos;ha mogut a %2.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation><numerusform>%1 i %n altre fitxer s&apos;ha esborrat.</numerusform><numerusform>%1 i %n altres fitxers s&apos;han esborrat.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation><numerusform>%1 i %n altre fitxer s&apos;han descarregat.</numerusform><numerusform>%1 i %n altres fitxers s&apos;han descarregat.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation><numerusform>%1 i %n altre fitxer s&apos;han actualitzat.</numerusform><numerusform>%1 i %n altres fitxers s&apos;han actualitzat.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation><numerusform>%1 s&apos;ha reanomenat a %2 i %n altre fitxer s&apos;ha reanomenat.</numerusform><numerusform>%1 s&apos;ha reanomenat a %2 i %n altres fitxers s&apos;han reanomenat.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation><numerusform>%1 s&apos;ha mogut a %2 i %n altre fitxer s&apos;ha mogut.</numerusform><numerusform>%1 s&apos;ha mogut a %2 i %n altres fitxers s&apos;han mogut.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation><numerusform>%1 i %n altre fitxer tenen conflictes de sincronització</numerusform><numerusform>%1 i %n altres fitxers tenen conflictes de sincronització</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation>%1 té conflictes de sincronització. Comproveu el fitxer conflictiu!</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation><numerusform>%1 i %n altre fitxer no s&apos;han sincronitzat per errors.
Consulteu el registre per obtenir més informació.</numerusform><numerusform>%1 i %n altres fitxers no s&apos;han sincronitzat per errors.
Consulteu el registre per obtenir més informació.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 no s&apos;ha pogut sincronitzar degut a un error. Mireu el registre per més detalls.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Activitat de sincronització</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>No s&apos;ha pogut llegir el fitxer d&apos;exclusió del sistema</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation>S&apos;ha afegit una carpeta de més de %1 MB: %2.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation>S&apos;ha afegit una carpeta d&apos;una font d&apos;emmagatzematge extern.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -773,46 +844,46 @@ If you decide to delete the files, they will be unavailable to you, unless you a
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Esborra tots els fitxers?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Esborra tots els fitxers</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Mantén els fitxers</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>Copia de seguretat detectada</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>Sincronització normal</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>Manté els fitxers locals com a conflicte</translation>
</message>
@@ -820,115 +891,105 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>No es pot restablir l&apos;estat de la carpeta</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>S&apos;ha trobat un diari de sincronització antic &apos;%1&apos;, però no s&apos;ha pogut eliminar. Assegureu-vos que no hi ha cap aplicació que actualment en faci ús.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation>(copia de seguretat)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation>(copia de seguretat %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Estat indefinit.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>S&apos;està esperant per començar a sincronitzar.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>S&apos;està preparant per la sincronització.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>S&apos;està sincronitzant.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>La darrera sincronització va ser correcta.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>La última sincronització ha estat un èxit, però amb avisos en fitxers individuals.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>La darrera sincronització va ser correcta.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Error de configuració.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Cancel·la usuari.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>La sincronització està en pausa.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Sync està pausat)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>No s&apos;ha seleccionat cap directori vàlid!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>La ruta seleccionada no és un directori!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>No teniu permisos per escriure en la carpeta seleccionada!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -938,7 +999,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Afegeix connexions de carpetes sincronitzades</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>S&apos;està sincronitzant amb les carpetes locals</translation>
</message>
@@ -973,7 +1034,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Error en carregar la llista de carpetes del servidor.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>S&apos;ha desconnectat</translation>
</message>
@@ -988,115 +1049,133 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>S&apos;està comprovant els canvis a &apos;%1&apos;</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>S&apos;està sincronitzant %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>descarrega %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>pujada %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 de %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%5 pendent, %1 de %2, fitxer %3 de %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 de %2, fitxer %3 de %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>fitxer %1 de %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>S&apos;està esperant...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>S&apos;està esperant %n altra carpeta...</numerusform><numerusform>S&apos;està esperant %n altres carpetes</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>S&apos;està preparant per sincronitzar...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>Afegeix connexions de carpetes sincronitzades</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>Afegir una connexió de sincronització</translation>
</message>
@@ -1104,17 +1183,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Feu clic per seleccionar un directori local per sincronitzar.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Introduïu la ruta del directori local.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Seleccioneu la carpeta font</translation>
</message>
@@ -1122,60 +1201,68 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Crea una carpeta remota</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>Introduïu el nom de la carpeta nova que es crearà a sota &apos;%1&apos;:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>La carpeta s&apos;ha creat correctament a %1.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>Autentificació fallida en accedir %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>No s&apos;ha pogut crear el directori en %1. Si us plau, comproveu-lo manualment.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>Ha fallat en llistar una carpeta. Error: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Escolliu-ho per sincronitzar el compte sencer</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Ja s&apos;està sincronitzant aquest directori.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Ja esteu sincronitzant &lt;i&gt;%1&lt;/i&gt;, que és una carpeta dins de &lt;i&gt;%2&lt;/i&gt;.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Atenció:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Atenció:&lt;/b&gt;</translation>
</message>
@@ -1183,22 +1270,22 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>No s&apos;ha rebut cap E-Tag del servidor, comproveu el Proxy/Gateway</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>Hem rebut un E-Tag diferent en la represa. Es comprovarà la pròxima vegada.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>El servidor retorna un error de contingut o rang</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Temps de connexió excedit</translation>
</message>
@@ -1221,23 +1308,38 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Per la safata del sistema</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Avançat</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation>Demana la confirmació abans de sincronitzar carpetes més grans de</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation>Demana la confirmació abans de sincronitzar fonts d&apos;emmagatzematge externes</translation>
</message>
@@ -1257,31 +1359,67 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Usa icones en &amp;monocrom</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>Editeu els fitxers &amp;ignorats</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>Mostra l&apos;informe de &amp;fallades</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>Quant a</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>Actualitzacions</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>&amp;Reiniciar &amp;&amp; Actualitzar</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Cancel·lar</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1349,7 +1487,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Elimina</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1358,27 +1496,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
Els elements que poden ser eliminats s&apos;eliminaran si impedeixen que una carpeta sigui eliminada. Això és útil per les metadades.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>No s&apos;ha pogut obrir el fitxer</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>No es poden desar els canvis a &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Afegeix una plantilla per ignorar</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Afegeix una nova plantilla d&apos;ignorats:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Això es proporciona completament pel sistema a &apos;%1&apos; i no es pot modificar en aquesta vista.</translation>
</message>
@@ -1408,50 +1546,60 @@ Els elements que poden ser eliminats s&apos;eliminaran si impedeixen que una car
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Carpeta</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="73"/>
<source>Show warnings</source>
- <translation type="unfinished"/>
+ <translation>Mostra avisos</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="83"/>
<source>Show ignored files</source>
- <translation type="unfinished"/>
+ <translation>Mostra arxius descartats</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Copiar</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Hora</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Fitxer</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1477,36 +1625,48 @@ Els elements que poden ser eliminats s&apos;eliminaran si impedeixen que una car
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Neteja</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Neteja l&apos;inici de sessió.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>Des&amp;a</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Desa el fitxer de registre al disc per depuració</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Desa el fitxer de registre</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>No es pot escriure al fitxer de registre %1</translation>
</message>
@@ -1514,12 +1674,12 @@ Els elements que poden ser eliminats s&apos;eliminaran si impedeixen que una car
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;El fitxer &apos;%1&apos;&lt;br/&gt;no es pot obrir en mode escriptura.&lt;br/&gt;&lt;br/&gt;La sortida del registre &lt;b&gt;no&lt;/b&gt; es pot desar!&lt;/nobr&gt;</translation>
</message>
@@ -1527,27 +1687,27 @@ Els elements que poden ser eliminats s&apos;eliminaran si impedeixen que una car
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Versió nova disponible</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;Hi ha una nova versió del client %1 disponible.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; està disponible per a la baixada. La versió instal·lada és la %3.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Omet aquesta versió</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Omet aquesta vegada</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Obtingueu l&apos;actualització</translation>
</message>
@@ -1635,27 +1795,27 @@ Els elements que poden ser eliminats s&apos;eliminaran si impedeixen que una car
<translation>Limita automàticament</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Equip remot del servidor proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Nom d&apos;usuari del servidor proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Contrasenya del servidor proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>proxy HTTP(S)</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>proxy SOCKS5</translation>
</message>
@@ -1663,23 +1823,23 @@ Els elements que poden ser eliminats s&apos;eliminaran si impedeixen que una car
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>Creat el %1</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>Es tancarà en pocs segons...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation>La petició %1 ha fallat a %2</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation>S&apos;ha seleccionat &apos;%1&apos; a %2</translation>
@@ -1688,32 +1848,32 @@ Els elements que poden ser eliminats s&apos;eliminaran si impedeixen que una car
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -1721,59 +1881,59 @@ Els elements que poden ser eliminats s&apos;eliminaran si impedeixen que una car
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Nova actualització de %1 preparada</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>S&apos;instal·lara un nova actualització per %1. L&apos;actualitzador pot demanar
privilegis addicionals durant el procés.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>Descarregat la versió %1. Espeu si us play...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>No s&apos;ha pogut decarregar l&apos;actualització. Si us plau, cliqueu &lt;a href=&apos;%1&apos;&gt;aqui&lt;/a&gt;per descarregar l&apos;actualització manualment.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>No s&apos;ha pogut comprovar si hi ha actualitzacions.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>Versió %2 de %1 disponible. Reinicieu l&apos;aplicació per començar l&apos;actualització.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>Nova versió %1 de %2 disponible. Utilitzeu l&apos;eina d&apos;actualització del sistema per instal·lar-la.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Comprovació d&apos;actualitzacions al servidor</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>Es desconeix l&apos;estat de les actualitzacions: no s&apos;ha comprovat si hi ha actualitzacions noves.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>No hi ha actualitzacions disponibles. La instal·lació ja es troba en la versió més recent.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Comprova les actualitzacions</translation>
</message>
@@ -1781,43 +1941,43 @@ privilegis addicionals durant el procés.</translation>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Connecta a %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Estableix les opcions de carpeta local</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Connecta...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1 carpeta &apos;%2&apos; està sincronitzat amb la carpeta local &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>Sincronitzar el directori &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Atenció:&lt;/strong&gt; La carpeta local no està buida. Trieu una resolució!&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Fitxer local de sincronització</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1876,15 +2036,20 @@ privilegis addicionals durant el procés.</translation>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Connecta a %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation>Copiar al portadocuments</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1915,153 +2080,163 @@ No és aconsellada usar-la.</translation>
<source>&amp;Next &gt;</source>
<translation>&amp;Següent &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>URL incorrecte</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;S&apos;ha connectat correctament amb %1: %2 versió %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Ha fallat la connexió amb %1 a %2:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>S&apos;ha esgotat el temps d&apos;espera mentres es conectava a %1 a les %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Intentant connectar amb %1 a %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>El servidor ha prohibit l&apos;accés. Per verificar que teniu permisos, &lt;a href=&quot;%1&quot;&gt;cliqueu aquí&lt;/a&gt; per accedir al servei amb el vostre navegador.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>URL incorrecte</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>La carpeta local %1 ja existeix, s&apos;està configurant per sincronitzar.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>S&apos;està creant la carpeta de sincronització local %1...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>correcte</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>ha fallat.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>No s&apos;ha pogut crear la carpeta local %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>No heu especificat cap carpeta remota!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Error: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>creant la carpeta a ownCloud: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>La carpeta remota %1 s&apos;ha creat correctament.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>La carpeta remota %1 ja existeix. S&apos;hi està connectant per sincronitzar-les.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>La creació de la carpeta ha resultat en el codi d&apos;error HTTP %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>Ha fallat la creació de la carpeta perquè les credencials proporcionades són incorrectes!&lt;br/&gt;Aneu enrera i comproveu les credencials.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;La creació de la carpeta remota ha fallat, probablement perquè les credencials facilitades són incorrectes.&lt;/font&gt;&lt;br/&gt;Comproveu les vostres credencials.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>La creació de la carpeta remota %1 ha fallat amb l&apos;error &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>S&apos;ha establert una connexió de sincronització des de %1 a la carpeta remota %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Connectat amb èxit a %1!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>No s&apos;ha pogut establir la connexió amb %1. Comproveu-ho de nou.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Ha fallat en canviar el nom de la carpeta</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>No es pot esborrar i restaurar la carpeta perquè una carpeta o un fitxer de dins està obert en un altre programa. Tanqueu la carpeta o el fitxer i intenteu-ho de nou o cancel·leu la configuració.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;la carpeta de sincronització %1 s&apos;ha creat correctament!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2069,14 +2244,31 @@ No és aconsellada usar-la.</translation>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>Assistent de connexió %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Salta la configuració de carpetes</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2100,7 +2292,7 @@ No és aconsellada usar-la.</translation>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation type="unfinished"/>
</message>
@@ -2108,7 +2300,7 @@ No és aconsellada usar-la.</translation>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>Error en escriure les metadades a la base de dades</translation>
</message>
@@ -2116,47 +2308,47 @@ No és aconsellada usar-la.</translation>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>El fitxer %1 no es pot baixar perquè hi ha un xoc amb el nom d&apos;un fitxer local!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>L&apos;espai lliure del disc dur es inferior a %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>El fitxer s&apos;ha esborrat del servidor</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>No es pot descarregar el fitxer completament.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>El fitxer ha canviat des de que es va descobrir</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>Error en escriure les metadades a la base de dades</translation>
</message>
@@ -2164,12 +2356,12 @@ No és aconsellada usar-la.</translation>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; Ha fallat la restauració: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation type="unfinished"/>
</message>
@@ -2177,22 +2369,22 @@ No és aconsellada usar-la.</translation>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>no s&apos;ha pogut esborrar el fitxer %1, error: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>Atenció, possible xoc entre majúscules i minúscules amb %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>no s&apos;ha pogut crear la carpeta %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>Error en escriure les metadades a la base de dades</translation>
</message>
@@ -2200,17 +2392,17 @@ No és aconsellada usar-la.</translation>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>Error en eliminar &apos;%1&apos;: %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>No s&apos;ha pogut eliminar la carpeta &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>No es pot eliminar %1 perquè hi ha un xoc amb el nom d&apos;un fitxer local</translation>
</message>
@@ -2218,13 +2410,13 @@ No és aconsellada usar-la.</translation>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>El fitxer %1 no es pot reanomenar a %2 perquè hi ha un xoc amb el nom d&apos;un fitxer local</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>Error en escriure les metadades a la base de dades</translation>
</message>
@@ -2232,12 +2424,7 @@ No és aconsellada usar-la.</translation>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>El fitxer s&apos;ha eliminat d&apos;una compartició només de lectura. S&apos;ha restaurat.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation type="unfinished"/>
</message>
@@ -2245,12 +2432,12 @@ No és aconsellada usar-la.</translation>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>Error en escriure les metadades a la base de dades</translation>
</message>
@@ -2258,28 +2445,13 @@ No és aconsellada usar-la.</translation>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>No s&apos;ha de canviar el nom d&apos;aquesta carpeta. Es reanomena de nou amb el seu nom original.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Aquesta carpeta no es pot reanomenar. Reanomeneu-la de nou Shared.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>El fitxer s&apos;ha reanomenat però és part d&apos;una compartició només de lectura. El fixter original s&apos;ha restaurat.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>Error en escriure les metadades a la base de dades</translation>
</message>
@@ -2287,33 +2459,33 @@ No és aconsellada usar-la.</translation>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Fitxer eliminat</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>El fitxer local ha canviat durant la sincronització.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>Error en escriure les metadades a la base de dades</translation>
</message>
@@ -2321,27 +2493,27 @@ No és aconsellada usar-la.</translation>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>El fitxer local s&apos;ha eliminat durant la sincronització.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>El fitxer local ha canviat durant la sincronització.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation type="unfinished"/>
</message>
@@ -2349,27 +2521,22 @@ No és aconsellada usar-la.</translation>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>El fitxer s&apos;ha editat localment però és part d&apos;una compartició només de lectura. S&apos;ha restaurat i la vostra edició és en el fitxer en conflicte.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>El fitxer local s&apos;ha eliminat durant la sincronització.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>El fitxer local ha canviat durant la sincronització.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation type="unfinished"/>
</message>
@@ -2387,42 +2554,47 @@ No és aconsellada usar-la.</translation>
<translation>TextLabel</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Obre al navegador</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Hora</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Fitxer</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Carpeta</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Acció</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Mida</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>Protocol de sincronització local</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Copia</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Copia la llista d&apos;activitats al porta-retalls.</translation>
</message>
@@ -2463,7 +2635,7 @@ No és aconsellada usar-la.</translation>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Trieu què sincronitzar</translation>
</message>
@@ -2471,33 +2643,33 @@ No és aconsellada usar-la.</translation>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Carregant...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Nom</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Mida</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>Actualment no hi ha subcarpetes al servidor.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation>S&apos;ha produit un error en carregar la llista de subcarpetes.</translation>
</message>
@@ -2507,7 +2679,7 @@ No és aconsellada usar-la.</translation>
<message>
<location filename="../src/gui/servernotificationhandler.cpp" line="103"/>
<source>Dismiss</source>
- <translation type="unfinished"/>
+ <translation>Ignora</translation>
</message>
</context>
<context>
@@ -2518,22 +2690,22 @@ No és aconsellada usar-la.</translation>
<translation>Arranjament</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Activitat</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>General</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Xarxa</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Compte</translation>
</message>
@@ -2541,28 +2713,28 @@ No és aconsellada usar-la.</translation>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Activitat</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>General</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Xarxa</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Compte</translation>
</message>
@@ -2590,44 +2762,44 @@ No és aconsellada usar-la.</translation>
<translation>camí de l&apos;OwnCloud:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>Compartint amb %1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Carpeta: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>El servidor no permet la compartició de fitxers</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>El fitxer no es pot compartir perquè va ser compartit sense permisos de compartició.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
- <translation type="unfinished"/>
+ <translation>Usuaris i Grups</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
- <translation type="unfinished"/>
+ <translation>Enllaços públics</translation>
</message>
</context>
<context>
@@ -2638,7 +2810,17 @@ No és aconsellada usar-la.</translation>
<translation>Comparteix DocumentNou.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>TextLabel</translation>
</message>
@@ -2650,7 +2832,7 @@ No és aconsellada usar-la.</translation>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="35"/>
<source>Enter a name to create a new public link...</source>
- <translation type="unfinished"/>
+ <translation>Escriu un nom per crear un enllaç públic...</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="42"/>
@@ -2668,115 +2850,120 @@ No és aconsellada usar-la.</translation>
<translation>Estableix la contrasenya</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation type="unfinished"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation>Descarregar / Veure</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Permetre edició</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation>Descarregar / Veure / Pujar</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
<source>Anyone with the link has access to the file/folder</source>
- <translation type="unfinished"/>
+ <translation>Qualsevol podrà accedir a l&apos;arxiu o carpeta amb aquest link</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>Protegit amb contr&amp;asenya</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Protegit amb contrasenya</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>El fitxer no es pot compartir perquè va ser compartit sense permisos de compartició.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Esborra</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
- <translation type="unfinished"/>
+ <translation>Copiar al portadocuments</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Envia l&apos;enllaç per correu electrònic</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Cancel·lar</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
- <translation type="unfinished"/>
+ <translation>Enllaç públic</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>La comp&amp;artició pública requereix una contrasenya</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Establiu la contrasenya</translation>
</message>
@@ -2799,34 +2986,34 @@ No és aconsellada usar-la.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
- <translation type="unfinished"/>
+ <translation>Copiar al portadocuments</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Envia l&apos;enllaç per correu electrònic</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>No hi ha resultats per &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
- <translation type="unfinished"/>
+ <translation>He compartit amb tu</translation>
</message>
</context>
<context>
@@ -2837,37 +3024,38 @@ No és aconsellada usar-la.</translation>
<translation>Formulari</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>TextLabel</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>pot editar</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>pot compartir</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>crea</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>canvi</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>elimina</translation>
</message>
@@ -2911,143 +3099,176 @@ No és aconsellada usar-la.</translation>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>Comparteix amb %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
- <source>I shared something with you</source>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
+ <source>I shared something with you</source>
+ <translation>He compartit amb tu</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Obre al navegador</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Detalls del certificat&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Nom comú (NC):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>Noms alternatius de concepte:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Organització (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Unitat organitzativa (UO):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Estat o província</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>País:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Serial:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Emissor&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Emissor:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Enviat el:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Expira el:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Empremtes&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;Nota:&lt;/b&gt; Aquest certificat es va aprovar manualment&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (auto-signat)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>Aquesta connexió és encriptada usant %1 bit %2.
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation>Els tiquets/identificadors de sessió SSL no estan implementats</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Informació del certificat:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>Aquesta connexió NO és segura , ja que no està xifrada.
@@ -3135,305 +3356,270 @@ No és aconsellada usar-la.</translation>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Èxit.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>CSync ha fallat en carregar el fitxer del registre de transaccions. El fitxer està corromput.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;No s&apos;ha pogut carregar el connector %1 per csync.&lt;br/&gt;Comproveu la instal·lació!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>Error fatal de paràmetre en CSync.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>El pas d&apos;actualització del processat de CSync ha fallat.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>El pas de reconciliació del processat de CSync ha fallat.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync no s&apos;ha pogut acreditar amb el proxy.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSync ha fallat en cercar el proxy o el servidor.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>L&apos;autenticació de CSync ha fallat al servidor %1.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync ha fallat en connectar-se a la xarxa.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>Temps excedit en la connexió.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>S&apos;ha produït un error en la transmissió HTTP.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>S&apos;ha produït un error en obrir una carpeta</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>Error en llegir la carpeta.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>El fitxer/carpeta s&apos;ha ignorat perquè és ocult.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: No hi ha espai disponible al servidor %1.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>Error inespecífic de CSync.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Aturat per l&apos;usuari</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>El servei no està disponible temporalment</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>Accés prohibit</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>S&apos;ha produït l&apos;error intern número %1.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>La sincronització d&apos;enllaços simbòlics no està implementada.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>El fitxer està a la llista d&apos;ignorats.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>El nom de fitxer és massa llarg.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>La codificació del nom de fitxer no és vàlida</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>Caràcters no vàlids. Reanomeneu &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>No es pot obrir el diari de sincronització</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>El nom del fitxer conté al menys un caràcter invàlid</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>S&apos;ignora degut al filtre a «Trieu què sincronitzar»</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>No es permet pujar aquest fitxer perquè només és de lectura en el servidor, es restaura</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>No es permet l&apos;eliminació, es restaura</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>Fitxers locals i carpeta compartida esborrats.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>No es permet moure&apos;l, l&apos;element es restaura</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>No es permet moure perquè %1 només és de lectura</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>el destí</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>l&apos;origen</translation>
</message>
@@ -3457,17 +3643,17 @@ No és aconsellada usar-la.</translation>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Versió %1. Per més informació visiteu &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;Distribuït per %1 i amb llicència GNU General Public License (GPL) Versió 2.0.&lt;br/&gt;%2 i el %2 logo són marques registrades de %1 als Estats Units, altres països, o ambdós.&lt;/p&gt;</translation>
</message>
@@ -3498,81 +3684,81 @@ No és aconsellada usar-la.</translation>
<translation>Acrediteu-vos</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Carpeta %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>No hi han carpetes sincronitzades configurades.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Obre al navegador</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Inicia la sessió</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Surt</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Canvis recents</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>S&apos;està comprovant els canvis a &apos;%1&apos;</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Fitxers gestionats:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Obre carpeta &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Obre %1 en el navegador</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Estat desconegut</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Arranjament...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Detalls...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Ajuda</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>Surt %1</translation>
</message>
@@ -3587,11 +3773,6 @@ No és aconsellada usar-la.</translation>
<translation>La versió del servidor no és compatible</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation>El servidor del compte %1 utilitza la versió antiga %2 antiga i no és compatible. Usar aquest client amb versions no compatibles del servidor no s&apos;ha provat i pot ser potencialment perillós. Procediu sota la vostra responsabilitat.</translation>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Desconnectat</translation>
@@ -3623,116 +3804,129 @@ No és aconsellada usar-la.</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation>Reprén totes les carpetes</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>Pausa totes les carpetes</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>Reprèn totes les sincronitzacions</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>Reprèn la sincronització</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>Pausa totes les sincronitzacions</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>Pausa la sincronització</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Surt de tots els comptes</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Connecta a tots els comptes...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>Compte nou...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>Sobre %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>No hi ha elements sincronitzats recentment</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Sincronitzant %1 de %2 (%3 pendents)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation>S&apos;està sincronitzant %1 de %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Sincronitzant %1 (%2 pendents)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>S&apos;està sincronitzant %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Actualitzat</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation type="unfinished"/>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3744,9 +3938,9 @@ No és aconsellada usar-la.</translation>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>TextLabel</translation>
</message>
@@ -3782,11 +3976,22 @@ No és aconsellada usar-la.</translation>
<translation>Demana la confirmació abans de sincronitzar fonts d&apos;emmagatzematge e&amp;xternes</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Trieu què sincronitzar</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>Carpeta &amp;local</translation>
@@ -3803,11 +4008,16 @@ No és aconsellada usar-la.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>Sincronitza-ho tot des del servidor</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Missatge d&apos;estat</translation>
</message>
@@ -3844,13 +4054,13 @@ No és aconsellada usar-la.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
+ <source>An error occurred while connecting. Please try again.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="56"/>
<source>Re-open Browser</source>
- <translation type="unfinished"/>
+ <translation>Reobrir navegador</translation>
</message>
</context>
<context>
@@ -4024,7 +4234,7 @@ No és aconsellada usar-la.</translation>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;Construït de la revisió de Git &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; el %4 de %3 usant Qt %5, %6&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4122,52 +4332,52 @@ No és aconsellada usar-la.</translation>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Estat indefinit</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Pendent d&apos;iniciar la sincronització</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>La sincronització s&apos;està executant</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Sincronització amb èxit</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Sincronització realitzada amb èxit, alguns fitxers s&apos;han ignorat.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Error de sincronització</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Error de configuració</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Preparant per sincronitzar</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Cancel·lant...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>La sincronització està pausada.</translation>
</message>
@@ -4175,22 +4385,22 @@ No és aconsellada usar-la.</translation>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
- <translation type="unfinished"/>
+ <translation>No es pot obrir el navegador</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation type="unfinished"/>
</message>
diff --git a/translations/client_cs.ts b/translations/client_cs.ts
index 50131a190..f10b59bba 100644
--- a/translations/client_cs.ts
+++ b/translations/client_cs.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="cs_CZ" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation>Adresáře v koši se nepodařilo vytvořit</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation>Nelze přesunout &quot;%1&quot; do &quot;%2&quot;</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation>Přesunutí do koše zde není implementováno</translation>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,19 +95,19 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Připojení vypršelo</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
- <translation type="unfinished"/>
+ <translation>Neznámá chyba: odpověď sítě byla smazána</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
- <translation type="unfinished"/>
+ <translation>Odpověď serveru &quot;%1 %2&quot; do &quot;%3 %4&quot;</translation>
</message>
</context>
<context>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Zrušit</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Účet</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Vybrat co sesynchronizovat</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Vynutit synchronizaci nyní</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>Restartovat synchronizaci</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>Odstranit připojení synchronizace adresáře</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Vytvoření adresáře selhalo</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;Nelze vytvořit místní adresář &lt;i&gt;%1&lt;/i&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>Potvrdit odstranění připojení synchronizace adresáře</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>Odstranit připojení synchronizace adresáře</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Synchronizace probíhá</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>Operace synchronizace právě probíhá.&lt;br/&gt;Přejete si ji ukončit?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 používaný</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 jako &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>Server verze %1 je zastaralý a nepodporovaný! Pokračujte na vlastní riziko.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Připojeno k %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>Server %1 je dočasně nedostupný.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation>server %1 je v režimu údržby.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>Odhlášeno z %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation>Připojeno k %1...</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>Bez připojení k %1 na %2.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Přihlásit</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>Tyto složky nebyly synchronizovány, protože jsou příšliš velké:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>Tyto složky nebyly synchronizovány, protože se nachází na externím úložišti:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation>Tyto složky nebyly synchronizovány, protože jsou příliš velké, nebo se nachází na externím úložišti:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Potvrdit odstranění účtu</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Opravdu chcete odstranit připojení k účtu &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Poznámka:&lt;/b&gt; Toto &lt;b&gt;neodstraní&lt;/b&gt; žádné soubory.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Odstranit připojení</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Otevřít adresář</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Odhlásit se</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Pokračovat v synchronizaci</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Pozastavit synchronizaci</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Opravdu chcete zastavit synchronizaci adresáře &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Poznámka:&lt;/b&gt; Toto &lt;b&gt;neodstraní&lt;/b&gt; žádné soubory.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>Používaných %1 (%3%) z %2. Některé adresáře včetně připojených síťových nebo sdílených adresářů mohou mít odlišné limity.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>Používaných %1 z %2</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Momentálně nejsou k dispozici žádné informace o využití úložiště.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>Žádné spojení s %1 nenastaveno.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Odhlášeno</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Odpojeno</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Připojeno</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Služba nedostupná</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation>režim údržby</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Chyba sítě</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Chyba konfigurace</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
- <translation type="unfinished"/>
+ <translation>Požádat o pověření</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Neznámý stav účtu</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Aktivita serveru</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Protokol synchronizace</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>Nesesynchronizováno</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>Nesesynchronizováno (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>Výpis aktivity serveru byl zkopírován do schránky.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>Výpis aktivity synchronizace byl zkopírován do schránky.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>Seznam nesynchronizovaných položek byl zkopírován do schránky.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Zkopírováno do schránky</translation>
</message>
@@ -469,47 +488,47 @@
<translation>Textový popisek</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Aktivity serveru</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Kopie</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Kopírovat záznam aktivity do schránky.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Vyžadována akce: Upozornění</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;Účet %1 nemá zapnuté aktivity.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
- <translation><numerusform>Dostali jste %n nové upozornění od %2.</numerusform><numerusform>Dostali jste %n nové upozornění od %2.</numerusform><numerusform>Dostali jste %n nových upozornění od %2.</numerusform></translation>
+ <translation><numerusform>Dostali jste %n nové upozornění od %2.</numerusform><numerusform>Dostali jste %n nové upozornění od %2.</numerusform><numerusform>Dostali jste %n nových upozornění od %2.</numerusform><numerusform>Dostali jste %n nových upozornění od %2.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
- <translation><numerusform>Dostali jste %n nové upozornění od %1 a %2.</numerusform><numerusform>Dostali jste %n nové upozornění od %1 a %2.</numerusform><numerusform>Dostali jste %n nových upozornění od %1 a %2.</numerusform></translation>
+ <translation><numerusform>Dostali jste %n nové upozornění od %1 a %2.</numerusform><numerusform>Dostali jste %n nové upozornění od %1 a %2.</numerusform><numerusform>Dostali jste %n nových upozornění od %1 a %2.</numerusform><numerusform>Dostali jste %n nových upozornění od %1 a %2.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>Dostali jste nové upozornění od %1, %2 a dalších uživatelů.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>%1 Upozornění - Vyžadována akce</translation>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Ukončit</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Pokračovat</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation>Chyba přístupu ke konfiguračnímu souboru</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation>Došlo k chybě při přístupu ke konfigurační soubor %1.</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>Ukončit ownCloud</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>Chyba zápisu metadat do databáze</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>Žádný účet ownCloud nenastaven</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>Server nastavený pro tohoto klienta je příliš starý</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Aktualizujte prosím na poslední verzi serveru a restartujte klienta.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Chyba ověření: Uživatelské jméno nebo heslo není správné.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>vypršel časový interval</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>Poskytnuté přihlašovací údaje nejsou správné</translation>
</message>
@@ -637,132 +681,159 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Zrušeno uživatelem</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>Místní adresář %1 neexistuje.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 by měl být adresář, ale není.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 není čitelný.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 byl odebrán.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 byl stažen.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 byl aktualizován.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 byl přejmenován na %2.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 byl přemístěn do %2.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
- <translation><numerusform>%1 soubor bude smazán.</numerusform><numerusform>%1 a %n další soubory budou smazány.</numerusform><numerusform>%1 a %n další soubory budou smazány.</numerusform></translation>
+ <translation><numerusform>%1 soubor bude smazán.</numerusform><numerusform>%1 a %n další soubory budou smazány.</numerusform><numerusform>%1 a %n další soubory budou smazány.</numerusform><numerusform>%1 a %n další soubory budou smazány.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
- <translation><numerusform>%1 soubor byl stažen.</numerusform><numerusform>%1 a %n další soubory byly staženy.</numerusform><numerusform>%1 a %n další soubory byly staženy.</numerusform></translation>
+ <translation><numerusform>%1 soubor byl stažen.</numerusform><numerusform>%1 a %n další soubory byly staženy.</numerusform><numerusform>%1 a %n další soubory byly staženy.</numerusform><numerusform>%1 a %n další soubory byly staženy.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
- <translation><numerusform>%1 soubor byl aktualizován.</numerusform><numerusform>%1 a %n další soubory byly aktualizovány.</numerusform><numerusform>%1 a %n další soubory byly aktualizovány.</numerusform></translation>
+ <translation><numerusform>%1 soubor byl aktualizován.</numerusform><numerusform>%1 a %n další soubory byly aktualizovány.</numerusform><numerusform>%1 a %n další soubory byly aktualizovány.</numerusform><numerusform>%1 a %n další soubory byly aktualizovány.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
- <translation><numerusform>%1 byl přejmenován na %2.</numerusform><numerusform>%1 byl přejmenován na %2 a %n další soubory byly přejmenovány.</numerusform><numerusform>%1 byl přejmenován na %2 a %n další soubory byly přejmenovány.</numerusform></translation>
+ <translation><numerusform>%1 byl přejmenován na %2.</numerusform><numerusform>%1 byl přejmenován na %2 a %n další soubory byly přejmenovány.</numerusform><numerusform>%1 byl přejmenován na %2 a %n další soubory byly přejmenovány.</numerusform><numerusform>%1 byl přejmenován na %2 a %n další soubory byly přejmenovány.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
- <translation><numerusform>%1 byl přesunut do %2.</numerusform><numerusform>%1 byl přesunut do %2 a %n dalších souborů bylo přesunuto.</numerusform><numerusform>%1 byl přesunut do %2 a %n dalších souborů bylo přesunuto.</numerusform></translation>
+ <translation><numerusform>%1 byl přesunut do %2.</numerusform><numerusform>%1 byl přesunut do %2 a %n dalších souborů bylo přesunuto.</numerusform><numerusform>%1 byl přesunut do %2 a %n dalších souborů bylo přesunuto.</numerusform><numerusform>%1 byl přesunut do %2 a %n dalších souborů bylo přesunuto.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
- <translation><numerusform>%1 má problém se synchronizací.</numerusform><numerusform>%1 a %n dalších souborů má problém se synchronizací.</numerusform><numerusform>%1 a %n dalších souborů má problém se synchronizací.</numerusform></translation>
+ <translation><numerusform>%1 má problém se synchronizací.</numerusform><numerusform>%1 a %n dalších souborů má problém se synchronizací.</numerusform><numerusform>%1 a %n dalších souborů má problém se synchronizací.</numerusform><numerusform>%1 a %n dalších souborů má problém se synchronizací.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation>%1 má problém se synchronizací. Prosím zkontrolujte chybový soubor.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
- <translation><numerusform>%1 soubor nemůže být synchronizován kvůli chybám. Shlédněte log pro detaily.</numerusform><numerusform>%1 a %n dalších souborů nemohou být synchronizovány kvůli chybám. Shlédněte log pro detaily.</numerusform><numerusform>%1 a %n dalších souborů nemohou být synchronizovány kvůli chybám. Shlédněte log pro detaily.</numerusform></translation>
+ <translation><numerusform>%1 soubor nemůže být synchronizován kvůli chybám. Shlédněte log pro detaily.</numerusform><numerusform>%1 a %n dalších souborů nemohou být synchronizovány kvůli chybám. Shlédněte log pro detaily.</numerusform><numerusform>%1 a %n dalších souborů nemohou být synchronizovány kvůli chybám. Shlédněte log pro detaily.</numerusform><numerusform>%1 a %n dalších souborů nemohou být synchronizovány kvůli chybám. Shlédněte log pro detaily.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 nebyl kvůli chybě synchronizován. Detaily jsou k nalezení v logu.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Průběh synchronizace</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>Nezdařilo se přečtení systémového exclude souboru</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation>Nová složka větší než %1 MB byla přidána: %2.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation>Byla přidána složka z externího úložiště.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation>Pokud to chcete stáhnout, běžte do nastavení a vyberte to.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -772,7 +843,7 @@ Tyto soubory budou smazány i ve vaší místní synchronizované složce a nebu
Rozhodnete-li se soubory smazat, budou vám nedostupné, nejste-li jejich vlastníkem.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
@@ -781,22 +852,22 @@ Jste si jisti, že chcete tyto akce synchronizovat se serverem?
Pokud to byl omyl a chcete si soubory ponechat, budou opět synchronizovány ze serveru.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Odstranit všechny soubory?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Odstranit všechny soubory</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Ponechat soubory</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
@@ -805,17 +876,17 @@ Toto může být způsobeno obnovením zálohy na straně serveru.
Pokračováním v synchronizaci způsobí přepsání všech vašich souborů staršími soubory z dřívějšího stavu. Přejete si ponechat své místní nejaktuálnější soubory jako konfliktní soubory?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>Záloha nalezena</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>Normální synchronizace</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>Ponechat místní soubory jako konflikt</translation>
</message>
@@ -823,115 +894,105 @@ Pokračováním v synchronizaci způsobí přepsání všech vašich souborů st
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>Nelze obnovit stav adresáře</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>Byl nalezen starý záznam synchronizace &apos;%1&apos;, ale nebylo možné jej odebrat. Ujistěte se, že není aktuálně používán jinou aplikací.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation> (záloha)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation> (záloha %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Nedefinovaný stav.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>Čeká na spuštění synchronizace.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Příprava na synchronizaci.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>Synchronizace probíhá.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>Poslední synchronizace byla úspěšná.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation>Synchronizace byla úspěšně dokončena, nevyřešené konflikty</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>Poslední synchronizace byla úspěšná, ale s varováním u některých souborů</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>Poslední synchronizace byla úspěšná.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Chyba nastavení.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Zrušení uživatelem.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>Synchronizace pozastavena.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Synchronizace je pozastavena)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>Nebyl vybrán platný adresář!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>Vybraná cesta nevede do adresáře!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Nemáte oprávnění pro zápis do zvoleného adresáře!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation>Místní složka %1 obsahuje symbolický odkaz. Cílový odkaz obsahuje již synchronizované složky. Vyberte si prosím jinou!</translation>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation>Ze serveru se do tohoto umístění již synchronizuje. Prosím zvolte jinou místní složku!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Místní adresář %1 již obsahuje podadresář použitý pro synchronizaci odesílání. Zvolte prosím jiný!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Místní adresář %1 je již obsažen ve adresáři použitém pro synchronizaci. Vyberte prosím jiný!</translation>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation>Místní adresář %1 je symbolickým obsahem. Cíl odkazu je již obsažen v adresáři použitém pro synchronizaci. Vyberte prosím jiný!</translation>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -941,7 +1002,7 @@ Pokračováním v synchronizaci způsobí přepsání všech vašich souborů st
<translation>Přidat synchronizaci adresáře</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>Synchronizace s místním adresářem</translation>
</message>
@@ -976,7 +1037,7 @@ Pokračováním v synchronizaci způsobí přepsání všech vašich souborů st
<translation>Chyba při načítání seznamu adresářů ze serveru.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Odhlášeno</translation>
</message>
@@ -988,118 +1049,136 @@ Pokračováním v synchronizaci způsobí přepsání všech vašich souborů st
<message>
<location filename="../src/gui/folderstatusmodel.cpp" line="209"/>
<source>There are unresolved conflicts. Click for details.</source>
+ <translation>Jsou zde nevyřešené konflikty. Klikněte pro detaily.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Kontrola změn v &apos;%1&apos;</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>Synchronizuji %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>stahování %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>nahrávání %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 ze %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%5 zbývá, %1 ze %2, soubor %3 z %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 z %2, soubor %3 z %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>soubor %1 z %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>Chvíli strpení...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
- <translation><numerusform>Čeká se na %n další adresář...</numerusform><numerusform>Čeká se na %n další adresáře...</numerusform><numerusform>Čeká se na %n dalších adresářů...</numerusform></translation>
+ <translation><numerusform>Čeká se na %n další adresář...</numerusform><numerusform>Čeká se na %n další adresáře...</numerusform><numerusform>Čeká se na %n dalších adresářů...</numerusform><numerusform>Čeká se na %n dalších adresářů...</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>Synchronizace se připravuje...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>Přidat synchronizaci adresáře</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>Přidat synchronizační připojení</translation>
</message>
@@ -1107,17 +1186,17 @@ Pokračováním v synchronizaci způsobí přepsání všech vašich souborů st
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Kliknutím zvolíte místní adresář k synchronizaci.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Zadejte cestu k místnímu adresáři.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Zvolte zdrojový adresář</translation>
</message>
@@ -1125,60 +1204,68 @@ Pokračováním v synchronizaci způsobí přepsání všech vašich souborů st
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Vytvořit vzdálený adresář</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>Zadejte název nově vytvářeného adresáře níže &apos;%1&apos;:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>Adresář byl úspěšně vytvořen na %1.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>Ověření selhalo při připojení %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>Na %1 selhalo vytvoření adresáře. Zkontrolujte to prosím ručně.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>Chyba při vypsání adresáře. Chyba: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Zvolte toto k provedení synchronizace celého účtu</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Tento adresář je již synchronizován.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Již synchronizujete adresář &lt;i&gt;%1&lt;/i&gt;, který je adresáři &lt;i&gt;%2&lt;/i&gt; nadřazený.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Varování:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Varování:&lt;/b&gt;</translation>
</message>
@@ -1186,22 +1273,22 @@ Pokračováním v synchronizaci způsobí přepsání všech vašich souborů st
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>Ze serveru nebyl obdržen E-Tag, zkontrolujte proxy/bránu</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>Obdrželi jsme jiný E-Tag pro pokračování. Zkusím znovu příště.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>Server odpověděl chybným rozsahem obsahu</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Čas spojení vypršel</translation>
</message>
@@ -1224,23 +1311,38 @@ Pokračováním v synchronizaci způsobí přepsání všech vašich souborů st
<translation>Pro systémovou lištu</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Pokročilé</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation>Zeptat se před synchronizací složek větších než</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation>Zeptat se na potvrzení před synchronizací externích úlošišť</translation>
</message>
@@ -1260,31 +1362,67 @@ Pokračováním v synchronizaci způsobí přepsání všech vašich souborů st
<translation>Používat čer&amp;nobílé ikony</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>Upravit &amp;ignorované soubory</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>Z&amp;obrazit hlášení o pádech</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>O aplikaci</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>Aktualizace</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>&amp;Restart &amp;&amp; aktualizace</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Zrušit</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation>Chyba sdílení</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1352,7 +1490,7 @@ Pokračováním v synchronizaci způsobí přepsání všech vašich souborů st
<translation>Odebrat</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1361,27 +1499,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
Položky u kterých je povoleno smazání budou vymazány, pokud by bránily odstranění adresáře. Toto je užitečné pro metadata.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Nepodařilo se otevřít soubor</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>Nelze zapsat změny do &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Přidat masku ignorovaných</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Přidat novou masku ignorovaných souborů:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Tato položka je poskytnuta systémem na &apos;%1&apos; a nemůže být v tomto pohledu změněna.</translation>
</message>
@@ -1396,7 +1534,7 @@ Položky u kterých je povoleno smazání budou vymazány, pokud by bránily ods
<message>
<location filename="../src/gui/issueswidget.ui" line="20"/>
<source>List of issues</source>
- <translation type="unfinished"/>
+ <translation>Seznam problémů</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="34"/>
@@ -1411,7 +1549,7 @@ Položky u kterých je povoleno smazání budou vymazány, pokud by bránily ods
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Adresář</translation>
</message>
@@ -1426,35 +1564,45 @@ Položky u kterých je povoleno smazání budou vymazány, pokud by bránily ods
<translation>Ukázat ignorované soubory</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
- <source>Copy the issues list to the clipboard.</source>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
+ <source>Copy the issues list to the clipboard.</source>
+ <translation>Zkopírovat seznam problémů do schránky</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Kopie</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Čas</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Soubor</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation>Problém</translation>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1480,36 +1628,48 @@ Položky u kterých je povoleno smazání budou vymazány, pokud by bránily ods
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Vyčistit</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Vyčistit výpis logu.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>&amp;Uložit</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Uložit soubor záznamu na disk pro ladění.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Uložit log</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Chyba</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>Nelze zapisovat do souboru logu %1</translation>
</message>
@@ -1517,12 +1677,12 @@ Položky u kterých je povoleno smazání budou vymazány, pokud by bránily ods
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Chyba</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;Soubor &apos;%1&apos;&lt;br/&gt;nelze otevřít pro zápis.&lt;br/&gt;&lt;br/&gt;Výstup záznamu &lt;b&gt;nelze&lt;/b&gt; uložit.&lt;/nobr&gt;</translation>
</message>
@@ -1530,27 +1690,27 @@ Položky u kterých je povoleno smazání budou vymazány, pokud by bránily ods
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Je dostupná nová verze</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;Je k dispozici nová verze klienta %1.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; je k dispozici ke stažení. Momentálně je nainstalována verze %3.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Přeskoč tuto verzi</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Tentokrát přeskočit</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Získat aktualizaci</translation>
</message>
@@ -1638,27 +1798,27 @@ Položky u kterých je povoleno smazání budou vymazány, pokud by bránily ods
<translation>Omezovat automaticky</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Adresa proxy serveru</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Uživatelské jméno pro proxy server</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Heslo pro proxy server</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>HTTP(S) proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>SOCKS5 proxy</translation>
</message>
@@ -1666,23 +1826,23 @@ Položky u kterých je povoleno smazání budou vymazány, pokud by bránily ods
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>Vytvořen v %1</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>Uzavření za několik sekund...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation>%1 požadavek selhal při %2</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation>&apos;%1&apos; vybrán na %2</translation>
@@ -1691,32 +1851,32 @@ Položky u kterých je povoleno smazání budou vymazány, pokud by bránily ods
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
- <translation type="unfinished"/>
+ <translation>Odpověď serveru neobsahovala všechna očekávaná pole</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -1724,59 +1884,59 @@ Položky u kterých je povoleno smazání budou vymazány, pokud by bránily ods
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Je připravena nová aktualizace %1</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>Bude instalována nová aktualizace pro %1. V průběhu aktualizace
můžete být požádáni o dodatečná oprávnění.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>Stahuji verzi %1. Počkejte prosím ...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>Nemohu stáhnout aktualizaci. Klikněte prosím na &lt;a href=&apos;%1&apos;&gt;tento odkaz&lt;/a&gt; pro ruční stažení aktualizace.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Nemohu zkontrolovat aktualizace.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>Je dostupná %1 verze %2. Restartujte aplikaci pro spuštění aktualizace.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>Je dostupná nová %1 verze %2. Pro instalaci prosím použijte systémového správce aktualizací.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Kontroluji aktualizační server...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>Stav aktualizace neznámý: Nové aktualizace nebyly zkontrolovány.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>Žádne aktualizace nejsou k dispozici. Používáte aktuální verzi.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Ověřit aktualizace</translation>
</message>
@@ -1784,43 +1944,43 @@ můžete být požádáni o dodatečná oprávnění.</translation>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Připojit k %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Možnosti nastavení místního adresáře</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Připojit...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1 adresář &apos;%2&apos; je synchronizován do místního adresáře &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>Synchronizovat adresář &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Varování:&lt;/strong&gt; Místní adresář není prázdný. Zvolte další postup!&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Místní synchronizovaný adresář</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1879,15 +2039,20 @@ můžete být požádáni o dodatečná oprávnění.</translation>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Připojit k %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation>Přihlášení v prohlížeči</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1918,153 +2083,163 @@ Nedoporučuje se jí používat.</translation>
<source>&amp;Next &gt;</source>
<translation>&amp;Následující &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>Neplatná URL</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Úspěšně připojeno k %1: %2 verze %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Selhalo spojení s %1 v %2:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>Vypršení časového limitu při pokusu o připojení k %1 na %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Pokouším se připojit k %1 na %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>Ověřený požadavek na server byl přesměrován na &apos;%1&apos;. URL je špatně, server není správně nakonfigurován.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>Byla obdržena nesprávná odpověď na ověřený webdav požadavek</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>Přístup zamítnut serverem. Pro ověření správných přístupových práv &lt;a href=&quot;%1&quot;&gt;klikněte sem&lt;/a&gt; a otevřete službu ve svém prohlížeči.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>Neplatná URL</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>Místní synchronizovaný adresář %1 již existuje, nastavuji jej pro synchronizaci.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>Vytvářím místní adresář pro synchronizaci %1...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>selhalo.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>Nelze vytvořit místní adresář %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>Není nastaven žádný vzdálený adresář!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Chyba: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>vytvářím adresář na ownCloudu: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>Vzdálený adresář %1 byl úspěšně vytvořen.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>Vzdálený adresář %1 již existuje. Spojuji jej pro synchronizaci.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>Vytvoření adresáře selhalo s HTTP chybou %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>Vytvoření vzdáleného adresáře selhalo, pravděpodobně z důvodu neplatných přihlašovacích údajů.&lt;br/&gt;Vraťte se prosím zpět a zkontrolujte je.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Vytvoření vzdáleného adresáře selhalo, pravděpodobně z důvodu neplatných přihlašovacích údajů.&lt;/font&gt;&lt;br/&gt;Vraťte se prosím zpět a zkontrolujte je.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>Vytváření vzdáleného adresáře %1 selhalo s chybou &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>Bylo nastaveno synchronizované spojení z %1 do vzdáleného adresáře %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Úspěšně spojeno s %1.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>Spojení s %1 nelze navázat. Prosím zkuste to znovu.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Přejmenování adresáře selhalo</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>Nelze odstranit a zazálohovat adresář, protože adresář nebo soubor v něm je otevřen v jiném programu. Prosím zavřete adresář nebo soubor a zkuste znovu nebo zrušte akci.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Místní synchronizovaný adresář %1 byl úspěšně vytvořen!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2072,14 +2247,31 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>%1 Průvodce spojením</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Přeskočit konfiguraci adresářů</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2103,7 +2295,7 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>Neplatná JSON odpověď z adresy URL</translation>
</message>
@@ -2111,7 +2303,7 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>Chyba zápisu metadat do databáze</translation>
</message>
@@ -2119,47 +2311,47 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>Soubor %1 nemohl být stažen z důvodu kolize názvu se souborem v místním systému!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>Volné místo na disku je méně než %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>Soubor byl smazán ze serveru</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>Soubor nemohl být kompletně stažen.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation>Stažený soubor je prázdný, přestože server oznámil, že měl být %1.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>Soubor %1 nemohl být uložen z důvodu kolize názvu se souborem v místním systému!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>Soubor se mezitím změnil</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>Chyba zápisu metadat do databáze</translation>
</message>
@@ -2167,12 +2359,12 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; Obnovení selhalo: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation>Soubor nebo adresář by odebrán ze sdílení pouze pro čtení, ale jeho obnovení selhalo: %1</translation>
</message>
@@ -2180,22 +2372,22 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>smazání souboru %1 se nezdařilo, chyba: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>Pozor, možná kolize z důvodu velikosti písmen s %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>nepodařilo se vytvořit adresář %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>Chyba zápisu metadat do databáze</translation>
</message>
@@ -2203,17 +2395,17 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>Chyba při odstraňování &apos;%1&apos;: %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>Nezdařilo se odstranění adresáře &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>Nelze odstranit %1 z důvodu kolize názvu se souborem v místním systému</translation>
</message>
@@ -2221,13 +2413,13 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>Soubor %1 nemohl být přejmenován na %2 z důvodu kolize názvu se souborem v místním systému</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>Chyba zápisu metadat do databáze</translation>
</message>
@@ -2235,12 +2427,7 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>Soubor byl odebrán ze sdílení pouze pro čtení. Soubor byl obnoven.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>Server vrátil neplatný HTTP kód. Očekáván 204, ale obdržen &quot;%1 %2&quot;.</translation>
</message>
@@ -2248,12 +2435,12 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Server vrátil neplatný HTTP kód. Očekáván 201, ale obdržen &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>Chyba zápisu metadat do databáze</translation>
</message>
@@ -2261,28 +2448,13 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Tento adresář nemůže být přejmenován. Byl mu vrácen původní název.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Tento adresář nemůže být přejmenován. Přejmenujte jej prosím zpět na Shared.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>Soubor byl přejmenován, ale je součástí sdílení pouze pro čtení. Původní soubor byl obnoven.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Server vrátil neplatný HTTP kód. Očekáván 201, ale obdržen &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>Chyba zápisu metadat do databáze</translation>
</message>
@@ -2290,33 +2462,33 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation>Soubor %1 nelze nahrát, protože existuje jiný soubor se stejným názvem, lišící se pouze velikostí písmen</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Soubor odebrán</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>Místní soubor se během synchronizace změnil. </translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>Místní soubor byl změněn během synchronizace.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>Chyba zápisu metadat do databáze</translation>
</message>
@@ -2324,27 +2496,27 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>Místní soubor byl odstraněn během synchronizace.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>Místní soubor byl změněn během synchronizace.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation>Neočekávaný návratový kód ze serveru (%1)</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation>Chybějící souborové ID ze serveru</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation>Chybějící ETag ze serveru</translation>
</message>
@@ -2352,27 +2524,22 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>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.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>Chybí adresa URL</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>Místní soubor byl odstraněn během synchronizace.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>Místní soubor byl změněn během synchronizace.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation>Server nepotvrdil poslední část dat. (Nebyl nalezen e-tag)</translation>
</message>
@@ -2390,42 +2557,47 @@ Nedoporučuje se jí používat.</translation>
<translation>Textový popisek</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Otevřít v prohlížeči</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Čas</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Soubor</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Adresář</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Akce</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Velikost</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>Místní protokol synchronizace</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Kopie</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Kopírovat záznam aktivity do schránky.</translation>
</message>
@@ -2466,7 +2638,7 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Vybrat co synchronizovat</translation>
</message>
@@ -2474,33 +2646,33 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Načítám ...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation>Zrušte výběr vzdálených složek, které nechcete synchronizovat.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Název</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Velikost</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>Na serveru nejsou momentálně žádné podadresáře.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation>Došlo k chybě v průběhu načítání seznamu podadresářů.</translation>
</message>
@@ -2521,22 +2693,22 @@ Nedoporučuje se jí používat.</translation>
<translation>Nastavení</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Aktivita</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Hlavní</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Síť</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Účet</translation>
</message>
@@ -2544,28 +2716,28 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Aktivita</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Hlavní</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Síť</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Účet</translation>
</message>
@@ -2593,42 +2765,42 @@ Nedoporučuje se jí používat.</translation>
<translation>ownCloud cesta:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>%1 sdílení</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Adresář: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>Sdílení je na serveru zakázáno</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation>Přijímání nejvyšších možných oprávnění pro sdílení ze serveru...</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Tento soubor nelze sdílet, protože byl nasdílen bez možnosti dalšího sdílení.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>Uživatelé a skupiny</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>Veřejné odkazy</translation>
</message>
@@ -2641,7 +2813,17 @@ Nedoporučuje se jí používat.</translation>
<translation>Sdílet NewDocument.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>Textový popisek</translation>
</message>
@@ -2671,19 +2853,24 @@ Nedoporučuje se jí používat.</translation>
<translation>Nastavit heslo</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>Ukázat výpis souborů</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Povolit úpravy</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2691,95 +2878,95 @@ Nedoporučuje se jí používat.</translation>
<translation>Kdokoliv, kdo má odkaz, může přistupovat k tomuto souboru/složce</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>Ch&amp;ránit heslem</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Chráněno heslem</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Tento soubor nelze sdílet, protože byl nasdílen bez možnosti dalšího sdílení.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Smazat</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation>Otevřít odkaz v prohlížeči</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Poslat odkaz emailem</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Zrušit</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation>Veřejný odkaz</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>Veřejné s&amp;dílení vyžaduje heslo</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Nastavte prosím heslo</translation>
</message>
@@ -2802,32 +2989,32 @@ Nedoporučuje se jí používat.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation>Otevřít odkaz v prohlížeči</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Poslat odkaz emailem</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>Žádné výsledky pro &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
@@ -2840,37 +3027,38 @@ Nedoporučuje se jí používat.</translation>
<translation>Formulář</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>Textový popisek</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>lze upravovat</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>může sdílet</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>vytvořit</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>změnit</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>smazat</translation>
</message>
@@ -2914,143 +3102,176 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>Sdílet s %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Otevřít v prohlížeči</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Detaily certifikátu&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Běžný název (CN):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>Alternativní jména subjektu:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Organizace (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Organizační jednotka (OU):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Stát/provincie:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>Země:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Sériové číslo:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Vydavatel&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Vydavatel:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Vydáno:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Platný do:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Otisky&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;Poznámka:&lt;/b&gt; Tento certifikát byl schválen ručně&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (podepsaný sám sebou)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>Toto spojení je šifrováno pomocí %1 bitové šifry %2
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation>Podpora tiketů/identifikátorů SSL sezení není dostupná</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Informace o certifikátu:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>Toto spojení NENÍ bezpečné, protože není šifrované.
@@ -3138,305 +3359,270 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Úspěch.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>Nezdařilo se načtení žurnálovacího souboru CSync. Žurnálovací soubor je poškozený.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;Plugin %1 pro csync nelze načíst.&lt;br/&gt;Zkontrolujte prosím instalaci!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>CSync: kritická chyba parametrů.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>CSync se nezdařilo zpracovat krok aktualizace.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>CSync se nezdařilo zpracovat krok sladění.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync se nemohlo přihlásit k proxy.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSync se nezdařilo najít proxy server nebo cílový server.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync se nezdařilo přihlásit k serveru %1.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync se nezdařilo připojit k síti.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>Došlo k vypršení časového limitu síťového spojení.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>Nastala chyba HTTP přenosu.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation>Připojený adresář je na serveru dočasně nedostupný</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>Došlo k chybě při otvírání adresáře</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>Chyba při čtení adresáře.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>Soubor/adresář je ignorován, protože je skrytý.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation>Hierarchie složek je příliš hluboká</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation>Je dostupných pouze %1, pro spuštění je potřeba alespoň %2</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation>Není povoleno, protože nemáte oprávnění vytvořit nadřazený adresář</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation>Není povoleno, protože nemáte oprávnění přidávat soubory do tohoto adresáře</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: Nedostatek volného místa na serveru %1.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>Nespecifikovaná chyba CSync.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Zrušeno uživatelem</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>Selhal přístup pro CSync</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
- <translation>CSync se nepodařilo načíst či vytvořit soubor žurnálu. Ujistěte se, že máte oprávnění pro čtení a zápis do místního adresáře synchronizace.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
- <translation>CSync selhalo z důvodu nezpracovaného zamítnutí oprávnění.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
- <translation>CSync se pokusil vytvořit adresář, který již existuje.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>Služba je dočasně nedostupná</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>Přístup je zakázán</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>Došlo k interní chybě číslo %1.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>Symbolické odkazy nejsou při synchronizaci podporovány.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>Soubor se nachází na seznamu ignorovaných.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation>Jména souborů končících tečkou nejsou na tomto systému souborů podporována.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation>Názvy souborů obsahující znak &apos;%1&apos; nejsou na tomto souborovém systému podporovány.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation>Jméno souboru je na tomto systému souborů rezervovaným jménem.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation>Jméno souboru obsahuje mezery na konci řádky.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>Jméno souboru je příliš dlouhé.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation>Nevyřešený konflikt.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>Stat selhal.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>Kódování znaků jména soubor je neplatné</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>Neplatné znaky, prosím přejmenujte &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation>Nelze načíst blacklist z místní databáze</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation>Nelze číst ze žurnálu synchronizace.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>Nelze otevřít synchronizační žurnál</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>Jméno souboru obsahuje alespoň jeden neplatný znak</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>Ignorováno podle nastavení &quot;vybrat co synchronizovat&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation>Není povoleno, protože nemáte oprávnění přidávat podadresáře do tohoto adresáře</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>Není povoleno nahrát tento soubor, protože je na serveru uložen pouze pro čtení, obnovuji</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>Odstranění není povoleno, obnovuji</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>Místní soubory a sdílený adresář byly odstraněny.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>Přesun není povolen, položka obnovena</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>Přesun není povolen, protože %1 je pouze pro čtení</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>cílové umístění</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>zdroj</translation>
</message>
@@ -3460,17 +3646,17 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Verze %1. Více informací na &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;Šíří %1 pod licencí GNU General Public License (GPL) Verze 2.0.&lt;br/&gt;%2 a %2 logo jsou registrované známky %1 ve Spojených Státech, ostatních zemích, nebo obojí.&lt;/p&gt;</translation>
</message>
@@ -3501,81 +3687,81 @@ Nedoporučuje se jí používat.</translation>
<translation>Přihlašte se prosím</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Adresář %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Nejsou nastaveny žádné adresáře pro synchronizaci.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Otevřít v prohlížeči</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Přihlásit...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Odhlásit se</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Poslední změny</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Kontrola změn v &apos;%1&apos;</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Spravované adresáře:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Otevřít adresář &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Otevřít %1 v prohlížeči</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Neznámý stav</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Nastavení...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Podrobnosti...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Nápověda</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>Ukončit %1</translation>
</message>
@@ -3590,11 +3776,6 @@ Nedoporučuje se jí používat.</translation>
<translation>Nepodporovaná verze serveru</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation>Server na účtu %1 používá starou a nepodporovanou verzi %2. Používání tohoto klienta s nepodporovanými verzemi serveru není testováno a může být nebezpečné. Pokračujte na vlastní riziko.</translation>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Odpojeno</translation>
@@ -3626,116 +3807,129 @@ Nedoporučuje se jí používat.</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
+ <translation>Synchronizace je pozastavena</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
- <translation type="unfinished"/>
+ <translation>Chyba při synchronizaci</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation>Spustit všechny adresáře</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>Pozastavit všechny adresáře</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>Spustit veškerou synchronizaci</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>Spustit synchronizaci</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>Pozastavit veškerou synchronizaci</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>Pozastavit synchronizaci</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Odhlásit ze všech účtů</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Přihlásit ke všem účtům...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>Nový účet...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>O %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>Selhání</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Žádné položky nebyly nedávno synchronizovány</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Synchronizuji %1 ze %2 (zbývá %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation>Synchronizace %1 z %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Synchronizuji %1 (zbývá %2)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>Synchronizuji %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Aktuální</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation type="unfinished"/>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3747,9 +3941,9 @@ Nedoporučuje se jí používat.</translation>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>Textový štítek</translation>
</message>
@@ -3785,11 +3979,22 @@ Nedoporučuje se jí používat.</translation>
<translation>Zeptat se na potvrzení před synchronizací e&amp;xterních úložišť</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Vybrat co sesynchronizovat</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>Místní s&amp;ložka</translation>
@@ -3806,11 +4011,16 @@ Nedoporučuje se jí používat.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>Ses&amp;ynchronizovat vše ze serveru</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Stavová zpráva</translation>
</message>
@@ -3843,17 +4053,17 @@ Nedoporučuje se jí používat.</translation>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="36"/>
<source>Please switch to your browser to proceed.</source>
- <translation type="unfinished"/>
+ <translation>Chcete-li pokračovat, přepněte prosím do svého prohlížeče.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
+ <source>An error occurred while connecting. Please try again.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="56"/>
<source>Re-open Browser</source>
- <translation type="unfinished"/>
+ <translation>Znovu otevřít prohlížeč</translation>
</message>
</context>
<context>
@@ -3919,12 +4129,12 @@ Nedoporučuje se jí používat.</translation>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="438"/>
<source>%n day(s) ago</source>
- <translation><numerusform>před %n dnem</numerusform><numerusform>před %n dny</numerusform><numerusform>před %n dny</numerusform></translation>
+ <translation><numerusform>před %n dnem</numerusform><numerusform>před %n dny</numerusform><numerusform>před %n dny</numerusform><numerusform>před %n dny</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="446"/>
<source>%n hour(s) ago</source>
- <translation><numerusform>před %n hodinou</numerusform><numerusform>před %n hodinami</numerusform><numerusform>před %n hodinami</numerusform></translation>
+ <translation><numerusform>před %n hodinou</numerusform><numerusform>před %n hodinami</numerusform><numerusform>před %n hodinami</numerusform><numerusform>před %n hodinami</numerusform></translation>
</message>
<message>
<location filename="../src/common/utility.cpp" line="451"/>
@@ -3939,7 +4149,7 @@ Nedoporučuje se jí používat.</translation>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="456"/>
<source>%n minute(s) ago</source>
- <translation><numerusform>před %n minutou</numerusform><numerusform>před %n minutami</numerusform><numerusform>před %n minutami</numerusform></translation>
+ <translation><numerusform>před %n minutou</numerusform><numerusform>před %n minutami</numerusform><numerusform>před %n minutami</numerusform><numerusform>před %n minutami</numerusform></translation>
</message>
<message>
<location filename="../src/common/utility.cpp" line="459"/>
@@ -3978,32 +4188,32 @@ Nedoporučuje se jí používat.</translation>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="310"/>
<source>%n year(s)</source>
- <translation><numerusform>%n rok</numerusform><numerusform>%n roky</numerusform><numerusform>%n let</numerusform></translation>
+ <translation><numerusform>%n rok</numerusform><numerusform>%n roky</numerusform><numerusform>%n let</numerusform><numerusform>%n let</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="311"/>
<source>%n month(s)</source>
- <translation><numerusform>%n měsíc</numerusform><numerusform>%n měsíce</numerusform><numerusform>%n měsíců</numerusform></translation>
+ <translation><numerusform>%n měsíc</numerusform><numerusform>%n měsíce</numerusform><numerusform>%n měsíců</numerusform><numerusform>%n měsíců</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="312"/>
<source>%n day(s)</source>
- <translation><numerusform>%n den</numerusform><numerusform>%n dny</numerusform><numerusform>%n dní</numerusform></translation>
+ <translation><numerusform>%n den</numerusform><numerusform>%n dny</numerusform><numerusform>%n dní</numerusform><numerusform>%n dní</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="313"/>
<source>%n hour(s)</source>
- <translation><numerusform>%n hodina</numerusform><numerusform>%n hodiny</numerusform><numerusform>%n hodin</numerusform></translation>
+ <translation><numerusform>%n hodina</numerusform><numerusform>%n hodiny</numerusform><numerusform>%n hodin</numerusform><numerusform>%n hodin</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="314"/>
<source>%n minute(s)</source>
- <translation><numerusform>%n minuta</numerusform><numerusform>%n minuty</numerusform><numerusform>%n minut</numerusform></translation>
+ <translation><numerusform>%n minuta</numerusform><numerusform>%n minuty</numerusform><numerusform>%n minut</numerusform><numerusform>%n minut</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="315"/>
<source>%n second(s)</source>
- <translation><numerusform>%n sekunda</numerusform><numerusform>%n sekundy</numerusform><numerusform>%n sekund</numerusform></translation>
+ <translation><numerusform>%n sekunda</numerusform><numerusform>%n sekundy</numerusform><numerusform>%n sekund</numerusform><numerusform>%n sekund</numerusform></translation>
</message>
<message>
<location filename="../src/common/utility.cpp" line="339"/>
@@ -4027,7 +4237,7 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;Sestaveno na Git revizi &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; na %3, %4 s použitím Qt %5, %6&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4125,52 +4335,52 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Nedefinovaný stav</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Čekám na zahájení synchronizace</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>Synchronizace běží</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Synchronizace úspěšná</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Synchronizace úspěšná, některé soubory byly ignorovány.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Chyba synchronizace</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Chyba nastavení</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Připravuji na synchronizaci</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Ruším...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>Synchronizace pozastavena</translation>
</message>
@@ -4178,22 +4388,22 @@ Nedoporučuje se jí používat.</translation>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
- <translation type="unfinished"/>
+ <translation>Nemohu otevřít prohlížeč</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation>Nelze otevřít poštovního klienta</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation>Došlo k chybě při otevírání nové zprávy v emailovém klientu. Možná nebyl nastaven výchozí emailový klient?</translation>
</message>
diff --git a/translations/client_de.ts b/translations/client_de.ts
index 6064178cd..23ca21db5 100644
--- a/translations/client_de.ts
+++ b/translations/client_de.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="de_DE" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation>Verzeichnisse können nicht im Papierkorb erstellt werden</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation>&apos;%1&apos; konnte nicht nach &apos;%2&apos; verschoben werden</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation>Das Verschieben in den Papierkorb wird auf dieser Plattform nicht unterstützt</translation>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -70,23 +89,23 @@
<message>
<location filename="../src/gui/notificationwidget.ui" line="89"/>
<source>TextLabel</source>
- <translation>TextLabel</translation>
+ <translation>Text Label</translation>
</message>
</context>
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Zeitüberschreitung bei der Verbindung</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation>Unbekannter Fehler: Netzwerk-Antwort wurde gelöscht</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation>Server hat &quot;%1 %2&quot; auf &quot;%3 %4&quot; geantwortet</translation>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Benutzerkonto</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Zu synchronisierende Elemente auswählen</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Synchronisation jetzt erzwingen </translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>Synchronisation neustarten</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>Ordner-Synchronisation entfernen</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Anlegen des Ordners fehlgeschlagen</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;Konnte lokalen Ordner &lt;i&gt;%1&lt;/i&gt; nicht anlegen.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>Bestätigen Sie die Löschung der Ordner-Synchronisation</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>Ordner-Synchronisation entfernen</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Synchronisation läuft</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>Die Synchronisation läuft gerade.&lt;br/&gt;Wollen Sie sie beenden?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 wird verwendet</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 als &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>Die Serververision %1 ist alt und nicht unterstützt! Fortfahren auf eigenes Risiko.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Verbunden mit %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>Server %1 ist derzeit nicht verfügbar.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation>Server %1 befindet sich im Wartungsmodus.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>Abgemeldet von %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation>Berechtigung vom Browser einholen. &lt;a href=&apos;%1&apos;&gt; Hier klicken &lt;/a&gt; zum nochmaligen Öffnen des Browsers.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation>Verbinde mit %1...</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>Keine Verbindung zu %1 auf %2</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Einloggen</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>Einige Verzeichnisse konnten nicht synchronisiert werden, da sie zu groß sind:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>Es gibt Verzeichnisse, die nicht synchronisiert werden konnten, da diese externe Speicher sind:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation>Es gibt Verzeichnisse, die nicht synchronisiert werden konnten, da diese zu groß oder externe Speicher sind:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Konto wirklich entfernen?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Wollen Sie wirklich die Verbindung zum Konto &lt;i&gt;%1&lt;/i&gt; lösen?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Anmerkung:&lt;/b&gt; Dieser Vorgang wird &lt;b&gt;keine&lt;/b&gt; Dateien löschen.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Verbindung entfernen</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Ordner öffnen</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Abmelden</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Synchronisation fortsetzen</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Synchronisation pausieren</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Möchten Sie den Ordner &lt;i&gt;%1&lt;/i&gt; wirklich nicht mehr synchronisieren?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Anmerkung:&lt;/b&gt; Dies wird &lt;b&gt;keine&lt;/b&gt; Dateien löschen.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1 (%3%) von %2 Serverkapazität verwendet. Einige Ordner, einschließlich über das Netzwerk verbundene oder freigegebene Ordner oder geteilte Ordner können unterschiedliche Beschränkungen aufweisen. </translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%1 von %2 Serverkapazität verwendet</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Derzeit sind keine Speichernutzungsinformationen verfügbar.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>Keine %1-Verbindung konfiguriert.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Abgemeldet</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Getrennt</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Verbunden</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Dienst nicht verfügbar</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation>Wartungsmodus</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Netzwerkfehler</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Konfigurationsfehler</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation>Zugangsdaten werden abgefragt</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Unbekannten Konto-Zustand</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Serveraktivität</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Synchronisationsprotokoll</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>nicht synchronisiert</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>nicht synchronisiert (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>Die Server-Aktivitätsliste wurde in die Zwischenablage kopiert. </translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>Die Synchronisationsliste wurde in die Zwischenablage kopiert.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>Die Liste der unsynchronisierten Dateien wurde in die Zwischenablage kopiert.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>In die Zwischenablage kopiert</translation>
</message>
@@ -469,47 +488,47 @@
<translation>TextLabel</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Server Aktivitäten</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Kopieren</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Aktivitätsliste in die Zwischenablage kopieren.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Handlung erforderlich: Benachrichtigungen</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;Für Konto %1 sind serverseitig keine Aktivitäten aktiviert.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation><numerusform>Sie haben %n neue Benachrichtigung von %2 erhalten.</numerusform><numerusform>Sie haben %n neue Benachrichtigungen von %2 erhalten.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation><numerusform>Sie haben %n neue Benachrichtigung von %1 und %2 erhalten.</numerusform><numerusform>Sie haben %n neue Benachrichtigungen von %1 und %2 erhalten.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
- <translation>Sieh haben %n neue Benachrichtigungen von %1, %2 und anderen Konten erhalten.</translation>
+ <translation>Sie haben %n neue Benachrichtigungen von %1, %2 und anderen Konten erhalten.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>%1 Benachrichtigungen - Handlung notwendig</translation>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation>Fortsetzen bedeutet &lt;b&gt;das diese Einstellungen gelöscht werden&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation>Fortsetzen bedeutet &lt;b&gt;das diese Einstellungen ignoriert werden&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation>Einige Einstellungen wurden in neueren Versionen dieses Programms eingestellt und nutzen Funktionen die in dieser Version nicht verfügbar sind. &lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt; Die aktuelle Konfigurations-Datei wurde bereits an folgenden Ort gesichert: &lt;i&gt;%2&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Beenden</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Fortsetzen</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation>Fehler beim Zugriff auf die Konfigurationsdatei</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation>Es ist ein Fehler beim Zugriff auf die Konfigurationsdatei unter %1 aufgetreten.</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>ownCloud verlassen</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>Fehler beim Schreiben der Metadaten in die Datenbank</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>Kein ownCloud-Konto konfiguriert</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>Der konfigurierte Server ist für diesen Client zu alt</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Aktualisieren Sie auf die letzte Server-Version und starten Sie den Client neu.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Authentifizierungsfehler: Entweder der Benutzername oder das Passwort sind falsch.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>Zeitüberschreitung</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>Die zur Verfügung gestellten Anmeldeinformationen sind nicht korrekt</translation>
</message>
@@ -637,133 +681,164 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Abbruch durch den Benutzer</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation>Es fehlen Daten der Server-Antwort zur Dateisuche</translation>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>Lokales Verzeichnis %1 existiert nicht.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 sollte ein Ordner sein, ist es aber nicht.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 ist nicht lesbar.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 wurde gelöscht.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 wurde heruntergeladen.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 wurde aktualisiert.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 wurde in %2 umbenannt.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 wurde in %2 verschoben.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation><numerusform>%1 und %n andere Datei wurde gelöscht.</numerusform><numerusform>%1 und %n andere Dateien wurden gelöscht.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation><numerusform>%1 und %n andere Datei wurde heruntergeladen.</numerusform><numerusform>%1 und %n andere Dateien wurden heruntergeladen.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation><numerusform>%1 und %n andere Datei wurde aktualisiert.</numerusform><numerusform>%1 und %n andere Dateien wurden aktualisiert.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation><numerusform>%1 wurde in %2 umbenannt und %n andere Datei wurde umbenannt.</numerusform><numerusform>%1 wurde in %2 umbenannt und %n andere Dateien wurden umbenannt.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation><numerusform>%1 wurde in %2 verschoben und %n andere Datei wurde verschoben.</numerusform><numerusform>%1 wurde in %2 verschoben und %n andere Dateien wurden verschoben.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation><numerusform>%1 und %n andere Datei haben Konflikte beim Abgleichen.</numerusform><numerusform>%1 und %n andere Dateien haben Konflikte beim Abgleichen.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation>Es gab einen Konflikt bei der Synchronisierung von %1. Bitte prüfen Sie die Konfliktdatei!</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation><numerusform>%1 und %n weitere Datei konnten aufgrund von Fehlern nicht synchronisiert werden. Schauen Sie in das Protokoll für Details.</numerusform><numerusform>%1 und %n weitere Dateien konnten aufgrund von Fehlern nicht synchronisiert werden. Schauen Sie in das Protokoll für Details.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 konnte aufgrund eines Fehlers nicht synchronisiert werden. Schauen Sie in das Protokoll für Details.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Synchronisierungsaktivität</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>Systemeigene Ausschlussdatei kann nicht gelesen werden</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation>Ein neues Verzeichnis größer als %1 MB wurde hinzugefügt: %2.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation>Ein Verzeichnis, von einem externen Speicher wurde hinzugefügt.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation>Bitte wechseln Sie zu den Einstellungen, falls Sie das Verzeichnis herunterladen möchten.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation>Der Ordner %1 wurde erzeugt aber früher von der Synchronisation ausgeschlossen. Daten im Ordner werden nicht synchronisiert.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation>Die Datei %1 wurde erzeugt aber früher von der Synchronisation ausgeschlossen. Sie wird nicht synchronisiert.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation>Änderungen in synchronisierten Ordnern konnten nicht zuverlässig verfolgt werden.
+
+Dies bedeutet, dass der Synchronisationsclient lokale Änderungen möglicherweise nicht sofort hochlädt und stattdessen nur nach lokalen Änderungen sucht und sie gelegentlich hochlädt (standardmäßig alle zwei Stunden).
+
+%1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -774,7 +849,7 @@ Wenn Sie sich dazu entscheiden, diese Dateien zu behalten, werden diese wieder z
Wenn Sie sich zum Löschen der Dateien entscheiden, sind diese nicht mehr verfügbar, außer Sie sind der Eigentümer.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
@@ -783,22 +858,22 @@ Sind Sie sich sicher, dass Sie diese Aktion mit Ihrem Server synchronisieren mö
Falls dies ein Missgeschick war und Sie sich zum Behalten der Dateien entscheiden, werden diese wieder vom Server synchronisiert.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Alle Dateien löschen?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Lösche alle Dateien</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Dateien behalten</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
@@ -807,17 +882,17 @@ Der Grund dafür ist möglicherweise, dass auf dem Server ein Backup eingespielt
Wenn diese Synchronisation fortgesetzt wird, werden Dateien eventuell von älteren Versionen überschrieben. Möchten Sie die neueren lokalen Dateien als Konflikt-Dateien behalten?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>Backup erkannt</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>Normale Synchronisation</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>Lokale Konfliktdateien behalten</translation>
</message>
@@ -825,115 +900,105 @@ Wenn diese Synchronisation fortgesetzt wird, werden Dateien eventuell von älter
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>Konnte Ordner-Zustand nicht zurücksetzen</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>Ein altes Synchronisations-Journal &apos;%1&apos; wurde gefunden, konnte jedoch nicht entfernt werden. Bitte stellen Sie sicher, dass keine Anwendung es verwendet.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation>(Sicherung)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation>(Sicherung %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Undefinierter Zustand.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>Wartet auf Beginn der Synchronistation</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Synchronisation wird vorbereitet.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>Synchronisation läuft.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>Die letzte Synchronisation war erfolgreich.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation>Synchronisation war erfolgreich, ungelöster Konflikte. </translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>Letzte Synchronisation war erfolgreich, aber mit Warnungen für einzelne Dateien.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>Die letzte Synchronisation war erfolgreich.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Installationsfehler.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Benutzer-Abbruch</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>Synchronisation wurde angehalten.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Synchronisation ist pausiert)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>Kein gültige Ordner gewählt!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>Der gewählte Pfad ist kein Ordner!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Sie haben keine Schreibberechtigung für den ausgewählten Ordner!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation>Der lokale Ordner %1 beinhaltet einen symbolischer Link. Das Ziel des Links beinhaltet bereits einen synchronisierten Ordner. Bitte wählen Sie einen anderen lokalen Ordner aus!</translation>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation>Es exisitiert bereits eine Synchronisation vom Server zu diesem lokalen Ordner. Bitte wählen Sie ein anderes lokales Verzeichnis!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Der lokale Ordner %1 liegt innerhalb eines synchronisierten Ordners. Bitte wählen Sie einen anderen aus!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Der lokale Ordner %1 liegt in einem Ordner, der bereits synchronisiert wird. Bitte wählen Sie einen anderen aus!</translation>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation>Der lokale Ordner %1 ist ein symbolischer Link. Das Ziel des Links liegt in einem Ordner, der schon synchronisiert wird. Bitte wählen Sie einen anderen aus!</translation>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -943,7 +1008,7 @@ Wenn diese Synchronisation fortgesetzt wird, werden Dateien eventuell von älter
<translation>Ordner-Synchronisation hinzufügen</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>Synchronisiere mit lokalem Verzeichnis</translation>
</message>
@@ -978,7 +1043,7 @@ Wenn diese Synchronisation fortgesetzt wird, werden Dateien eventuell von älter
<translation>Fehler beim Empfang der Ordnerliste vom Server.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Abgemeldet</translation>
</message>
@@ -993,133 +1058,151 @@ Wenn diese Synchronisation fortgesetzt wird, werden Dateien eventuell von älter
<translation>Es existieren ungelöste Konflikte. Für Details klicken.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Nach Änderungen suchen in &apos;%1&apos;</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation>Änderungen der entfernten Ressource &apos;%1&apos; werden geprüft</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation>Änderungen der lokalen Ressource &apos;%1&apos; werden geprüft</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation>Änderungen zusammenführen</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>Synchronisiere %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>Download %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>Upload %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 von %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%5 übrig, %1 von %2, Datei %3 von %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 of %2, Datei %3 von %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>Datei %1 von %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>Warte...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>Warte auf einen anderen Ordner</numerusform><numerusform>Warte auf %n andere Ordner</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>Bereite Synchronisation vor...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation>Dieses Problem tritt normalerweise auf, wenn die Inotify-watcher erschöpft sind. Überprüfen Sie die FAQ für Details.</translation>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>Ordner-Synchronisation hinzufügen</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
- <translation>Ordner-Synchronisation hinzufügen</translation>
+ <translation>Synchronisation hinzufügen</translation>
</message>
</context>
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Zur Auswahl eines lokalen Verzeichnisses für die Synchronisation klicken.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Pfad zum lokalen Verzeichnis eingeben</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Den Quellordner wählen</translation>
</message>
@@ -1127,60 +1210,68 @@ Wenn diese Synchronisation fortgesetzt wird, werden Dateien eventuell von älter
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Entfernten Ordner erstellen</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>Geben Sie den Namen des neuen, unter &apos;%1&apos; zu erstellenden Ordners ein: </translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>Order erfolgreich auf %1 erstellt.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
- <translation>Beim Zugriff auf %1 ist die Authentifizierung fehlgeschlagen</translation>
+ <translation>Die Authentifizierung ist beim Zugriff auf %1 fehlgeschlagen</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>Die Erstellung des Ordners auf %1 ist fehlgeschlagen. Bitte prüfen Sie dies manuell.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>Konnte Ordner nicht listen. Fehler: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Wählen Sie dies, um das gesamte Konto zu synchronisieren</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Dieser Ordner wird bereits synchronisiert.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Sie synchronisieren bereits &lt;i&gt;%1&lt;/i&gt;, das ein übergeordneten Ordner von &lt;i&gt;%2&lt;/i&gt; ist.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation>Virtuelle Dateien verwenden anstatt die Dateien herunter zu laden (experimental)</translation>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Warnung:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Warnung:&lt;/b&gt;</translation>
</message>
@@ -1188,22 +1279,22 @@ Wenn diese Synchronisation fortgesetzt wird, werden Dateien eventuell von älter
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>Kein E-Tag vom Server empfangen, bitte Proxy / Gateway überprüfen</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>Es wurde ein unterschiedlicher E-Tag zum Fortfahren empfangen. Bitte beim nächsten mal nochmal versuchen.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>Server hat falschen Bereich für den Inhalt zurück gegeben</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Zeitüberschreitung der Verbindung</translation>
</message>
@@ -1226,23 +1317,38 @@ Wenn diese Synchronisation fortgesetzt wird, werden Dateien eventuell von älter
<translation>Für das Systembenachrichtungsfeld</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation>&amp;Channel</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation>Stabil</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation>Beta</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Erweitert</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
- <translation>Bestätigung erfragen, bevor Ordner synchronisiert werden. Grenze:</translation>
+ <translation>Bestätigung erfragen, bevor Ordner synchronisiert werden die größer sind als:</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation>Bestätigung erfragen, bevor externe Speicher synchronisiert werden</translation>
</message>
@@ -1262,31 +1368,70 @@ Wenn diese Synchronisation fortgesetzt wird, werden Dateien eventuell von älter
<translation>&amp;Monochrome Icons verwenden</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>I&amp;gnorierte Dateien bearbeiten</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation>Synchronisations-Ordner und Explorer-Navigation zeigen</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>&amp;Crash-Reporter anzeigen</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>Über</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>Updates</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>&amp;Neustarten &amp;&amp; aktualisieren</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation>Update-Kanal verändern?</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation>Der Update-Kanal legt fest welche Programm-Updates zur Installation angeboten werden. Der &quot;Stabil&quot;-Kanal enthält nur Upgrades die als verlässlich betrachtet werden, während Versionen im &quot;Beta&quot;-Kanal neuer Funktionen und Fehlerbehebungen enthalten können, die bisher noch nicht komplett bzw. ausführlich genug getestet werden konnten.
+Beachten Sie, das dies nur bestimmt von welchem Bereich Sie Upgrades erhalten und das es keine Downgrade-Möglichkeiten gibt: Einen &quot;Schritt zurück&quot; vom Beta-Kanal zum Stabilen-Kanal kann normalerweise nicht unverzüglich erfolgen und bedeutet Wartezeiten auf eine Stabile-Version, die dann neuer ist als die jeweils aktuell installierte Beta-Version.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation>Update-Kanal ändern</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation>Fehler beim Teilen</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation>Der Link zum öffentlichen Teilen konnte nicht abgerufen oder erstellt werden. Fehler:
+
+%1</translation>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1354,7 +1499,7 @@ Wenn diese Synchronisation fortgesetzt wird, werden Dateien eventuell von älter
<translation>Entfernen</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1363,27 +1508,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
Objekte, bei denen Löschen erlaubt ist, werden gelöscht, wenn sie die Löschung eines Ordners verhindern würden. Das ist für Metadaten nützlich.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Datei konnte nicht geöffnet werden</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>Konnte Änderungen nicht in &apos;%1&apos; schreiben.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Ignoriermuster hinzufügen</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Neues Ignoriermuster hinzufügen:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Dieser Eintrag wird vom System auf &apos;%1&apos; bereitgestellt und kann in dieser Ansicht nicht geändert werden.</translation>
</message>
@@ -1413,7 +1558,7 @@ Objekte, bei denen Löschen erlaubt ist, werden gelöscht, wenn sie die Löschun
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Ordner</translation>
</message>
@@ -1428,35 +1573,45 @@ Objekte, bei denen Löschen erlaubt ist, werden gelöscht, wenn sie die Löschun
<translation>Ignorierte Dateien anzeigen</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation>Es gab zu viele Probleme. Nicht alle können hier dargestellt werden.</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation>Es bestehen Konflikte. Prüfen Sie die Dokumentation, wie diese zu lösen sind.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation>Liste der Fehler in die Zwischenablage kopieren.</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Kopieren</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Zeit</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Datei</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation>Fehler</translation>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation>Es bestehen Konflikte. &lt;a href=&quot;%1&quot;&gt;Prüfen Sie die Dokumentation, wie diese zu lösen sind.&lt;/a&gt;</translation>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1482,36 +1637,48 @@ Objekte, bei denen Löschen erlaubt ist, werden gelöscht, wenn sie die Löschun
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation>Log-Dateien dauerhaft sichern</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation>Wenn diese Option und kein anderes Logging aktiv ist, werden Log-Dateien in einen temporären Ordner geschrieben und nach ein paar Stunden gelöscht. Diese Einstellung bleibt beim Neustart erhalten. Logs werden nach %1 geschrieben.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Leeren</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Protokollanzeige löschen.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>S&amp;peichern</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Speichere die Protokolldatei zur Fehleranalyse</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Logdatei speichern</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Fehler</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>Konnte nicht in die Protokoll-Datei %1 schreiben</translation>
</message>
@@ -1519,12 +1686,12 @@ Objekte, bei denen Löschen erlaubt ist, werden gelöscht, wenn sie die Löschun
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Fehler</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;Datei »%1«&lt;br/&gt;kann nicht zum Schreiben geöffnet werden.&lt;br/&gt;&lt;br/&gt;Die Protokolldatei kann &lt;b&gt;nicht&lt;/b&gt; gespeichert werden!&lt;/nobr&gt;</translation>
</message>
@@ -1532,27 +1699,27 @@ Objekte, bei denen Löschen erlaubt ist, werden gelöscht, wenn sie die Löschun
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Eine neue Version ist verfügbar.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;Eine neue Version des %1 - Klients ist verfügbar.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; steht zum Herunterladen bereit. Die installierte Version ist %3.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Diese Version auslassen</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Dieses Mal überspringen</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Update durchführen</translation>
</message>
@@ -1640,27 +1807,27 @@ Objekte, bei denen Löschen erlaubt ist, werden gelöscht, wenn sie die Löschun
<translation>Automatisch begrenzen</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Hostname des Proxy-Servers</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Benutzername für den Proxy-Server</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Passwort für den Proxy-Server</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>HTTP(S)-Proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>SOCKS5-Proxy</translation>
</message>
@@ -1668,23 +1835,23 @@ Objekte, bei denen Löschen erlaubt ist, werden gelöscht, wenn sie die Löschun
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>Erstellt von %1</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>Schließe in wenigen Sekunden...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation>%1 Anfrage an %2 fehlgeschlagen</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation>&apos;%1&apos; ausgewählt von %2</translation>
@@ -1693,32 +1860,32 @@ Objekte, bei denen Löschen erlaubt ist, werden gelöscht, wenn sie die Löschun
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation>Fehler vom Server zurückgegeben: &lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation>Beim Zugriff auf den &apos;token&apos; Endpunkt trat ein Fehler auf: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation>Die JSON Antwort des Servers konnte nicht reparst werden: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation>Die Antwort des Servers hat nicht alle erwarteten Felder beinhaltet</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation>&lt;h1&gt;Anmeldefehler &lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation>&lt;h1&gt;Falscher Benutzer&lt;/h1&gt;&lt;p&gt;Sieh aben sich mit dem Benutzer &lt;em&gt;%1&lt;/em&gt; angemeldet, sollten sich jedoch mit dem Benutzer &lt;em&gt;%2&lt;/em&gt; anmelden. &lt;br&gt;Bitte melden Sie sich in einem anderen Tab von %3 ab und &lt;a href=&apos;%4&apos;&gt;klicken Sie hier&lt;/a&gt; um sich als %2&lt;/p&gt; anzumelden</translation>
</message>
@@ -1726,58 +1893,58 @@ Objekte, bei denen Löschen erlaubt ist, werden gelöscht, wenn sie die Löschun
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Neues %1 Update verfügbar</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>Ein neues Update für %1 wird installiert. Während des Updatevorganges werden Sie eventuell gefragt zusätzliche Rechte im Rahmen des Updatevorganges zu gewähren.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>Version %1 wird heruntergeladen. Bitte warten …</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>Aktualisierung kann nicht herunter geladen werden. Bitte klicken Sie &lt;a href=&apos;%1&apos;&gt;hier&lt;/a&gt; um die Aktualisierung manuell herunter zu laden.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Auf neue Aktualisierungen kann nicht geprüft werden.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>%1-Version %2 verfügbar. Anwendung zum Start der Aktualisierung neustarten.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>Neue %1-Version %2 verfügbar. Bitte nutzen Sie das System-Updatetool zur Installation.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Aktualisierungsserver wird überprüft …</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>Updatestatus unbekannt: Auf neue Updates wurde nicht geprüft.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>Keine Aktualisierungen verfügbar. Ihre Installation ist die aktuelle Version.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Aktualitätsprüfung</translation>
</message>
@@ -1785,43 +1952,43 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Verbinden mit %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Einstellungen der Optionen für lokale Verzeichnisse </translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Verbinden…</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1 Ordner &apos;%2&apos; wird mit dem lokalen Ordner &apos;%3&apos; synchronisiert</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>Ordner &apos;%1&apos; synchronisieren</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Achtung:&lt;/strong&gt; Der lokale Ordner ist nicht leer. Bitte wählen Sie eine entsprechende Lösung!&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Lokaler Ordner für die Synchronisation</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1880,15 +2047,20 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Verbinden mit %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation>Melden Sie sich in Ihrem Browser an</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation>Link in Zwischenablage kopieren</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1919,153 +2091,163 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<source>&amp;Next &gt;</source>
<translation>&amp;Weiter &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>Ungültige URL</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation>Zertifikat kann nicht geladen werden. Falsches Passwort?</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Erfolgreich mit %1 verbunden: %2 Version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Die Verbindung zu %1 auf %2:&lt;br/&gt;%3 konnte nicht hergestellt werden</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>Zeitüberschreitung beim Verbindungsversuch mit %1 unter %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Verbindungsversuch mit %1 unter %2…</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>Die Authentifizierungs-Anfrage an den Server wurde weitergeleitet an &apos;%1&apos;. Diese Adresse ist ungültig, der Server ist falsch konfiguriert.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>Es gab eine ungültige Reaktion auf eine WebDav-Authentifizeriungs-Anfrage</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>Zugang vom Server nicht erlaubt. &lt;a href=&quot;%1&quot;&gt;Klicken Sie hier&lt;/a&gt; zum Zugriff auf den Dienst mithilfe Ihres Browsers, so dass Sie sicherstellen können, dass Ihr Zugang ordnungsgemäß funktioniert.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>Ungültige URL</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation>Der Server meldete folgenden Fehler:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>Lokaler Sync-Ordner %1 existiert bereits, aktiviere Synchronistation.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>Lokaler Synchronisations-Ordner %1 wird erstellt ...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>ok</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>fehlgeschlagen.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>Der lokale Ordner %1 konnte nicht angelegt werden</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>Keinen entfernten Ordner angegeben!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Fehler: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>erstelle Ordner auf ownCloud: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>Remoteordner %1 erfolgreich erstellt.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>Der Ordner %1 ist auf dem Server bereits vorhanden. Verbinde zur Synchronisation.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>Das Erstellen des Verzeichnisses erzeugte den HTTP-Fehler-Code %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>Die Remote-Ordner-Erstellung ist fehlgeschlagen, weil die angegebenen Zugangsdaten falsch sind. Bitte gehen Sie zurück und überprüfen Sie die Zugangsdaten.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Die Remote-Ordner-Erstellung ist fehlgeschlagen, vermutlich sind die angegebenen Zugangsdaten falsch.&lt;/font&gt;&lt;br/&gt;Bitte gehen Sie zurück und überprüfen Sie Ihre Zugangsdaten.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>Remote-Ordner %1 konnte mit folgendem Fehler nicht erstellt werden: &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>Eine Synchronisationsverbindung für Ordner %1 zum entfernten Ordner %2 wurde eingerichtet.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Erfolgreich verbunden mit %1!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>Die Verbindung zu %1 konnte nicht hergestellt werden. Bitte prüfen Sie die Einstellungen erneut.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Ordner umbenennen fehlgeschlagen.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>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.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Lokaler Sync-Ordner %1 erfolgreich erstellt!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2073,14 +2255,33 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>%1 Verbindungsassistent</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Ordner-Konfiguration überspringen</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation>Experimentelle Funktion aktivieren?</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation>Wenn der Modus &quot;Virtuelle Dateien&quot; aktiviert ist, werden die Dateien nicht sofort heruntergeladen. Stattdessen wird auf dem Server für jede Datei eine kleine &quot;%1&quot;-Datei erstellt. Der Inhalt der Dateien wird beim Ausführen der Dateien oder durch Nutzung dessen Kontextmenü heruntergeladen.
+
+Dies ist ein neuer experimenteller Modus.Wenn du dich dafür entscheidest, diesen Modus zu nutzen, berichte bitte jeden Fehler der auftritt.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation>Experimentellen Modus aktivieren</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation>Sicher bleiben</translation>
</message>
</context>
<context>
@@ -2104,7 +2305,7 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>Ungültige JSON-Antwort von der Poll-URL</translation>
</message>
@@ -2112,7 +2313,7 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>Fehler beim Schreiben der Metadaten in die Datenbank</translation>
</message>
@@ -2120,47 +2321,47 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>Die Datei %1 kann aufgrund eines Konfliktes mit dem lokalen Dateinamen nicht herunter geladen werden!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation>Das Herunterladen würde den lokalen freien Speicherplatz unter das Limit reduzieren</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>Der freie Speicher auf der Festplatte ist weniger als %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>Die Datei wurde vom Server gelöscht</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>Die Datei konnte nicht vollständig herunter geladen werden.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation>Die heruntergeladene Datei ist leer, obwohl der Server %1 als Größe übermittelt hat.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>Die Datei %1 kann aufgrund eines Konfliktes mit dem lokalen Dateinamen nicht gespeichert geladen werden!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>Datei ist seit der Entdeckung geändert worden</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>Fehler beim Schreiben der Metadaten in die Datenbank</translation>
</message>
@@ -2168,12 +2369,12 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; Wiederherstellung fehlgeschlagen: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation>Eine Datei oder ein Ordner wurde von einer Nur-Lese-Freigabe wiederhergestellt, aber die Wiederherstellung ist mit folgendem Fehler fehlgeschlagen: %1</translation>
</message>
@@ -2181,22 +2382,22 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>Konnte Datei %1 nicht löschen. Fehler: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>Achtung, es könnte ein Problem mit der Groß- und Kleinschreibung für %1 auftreten</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>Ordner %1 konnte nicht angelegt werden </translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>Fehler beim Schreiben der Metadaten in die Datenbank</translation>
</message>
@@ -2204,17 +2405,17 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>Fehler beim Entfernen &apos;%1&apos;: %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>Der Ordner konnte nicht gelöscht werden &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>%1 kann aufgrund eines Konfliktes mit dem lokalen Dateinamen nicht gelöscht werden</translation>
</message>
@@ -2222,13 +2423,13 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>%1 kann aufgrund eines Konfliktes mit dem lokalen Dateinamen nicht zu %2 umbenannt werden</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>Fehler beim Schreiben der Metadaten in die Datenbank</translation>
</message>
@@ -2236,12 +2437,7 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>Die Datei wurde von einer Nur-Lese-Freigabe gelöscht. Die Datei wurde wiederhergestellt.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>Es wurde ein falscher HTTP-Status-Code vom Server gesendet. Erwartet wurde 204, aber gesendet wurde &quot;%1 %2&quot;.</translation>
</message>
@@ -2249,12 +2445,12 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Es wurde ein falscher HTTP-Status-Code vom Server gesendet. Erwartet wurde 201, aber gesendet wurde &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>Fehler beim Schreiben der Metadaten in die Datenbank</translation>
</message>
@@ -2262,28 +2458,13 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Dieser Ordner muss nicht umbenannt werden. Er wurde zurück zum Originalnamen umbenannt.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Dieser Ordner muss nicht umbenannt werden. Bitte benennen Sie es zurück wie in der Freigabe.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>Die Datei wurde auf einer Nur-Lese-Freigabe umbenannt. Die Original-Datei wurde wiederhergestellt.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Es wurde ein falscher HTTP-Status-Code vom Server gesendet. Erwartet wurde 201, aber gesendet wurde &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>Fehler beim Schreiben der Metadaten in die Datenbank</translation>
</message>
@@ -2291,33 +2472,33 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation>Die Datei %1 kann nicht hochgeladen werden, da eine andere Datei mit dem selben Namen, nur unterschiedlicher Großschreibung, existiert</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Datei gelöscht</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>Lokale Datei hat sich während der Synchronisation geändert. Die Synchronisation wird wiederaufgenommen.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>Eine lokale Datei wurde während der Synchronisation geändert.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation>Das Hochladen von %1 überschreitet das Speicherkontingent des Ordners </translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>Fehler beim Schreiben der Metadaten in die Datenbank</translation>
</message>
@@ -2325,27 +2506,27 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>Die lokale Datei wurde während der Synchronisation gelöscht.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>Eine lokale Datei wurde während der Synchronisation geändert.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation>Unerwarteter Rückgabe-Code Antwort vom Server (%1)</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation>Fehlende Datei-ID vom Server</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation>Fehlender ETag vom Server</translation>
</message>
@@ -2353,27 +2534,22 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>Die Datei wurde von einer Nur-Lese-Freigabe lokal bearbeitet. Die Datei wurde wiederhergestellt und Ihre Bearbeitung ist in der Konflikte-Datei.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>Poll-URL fehlt</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>Die lokale Datei wurde während der Synchronisation gelöscht.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>Eine lokale Datei wurde während der Synchronisation geändert.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation>Der Server hat den letzten Block nicht bestätigt. (Der E-Tag war nicht vorhanden)</translation>
</message>
@@ -2391,42 +2567,47 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<translation>TextLabel</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Im Browser öffnen</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Zeit</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Datei</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Ordner</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Aktion</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Größe</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>Lokales Sychronisationsprotokoll</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Kopieren</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Aktivitätsliste in die Zwischenablage kopieren.</translation>
</message>
@@ -2467,7 +2648,7 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Zu synchronisierende Elemente auswählen</translation>
</message>
@@ -2475,33 +2656,33 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Laden…</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation>Entfernte Ordner abwählen, die nicht synchronisiert werden sollen.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Name</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Größe</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>Aktuell befinden sich keine Unterordner auf dem Server.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation>Ein Fehler ist aufgetreten, während die Liste der Unterordner geladen wurde.</translation>
</message>
@@ -2522,22 +2703,22 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<translation>Einstellungen</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Aktivität</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Allgemein</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Netzwerk</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Benutzerkonto</translation>
</message>
@@ -2545,28 +2726,28 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Aktivität</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Allgemein</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Netzwerk</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Benutzerkonto</translation>
</message>
@@ -2594,42 +2775,42 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<translation>ownCloud-Pfad:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>%1-Freigabe</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Ordner: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>Der Server erlaubt das teilen nicht</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation>Abrufen der maximal möglichen Freigabeberechtigungen vom Server...</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Die Datei kann nicht geteilt werden, weil sie ohne erneute Teilungs-Berechtigung für Sie geteilt wurde.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>Nutzer und Gruppen</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>Öffentliche Links</translation>
</message>
@@ -2642,7 +2823,17 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<translation>Teile NewDocument.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation>Nur hochladen (Datei hineinziehen)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation>Von anderen Dateien empfangen, ohne den Inhalt des Ordners preiszugeben.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>TextLabel</translation>
</message>
@@ -2672,19 +2863,24 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<translation>Passwort setzen</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
- <translation>Link-Eigenschaften:</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
+ <translation>Empfängen können Inhalte sehen und herunterladen.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation>Herunterladen/Ansehen</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>Dateiliste anzeigen</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation>Herunterladen / Ansehen / Hochladen</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Bearbeitung erlauben</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation>Empfänger können Inhalte sehen, herunterladen, ändern, löschen und hochladen.</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2692,95 +2888,95 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<translation>Jeder mit dem Link hat Zugriff auf die Datei/Ordner</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>Passwort geschützt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>passwortgeschützt</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Die Datei kann nicht geteilt werden, weil sie ohne erneute Teilungs-Berechtigung für Sie geteilt wurde.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation>Das Teilen von Links wurde deaktiviert</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation>Öffentlichen Link zum Teilen erstellen</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Löschen</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation>Link im Browser öffnen</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation>Link in Zwischenablage kopieren</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation>Link in die Zwischenablage kopieren (direkter download)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Link als E-Mail verschicken</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation>Link per Email senden (direkter download)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation>Ich habe %1 mit Ihnen geteilt</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation>Löschung des öffentlichen Links bestätigen</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation>&lt;p&gt;Möchte Sie wirklich den öffentlichen Link &lt;i&gt;%1 &lt;/i&gt;löschen?&lt;p&gt;Hinweis: Dies kann nicht rückgängig gemacht werden.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation>Öffentlicher Link</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation>Öffentlichen Link löschen</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>Öffentliches Teilen erfordert ein P&amp;asswort</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Bitte wählen Sie ein Passwort:</translation>
</message>
@@ -2800,35 +2996,35 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<message>
<location filename="../src/gui/shareusergroupwidget.ui" line="108"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;You can direct people to this shared file or folder &lt;a href=&quot;private link menu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;by giving them a private link&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Sie können Leute direkt zu dieser Freigabe leiten&lt;a href=&quot;private link menu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;, wenn Sie Ihnen einen privaten Link&lt;/span&gt;&lt;/a&gt;gibst.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Sie können Personen direkt zu dieser Freigabe leiten,&lt;a href=&quot;private link menu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt; wenn Sie Ihnen diesen privaten Link &lt;/span&gt;&lt;/a&gt; geben.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation>Das Element wird mit keinem Benutzer oder Gruppe geteilt</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation>Link im Browser öffnen</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation>Link in Zwischenablage kopieren</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Link als E-Mail verschicken</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>Keine Ergebnisse für &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation>Ich habe etwas mit Ihnen geteilt</translation>
</message>
@@ -2841,37 +3037,38 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<translation>Formular</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>TextLabel</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>kann bearbeiten</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>kann teilen</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>erstellen</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>Ändern</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>löschen</translation>
</message>
@@ -2915,143 +3112,176 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>Via %1 teilen</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation>Teilen über das Kontextmenü</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation>Ich habe etwas mit Ihnen geteilt</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation>Teilen…</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation>Privater Link in die Zwischenablage kopiert</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation>Sende privaten Link per Email...</translation>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation>Weiter-Teilen dieser Datei ist nicht erlaubt.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation>Öffentlichen Link in die Zwischenablage kopieren</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Im Browser öffnen</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation><numerusform>Datei herunterladen</numerusform><numerusform>Dateien herunterladen</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Zertifikatdetails&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Gemeinsamer Name (CN):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>Subject Alternative Names:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Organisation (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Organisationseinheit (OU):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Staat/Provinz:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>Land:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Seriennummer:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Aussteller&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Aussteller:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Ausgestellt am:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Ablaufdatum:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Fingerabdrücke&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;Hinweis:&lt;/b&gt; Dieses Zertifikat wurde manuell bestätigt&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (selbst signiert)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>Diese Verbindung ist verschlüsselt mit %1 Bit %2.
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation>Keine Unterstützung für SSL session tickets</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Zertifikatsinformation:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>Diese Verbindung ist NICHT sicher, da diese nicht verschlüsselt ist.
@@ -3139,305 +3369,271 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Erfolgreich</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>CSync konnte die Journaldatei nicht laden. Die Journaldatei ist beschädigt.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;Das %1-Plugin für csync konnte nicht geladen werden.&lt;br/&gt;Bitte überprüfen Sie die Installation!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>CSync hat einen schwerwiegender Parameterfehler festgestellt.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>CSync Verarbeitungsschritt &quot;Aktualisierung&quot; fehlgeschlagen.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>CSync Verarbeitungsschritt &quot;Abgleich&quot; fehlgeschlagen.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync konnte sich nicht am Proxy authentifizieren.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSync konnte den Proxy oder Server nicht auflösen.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync konnte sich nicht am Server %1 authentifizieren.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync konnte sich nicht mit dem Netzwerk verbinden.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>Eine Zeitüberschreitung der Netzwerkverbindung ist aufgetreten.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>Es hat sich ein HTTP-Übertragungsfehler ereignet.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation>Der auf dem Server eingehängte Ordner ist vorübergehend nicht verfügbar</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>Beim Öffnen eines Ordners ist ein Fehler aufgetreten.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>Fehler beim Lesen eines Ordners.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation>%1(Übersprungen aufgrund des früheren Fehler,s erneuter Versuch in %2)</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>Datei wird ignoriert, weil sie versteckt ist.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation>Ordnerhierarchie ist zu tief</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation>Konflikt: Serverversion heruntergeladen, lokale Kopie umbenannt und nicht hochgeladen.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation>Nur %1 sind verfügbar. Zum Beginnen werden mindestens %2 benötigt.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation>Öffnen oder erstellen der Sync-Datenbank nicht möglich. Bitte sicherstellen, dass Schreibrechte für den zu synchronisierenden Ordner existieren.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
- <translation>Nicht erlaubt, da Sie keine Rechte zur Erstellung von Unterordnern haben</translation>
+ <translation>Nicht erlaubt, da Sie keine Rechte zur Erstellung von übergeordneten Ordnern haben</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation>Nicht erlaubt, da Sie keine Rechte zum Hinzufügen von Dateien in diesen Ordner haben</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation>Der freie Speicherplatz wird knapp: Downloads, die den freien Speicher unter %1 senken, wurden ausgelassen.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation>Auf dem Server ist für einige Dateien zum Hochladen nicht genug Platz.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: Kein Platz auf Server %1 frei.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>CSync unbekannter Fehler.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Abbruch durch den Benutzer</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>CSync-Zugriff fehlgeschlagen</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation>Journal-Datei kann nicht geladen oder erzeugt werden. Bitte Schreib- und Leserechte im lokalen Synchronisations-Ordner sicher stellen.</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation>Suche fehlgeschlagen</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation>Keine Rechte</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
- <translation>CSync konnte das Journal nicht laden oder erstellen. Stellen Sie bitte sicher, dass Sie Lese- und Schreibrechte im lokalen Synchronisationsordner haben.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
+ <translation>Datei oder Verzeichnis nicht gefunden</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
- <translation>CSync wegen fehlender Berechtigung fehlgeschlagen.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
+ <translation>Dieser Ordner existiert schon.
+</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
- <translation>CSync versuchte einen Ordner anzulegen, der schon existiert.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation>kein Platz mehr auf dem Server %1.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>Der Dienst ist vorübergehend nicht erreichbar</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>Zugriff verboten</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>Ein interner Fehler mit der Fehlernummer %1 ist aufgetreten.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>Symbolische Verknüpfungen werden bei der Synchronisation nicht unterstützt.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>Die Datei ist in der Ignorierliste geführt.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
- <translation>Dateinamen enden mit einem Punkt, die in diesem Dateisystem nicht unterstützt wird.</translation>
+ <translation>Dateinamen die mit einem Punkt enden sind in diesem Dateisystem nicht unterstützt.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
- <translation>Dateinamen beinhalten das Zeichen &apos;%1&apos; und diese werden in diesem Dateisystems nicht unterstützt.</translation>
+ <translation>Dateinamen beinhalten das Zeichen &apos;%1&apos; diese werden in diesem Dateisystem nicht unterstützt.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation>Der Dateiname ist ein reservierter Name in diesem Dateisystem.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
- <translation>Dateiname endet mit Leerzeichen.</translation>
+ <translation>Der Dateiname endet mit Leerzeichen.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>Der Dateiname ist zu lang.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation>Der Dateiname kann auf Ihrem Dateisystem nicht entschlüsselt werden.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation>Ungelöster Konflikt.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>Stat fehlgeschlagen.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>Dateikodierung ist ungültig</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
- <translation>Ungültige Zeichenm bitte benennen Sie &quot;%1&quot; um</translation>
+ <translation>Ungültige Zeichen, bitte benennen Sie &quot;%1&quot; um</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation>Virtuelle Dateien werden genutzt, aber die Dateiendung ist nicht definiert.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation>Fehler beim Einlesen der Blacklist aus der lokalen Datenbank</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation>Fehler beim Einlesen des Synchronisierungsprotokolls.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>Synchronisationsbericht kann nicht geöffnet werden</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>Der Dateiname enthält mindestens ein ungültiges Zeichen</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>Aufgrund der »Zu synchronisierende Elemente auswählen«-Sperrliste ignoriert</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation>Nicht erlaubt, da Sie keine Rechte zur Erstellung von Unterordnern haben</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>Das Hochladen dieser Datei ist nicht erlaubt, da die Datei auf dem Server schreibgeschützt ist, Wiederherstellung</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>Löschen nicht erlaubt, Wiederherstellung</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>Lokale Dateien und Freigabeordner wurden entfernt.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>Verschieben nicht erlaubt, Element wiederhergestellt</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>Verschieben nicht erlaubt, da %1 schreibgeschützt ist</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>Das Ziel</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>Die Quelle</translation>
</message>
@@ -3461,17 +3657,17 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Version %1. Für weitere Informationen besuchen Sie bitte &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Version %2. Für mehr Informationen gehe auf &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Für bekannte Probleme und Hilfe gehe bitte auf: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;Von Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, und anderen.&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;Zur Verfügung gestellt durch %1 und lizenziert unter der GNU General Public License (GPL) Version 2.0.&lt;br&gt;%2 und das %2 Logo sind eingetragene Warenzeichen von %1 in den Vereinigten Staaten, anderen Ländern oder beides.&lt;/p&gt;</translation>
</message>
@@ -3502,81 +3698,81 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<translation>Bitte melden Sie sich an</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Ordner %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Es wurden keine Synchonisationsordner konfiguriert.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Im Browser öffnen</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Einloggen...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Abmelden</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Letzte Änderungen</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Nach Änderungen suchen in &apos;%1&apos;</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Verwaltete Ordner:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Ordner »%1« öffnen</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>%1 im Browser öffnen</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Unbekannter Status</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Einstellungen …</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Details …</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Hilfe</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>%1 beenden</translation>
</message>
@@ -3591,11 +3787,6 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<translation>nicht unterstütze Server Version</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation>Der Server mit Konto %1 läuft mit einer alten und nicht unterstützten Version %2. Die Verwendung dieses Clienten mit der nicht unterstützten Serverversion ist ungetestet und möglicherweiße gefährich. Fortfahren auf eigenes Risiko.</translation>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Getrennt</translation>
@@ -3603,12 +3794,12 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="240"/>
<source>Disconnected from some accounts</source>
- <translation>Verbindungen zu einigen Konnten getrennt</translation>
+ <translation>Die Verbindungen zu einigen Konnten wurde getrennt</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="251"/>
<source>Disconnected from accounts:</source>
- <translation>Verbindungen zu Konnten getrennt:</translation>
+ <translation>Verbindungen zu Konnten wurde getrennt:</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="253"/>
@@ -3627,116 +3818,129 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation>Synchronisation pausiert</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation>Ungelöste Konflikte</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation>Fehler bei der Synchronisation</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation>Keine Ordner zur Synchronisation konfiguriert</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation>Setze alle Ordner fort</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>Stoppe alle Ordner</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>Setze gesamte Synchronisation fort</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>Setze Synchronisation fort</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>Stoppe gesamte Synchronisation</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>Stoppe Synchronisation</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Bei allen Konten abmelden</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Bei allen Konten anmelden...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>Neues Konto...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>Über %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
- <translation>Jetzt abstürzen lassen</translation>
+ <translation>Absturz</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Keine kürzlich synchronisierten Elemente</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation>Änderungen der entfernten Ressource &apos;%1&apos; werden geprüft</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation>Änderungen der lokalen Ressource &apos;%1&apos; werden geprüft</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Synchronisiere %1 von %2 (%3 übrig)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation>Synchronisiere %1 von %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Synchronisiere %1 (%2 übrig)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>Synchronisiere %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Aktuell</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Version %2. Weitere Informationen unter &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Für bekannte Fehler und die Hilfe, besuchen Sie bitte: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;Von Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz und anderen.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Lizenziert unter den Bedingungen der GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud und das ownCloud Logo sind eingetragene Warenzeichen der ownCloud Inc. in den USA, anderen Ländern, oder beidem.&lt;/p&gt;</translation>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3748,9 +3952,9 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>TextLabel</translation>
</message>
@@ -3786,11 +3990,22 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<translation>Bestätigung erfragen, bevor externe Speicher synchronisiert werden. Gren&amp;ze:</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Zu synchronisierende Elemente auswählen</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Wenn diese Option angewählt ist, wird der Installationsassistent, ohne irgendetwas zu synchronisieren, beendet. Sie können den &amp;quot;Synchronisationsverzeichnis&amp;quot; Button in den Kontoeinstellungen nutzen, um das Ordnerpaar zwischen lokal und entfernt festzulegen, die Sie synchronisieren möchten&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation>Manuell Synchronisationsverzeichnis erstellen</translation>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>&amp;Lokaler Ordner</translation>
@@ -3807,11 +4022,16 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>Alle Daten vom Server s&amp;ynchronisieren</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation>Alle Daten vom Server s&amp;ynchronisieren (empfohlen)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation>Virtuelle Dateien verwenden anstatt die Dateien herunter zu laden (e&amp;xperimental)</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Statusnachricht</translation>
</message>
@@ -3844,12 +4064,12 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="36"/>
<source>Please switch to your browser to proceed.</source>
- <translation>Bitte wechseln Sie zum Fortfahren in deinen Browser.</translation>
+ <translation>Bitte wechseln Sie zum Fortfahren in den Browser.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
- <translation>Ein Fehler trat während der Verbindung auf. Bitte erneut versuchen.</translation>
+ <source>An error occurred while connecting. Please try again.</source>
+ <translation>Fehler beim Aufbau der Verbindung. Bitte nochmal versuchen.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="56"/>
@@ -4028,9 +4248,9 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
- <translation>&lt;p&gt;&lt;small&gt;Gebaut von der GIT-Revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; auf %3, %4 verwendet Qt %5, %6&lt;/small&gt;&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;&lt;small&gt;Gebaut aus der GIT-Revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; auf %3, %4 verwendet Qt %5, %6&lt;/small&gt;&lt;/p&gt;</translation>
</message>
</context>
<context>
@@ -4048,7 +4268,7 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="37"/>
<source>Server version downloaded, copied changed local file into conflict file</source>
- <translation>Serverversion heruntergeladen. Die bearbeitete lokale Datei wurde in eine Konfliktdatei verschoben.</translation>
+ <translation>Serverversion heruntergeladen. Die bearbeitete lokale Datei wurde in eine Konfliktdatei kopiert</translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="39"/>
@@ -4120,83 +4340,83 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="81"/>
<source>updating local metadata</source>
- <translation>aktualisiere Lokale Metadaten</translation>
+ <translation>aktualisiere lokale Metadaten</translation>
</message>
</context>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
- <translation>Status undefiniert</translation>
+ <translation>Status nicht definiert</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Warte, um mit der Synchronistation zu beginnen</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
- <translation>Sync läuft</translation>
+ <translation>Synchronisation läuft</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
- <translation>Sync erfolgreich</translation>
+ <translation>Synchronisation erfolgreich</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Synchronisation abgeschlossen, einige Dateien wurden ignoriert.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Synchronisationsfehler</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Installationsfehler</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Synchronisation wird vorbereitet</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
- <translation>Es wird abgebrochen …</translation>
+ <translation>Abbruch …</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
- <translation>Synchronisation wurde angehalten</translation>
+ <translation>Synchronisation wird angehalten</translation>
</message>
</context>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation>Konnte Browser nicht öffnen</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
- <translation>Die URL %1 konnte aufgrund eines Fehlers beim Start des Browsers nicht aufgerufen werden. Ist vielleicht kein Standardbrowser konfiguriert?</translation>
+ <translation>Die URL %1 konnte aufgrund eines Fehlers nicht aufgerufen werden. Ist vielleicht kein Standard-Browser konfiguriert?</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation>Die E-Mail Anwendung konnte nicht geöffnet werden</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
- <translation>Es ist ein Fehler beim Öffnen der E-Mail Anwendung, zum Erstellen einer neuen Nachricht, aufgetreten. Vielleicht ist keine standardmäßige E-Mail Anwendung konfiguriert?</translation>
+ <translation>Es ist ein Fehler beim Öffnen einer E-Mail Anwendung zum Erstellen einer neuen Nachricht aufgetreten. Vielleicht ist keine E-Mail Anwendung konfiguriert?</translation>
</message>
</context>
</TS> \ No newline at end of file
diff --git a/translations/client_el.ts b/translations/client_el.ts
index f8d25d012..cc4409d73 100644
--- a/translations/client_el.ts
+++ b/translations/client_el.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="el" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,17 +95,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Η σύνδεση έληξε.</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation type="unfinished"/>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Άκυρο</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Λογαριασμός</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Επιλέξτε τι θα συγχρονιστεί</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Εξαναγκασμός συγχρονισμού τώρα</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>Επανεκκίνηση συγχρονισμού</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>Αφαίρεση σύνδεσης συγχρονισμού φακέλου</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Αποτυχία αφαίρεσης φακέλου</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;Αδυναμία δημιουργίας τοπικού φακέλου &lt;i&gt;%1&lt;/i&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>Επιβεβαίωση αφαίρεσης σύνδεσης συγχρονισμού φακέλου</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>Αφαίρεση σύνδεσης συγχρονισμού φακέλου</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Εκτελείται Συγχρονισμός </translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>Η λειτουργία συγχρονισμού εκτελείται.&lt;br/&gt; Θέλετε να την τερματίσετε;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 σε χρήση</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 ως &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>Η έκδοση του διακομιστή %1 είναι παλιά και δεν υποστηρίζεται! Προχωρείστε με δική σας ευθύνη.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Συνδεδεμένο με %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>Ο διακομιστής %1 δεν είναι διαθέσιμος προσωρινά.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>Αποσυνδέθηκε από %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation>Σύνδεση σε %1...</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>Δεν υπάρχει σύνδεση με το %1 στο %2.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Είσοδος</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>Υπάρχουν φάκελοι που δεν συγχρονίστηκαν επειδή είναι πολύ μεγάλοι:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>Υπάρχουν φάκελοι που δεν συγχρονίστηκαν επειδή είναι εξωτερικοί αποθηκευτικοί χώροι:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation>Υπάρχουν φάκελοι που δεν συγχρονίστηκαν επειδή είναι πολύ μεγάλοι ή αποθηκευτικοί χώροι:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Επιβεβαίωση Αφαίρεσης Λογαριασμού</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Θέλετε πραγματικά να αφαιρέσετε τη σύνδεση με το λογαριασμό &lt;i&gt;%1&lt;/i&gt;;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Σημείωση:&lt;/b&gt; Αυτό &lt;b&gt;δεν&lt;/b&gt; θα διαγράψει κανένα αρχείο.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Αφαίρεση σύνδεσης</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Άνοιγμα φακέλου</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Αποσύνδεση</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Συνέχιση συγχρονισμού</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Παύση συγχρονισμού</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Θέλετε πραγματικά να σταματήσετε το συγχρονισμό του φακέλου &lt;i&gt;%1&lt;/i&gt;;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Σημείωση:&lt;/b&gt; Αυτό &lt;b&gt;δεν&lt;/b&gt; θα διαγράψει κανένα αρχείο.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1 (%3%) από %2 σε χρήση. Μερικοί φάκελοι, συμπεριλαμβανομένων των δικτυακών ή των κοινόχρηστων μπορεί να έχουν διαφορετικά όρια.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%1 από %2 σε χρήση</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Προς το παρόν δεν υπάρχουν πληροφορίες χρήσης χώρου αποθήκευσης διαθέσιμες.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>Δεν έχει ρυθμιστεί σύνδεση με το %1.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Αποσύνδεση</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Αποσυνδεδεμένο</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Συνδεδεμένο</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Η υπηρεσία δεν είναι διαθέσιμη</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Σφάλμα δικτύου</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Σφάλμα ρυθμίσεων</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Άγνωστη κατάσταση λογαριασμού</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Δραστηριότητα διακομιστή</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Προτοκολο συγχρονισμου</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>Δεν είναι συγχρονισμένα</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>Δεν είναι συγχρονισμένα (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>Ο κατάλογος δραστηριοτήτων του διακομιστή έχει αντιγραφθεί στο Πρόχειρο</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>Ο κατάλογος της δραστηριότητας συγχρονισμού έχει αντιγραφθεί στο Πρόχειρο</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>Η λίστα των μη συγχρονισμένων αντικειμένων έχει αντιγραφεί στο πρόχειρο</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Αντιγράφηκε στο πρόχειρο</translation>
</message>
@@ -469,47 +488,47 @@
<translation>TextLabel</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Δραστηριότητες διακομιστή</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Αντιγραφή</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Αντιγραφή της λίστας δραστηριότητας στο πρόχειρο.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Απαιτείται ενέργεια: Ειδοποιήσεις</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;Ο λογαριασμός %1 δεν έχει ενεργοποιήσει τις δραστηριότητες.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation><numerusform>Λάβατε %n νέα ειδοποίηση(σεις) από %2.</numerusform><numerusform>Λάβατε %n νέα ειδοποίηση(σεις) από %2.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation><numerusform>Λάβατε %n νέες ειδοποιήση(εις) από %1 και %2.</numerusform><numerusform>Λάβατε %n νέες ειδοποιήση(εις) από %1 και %2.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>Λάβατε νέες ανακοινώσεις από %1, %2 και άλλους λογαριασμούς.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>%1 Ειδοποιήσεις - Απαιτείται ενέργεια</translation>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Έξοδος</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Συνέχεια</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation>Σφάλμα πρόσβασης στο αρχείο ρυθμίσεων</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation>Υπήρξε σφάλμα κατά την πρόσβαση του αρχείου ρυθμίσεων στο %1</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>Έξοδος ownCloud</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>Σφάλμα εγγραφής μεταδεδομένων στην βάση δεδομένων</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>Δεν έχει ρυθμιστεί λογαριασμός ownCloud</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>Ο ρυθμισμένος διακομιστής για αυτό το δέκτη είναι πολύ παλιός</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Παρακαλώ ενημερώστε το διακομιστή στη νεώτερη έκδοση και επανεκκινήστε το δέκτη.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Σφάλμα Πιστοποίησης: Το όνομα χρήστη ή ο κωδικός πρόσβασης είναι λανθασμένα.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>παρέλευση χρονικού ορίου</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>Τα παρεχόμενα διαπιστευτήρια δεν είναι σωστά</translation>
</message>
@@ -637,133 +681,160 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Ματαιώθηκε από το χρήστη</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>Δεν υπάρχει ο τοπικός φάκελος %1.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>Το %1 θα έπρεπε να είναι φάκελος αλλά δεν είναι.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation> Το %1 δεν είναι αναγνώσιμο. </translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>Το %1 αφαιρέθηκε.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>Το %1 έχει ληφθεί.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>Το %1 έχει ενημερωθεί.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>Το %1 έχει μετονομαστεί σε %2.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>Το %1 έχει μετακινηθεί στο %2.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation><numerusform>%1 και%n άλλo αρχείo(α) έχουν καταργηθεί.</numerusform><numerusform>%1 και%n άλλo αρχείo(α) έχουν καταργηθεί.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation><numerusform>%1 και%n άλλο αρχείο(ο) έχουν ληφθεί.</numerusform><numerusform>%1 και%n άλλο αρχείο(ο) έχουν ληφθεί.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation><numerusform>%1 και%n άλλο αρχείο(α) έχουν ενημερωθεί.</numerusform><numerusform>%1 και%n άλλο αρχείο(α) έχουν ενημερωθεί.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation><numerusform>%1 μετονομάστηκε σε %2 και %n άλλο αρχείο(α) έχουν μετονομαστεί.</numerusform><numerusform>%1 μετονομάστηκε σε %2 και %n άλλο αρχείο(α) έχουν μετονομαστεί.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation><numerusform>%1 έχει μετακινηθεί σε %2 και %n άλλo αρχείο(α) έχουν μετακινηθεί.</numerusform><numerusform>%1 έχει μετακινηθεί σε %2 και %n άλλo αρχείο(α) έχουν μετακινηθεί.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation><numerusform>%1 έχει και %n άλλο αρχείο(α) έχουν διένεξη συγχρονισμού.</numerusform><numerusform>%1 έχει και %n άλλο αρχείο(α) έχουν διένεξη συγχρονισμού.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation>%1 έχει μια διένεξη συγχρονισμού. Παρακαλώ ελέγξτε τη διένεξη του αρχείου! </translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation><numerusform>%1 και %n άλλο(α) αρχείο(α) δεν μπορούν να συγχρονιστούν λόγω σφαλμάτων. Δείτε το ιστορικό για λεπτομέρειες</numerusform><numerusform>%1 και %n άλλο αρχείο(α) δεν μπορούν να συγχρονιστούν λόγω σφαλμάτων. Δείτε το ημερολόγιο για λεπτομέρειες. </numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 δεν ήταν δυνατό να συγχρονιστεί εξαιτίας ενός σφάλματος. Δείτε το αρχείο καταγραφής για λεπτομέρειες.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Δραστηριότητα Συγχρονισμού</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>Αδυναμία ανάγνωσης αρχείου αποκλεισμού συστήματος</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation>Προστέθηκε ένας νέος φάκελος μεγαλύτερος από %1 MB: %2
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation>Προστέθηκε ένας φάκελος από εξωτερικό αποθηκευτικό χώρο.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation>Μεταβείτε στις ρυθμίσεις για να το επιλέξετε εάν επιθυμείτε να το κατεβάσετε.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -774,7 +845,7 @@ If you decide to delete the files, they will be unavailable to you, unless you a
Εφόσον επιλέξετε να διαγράψετε τα αρχεία, δε θα είναι διαθέσιμα σε εσάς, εκτός εάν είστε ο ιδιοκτήτης τους. </translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
@@ -783,22 +854,22 @@ If this was an accident and you decide to keep your files, they will be re-synce
Αν αυτό ήταν ένα ατύχημα και αποφασίσατε να διατηρήσετε τα αρχεία σας, θα συγχρονιστούν εκ νέου από το διακομιστή.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Αφαίρεση Όλων των Αρχείων;</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Αφαίρεση όλων των αρχείων</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Διατήρηση αρχείων</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
@@ -807,17 +878,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
Η συνέχιση του συγχρονισμού κανονικά θα προκαλέσει την αντικατάσταση όλων των αρχείων σας από παλιότερο αρχείο σε προηγούμενη κατάσταση. Θέλετε να διατηρήσετε τα τοπικά σας πιο πρόσφατα αρχεία ως αρχεία σύγκρουσης;</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>Ανιχνεύθηκε αντίγραφο ασφαλείας</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>Κανονικός συγχρονισμός</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>Διατήρηση τοπικών αρχείων ως Διένεξη</translation>
</message>
@@ -825,115 +896,105 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>Δεν ήταν δυνατό να επαναφερθεί η κατάσταση του φακέλου</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>Βρέθηκε ένα παλαιότερο αρχείο συγχρονισμού &apos;%1&apos;, αλλά δεν μπόρεσε να αφαιρεθεί. Παρακαλώ βεβαιωθείτε ότι καμμία εφαρμογή δεν το χρησιμοποιεί αυτή τη στιγμή.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation>(αντίγραφο ασφαλείας)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation>(αντίγραοφ ασφαλέιας %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Απροσδιόριστη Κατάσταση.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>Αναμονή έναρξης συγχρονισμού.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Προετοιμασία για συγχρονισμό.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>Ο συγχρονισμός εκτελείται.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>Ο τελευταίος συγχρονισμός ήταν επιτυχής.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>Ο τελευταίος συγχρονισμός ήταν επιτυχής, αλλά υπήρχαν προειδοποιήσεις σε συγκεκριμένα αρχεία.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>Ο τελευταίος συγχρονισμός ήταν επιτυχής.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Σφάλμα Ρύθμισης.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Ματαίωση από Χρήστη.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>Παύση συγχρονισμού.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Παύση συγχρονισμού)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>Δεν επιλέχθηκε έγκυρος φάκελος!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>Η επιλεγμένη διαδρομή δεν είναι φάκελος!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Δεν έχετε δικαιώματα εγγραφής στον επιλεγμένο φάκελο!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation>Ο τοπικός φάκελος% 1 περιέχει έναν συμβολικό σύνδεσμο. Ο στόχος συνδέσμου περιέχει έναν ήδη συγχρονισμένο φάκελο.Παρακαλώ επιλέξτε ένα άλλο!</translation>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation>Υπάρχει ήδη συγχρονισμός από το διακομιστή σε αυτόν τον τοπικό φάκελο. Επιλέξτε έναν άλλο τοπικό φάκελο!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Ο τοπικός φάκελος %1 περιέχει ήδη ένα φάκελο που χρησιμοποιείται σε μια σύνδεση συγχρονισμού φακέλου. Παρακαλώ επιλέξτε άλλον!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Ο τοπικός φάκελος %1 περιέχεται ήδη σε φάκελο που χρησιμοποιείται σε μια σύνδεση συγχρονισμού. Παρακαλώ επιλέξτε άλλον!</translation>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation>Ο τοπικός φάκελος %1 είναι συμβολικός σύνδεσμος. Ο σύνδεσμος που παραπέμπει περιέχεται ήδη σε φάκελο που βρίσκεται σε συγχρονισμό. Παρακαλώ επιλέξτε άλλον!</translation>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -943,7 +1004,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Προσθήκη σύνδεσης συγχρονισμού φακέλου</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>Συγχρονισμός με τοπικό φάκελο</translation>
</message>
@@ -978,7 +1039,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Σφάλμα κατά τη φόρτωση της λίστας φακέλων από το διακομιστή.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Αποσύνδεση</translation>
</message>
@@ -993,115 +1054,133 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Έλεγχος αλλαγών στο &apos;%1&apos;.</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>Συγχρονισμός %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>λήψη %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>μεταφόρτωση %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 από %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>Απομένει %5, %1 από %2, αρχείο %3 από %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 από %2, αρχείο %3 από %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>αρχείο %1 από %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>Αναμονή...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>Αναμονή για %n άλλο φάκελο...</numerusform><numerusform>Αναμονή για %n άλλους φακέλους...</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>Προετοιμασία για συγχρονισμό...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>Προσθήκη Σύνδεσης Συγχρονισμού Φακέλου</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>Προσθήκη Σύνδεσης Συγχρονισμού</translation>
</message>
@@ -1109,17 +1188,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Κλικάρετε για να επιλέξετε έναν τοπικό φάκελο προς συγχρονισμό.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Εισάγετε τη διαδρομή προς τον τοπικό φάκελο.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Επιλογή του φακέλου προέλευσης</translation>
</message>
@@ -1127,60 +1206,68 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Δημιουργία Απομακρυσμένου Φακέλου</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>Εισάγετε το όνομα του νέου φακέλου που θα δημιουργηθεί παρακάτω &apos;%1&apos;:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>Επιτυχής δημιουργία φακέλου στο %1.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>Η πιστοποίηση απέτυχε κατά την πρόσβαση %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>Αποτυχία δημιουργίας φακέλου στο %1. Παρακαλώ ελέγξτε χειροκίνητα.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>Αδυναμία εμφάνισης ενός φακέλου. Σφάλμα: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Επιλέξτε να συγχρονίσετε ολόκληρο το λογαριασμό</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Αυτός ο φάκελος συγχρονίζεται ήδη.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Ο φάκελος &lt;i&gt;%1&lt;/i&gt;, ο οποίος είναι γονεϊκός φάκελος του &lt;i&gt;%2&lt;/i&gt;, συγχρονίζεται ήδη.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Προειδοποίηση:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Προειδοποίηση:&lt;/b&gt;</translation>
</message>
@@ -1188,22 +1275,22 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>Δεν ελήφθη E-Tag από το διακομιστή, ελέγξτε το διακομιστή μεσολάβησης/πύλη</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>Ελήφθη διαφορετικό E-Tag για συνέχιση. Επανάληψη την επόμενη φορά.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>Ο διακομιστής επέστρεψε εσφαλμένο πεδίο τιμών</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Λήξη Χρόνου Αναμονής Σύνδεσης</translation>
</message>
@@ -1226,23 +1313,38 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Για το </translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Για προχωρημένους</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation>Ζητήστε επιβεβαίωση πριν τον συγχρονισμό φακέλων μεγαλύτερων από</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>ΜΒ</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation>Ζητήστε επιβεβαίωση πριν τον συγχρονισμό εξωτερικών αποθηκευτικών χώρων</translation>
</message>
@@ -1262,31 +1364,67 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Χρήση &amp;Μονόχρωμων εικονιδίων</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>Εισαγωγή &amp; Αγνοούμενα Αρχεία</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>S&amp;πως κατάρρευση αναφοράς</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>Σχετικά</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>Ενημερώσεις</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>&amp;Επανεκκίνηση &amp;&amp; Ενημέρωση</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Ακύρωση</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1354,7 +1492,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Αφαίρεση</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1363,27 +1501,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
Τα στοιχεία όπου επιτρέπεται η διαγραφή θα διαγράφονται εάν εμποδίζουν την αφαίρεση ενός φακέλου αρχείων. Αυτό είναι χρήσιμο για μετα-δεδομένα.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Αδυναμία ανοίγματος αρχείου</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>Αδυναμία εγγραφής αλλαγών στο &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Προσθήκη Προτύπου Αγνόησης</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Προσθήκη νέου προτύπου αγνόησης:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Αυτή η είσοδος παρέχεται από το σύστημα στο &apos;%1&apos; και δεν μπορεί να τροποποιηθεί σε αυτή την προβολή.</translation>
</message>
@@ -1413,7 +1551,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Φάκελος</translation>
</message>
@@ -1428,35 +1566,45 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Αντιγραφή</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Ώρα</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Αρχείο</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1482,36 +1630,48 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Εκκαθάριση</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Εκκαθάριση του αρχείου συμβάντων.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>Α&amp;ποθήκευση</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Αποθήκευση του αρχείου καταγραφών στο δίσκο για αποσφαλμάτωση. </translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Αποθήκευση αρχείου συμβάντων</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Σφάλμα</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>Αδυναμία εγγραφής στο αρχείο καταγραφής %1</translation>
</message>
@@ -1519,12 +1679,12 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Σφάλμα</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;Το αρχείο &apos;%1&apos;&lt;br/&gt;δεν μπορεί να ανοιχθεί για εγγραφή.&lt;br/&gt;&lt;br/&gt;Το αρχείο καταγραφής &lt;b&gt;δεν&lt;/b&gt; μπορεί να αποθηκευτεί!&lt;/nobr&gt; </translation>
</message>
@@ -1532,27 +1692,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Νέα Έκδοση Διαθέσιμη </translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;Μια νέα έκδοση του %1 Δέκτη είναι διαθέσιμη.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; είναι διαθέσιμη για λήψη. Η εγκατεστημένη έκδοση είναι %3.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Παράλειψη αυτής της έκδοσης</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Παράλειψη αυτή τη φορά</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Λήψη ενημέρωσης</translation>
</message>
@@ -1640,27 +1800,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation>Αυτόματος περιορισμός</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Όνομα συστήματος του ενδιάμεσου διακομιστή</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Όνομα χρήστη για τον ενδιάμεσο διακομιστή</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Κωδικός πρόσβασης για τον ενδιάμεσο διακομιστή</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>Ενδιάμεσος HTTP(S) </translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>Ενδιάμεσος SOCKS5</translation>
</message>
@@ -1668,23 +1828,23 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>Ολοκληρώθηκε στο %1</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>Κλείσιμο σε λίγα δευτερόλεπτα...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation>Το αίτημα% 1 απέτυχε στο% 2</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation>&apos;% 1&apos; επιλέχθηκε στο% 2</translation>
@@ -1693,32 +1853,32 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -1726,59 +1886,59 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Νέα %1 Ενημέρωση Έτοιμη</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>Μια νέα ενημέρωση για %1 πρόκειται να εγκατασταθεί. Ο βοηθός ενημέρωσης μπορεί να ζητήσει
επιπλέον παραχωρήσεις δικαιωμάτων κατά τη διαδικασία.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>Λήψη έκδοσης %1. Παρακαλώ περιμένετε...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>Αδυναμία λήψης της ενημέρωσης. Παρακαλώ κλικάρετε &lt;a href=&apos;%1&apos;&gt;εδώ&lt;/a&gt; για να κατεβάσετε την ενημέρωση χειροκίνητα.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Αδυναμία ελέγχου για νέες ενημερώσεις.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>Είναι διαθέσιμη η έκδοση %1 %2. Επανεκκινήστε την εφαρμογή για να ξεκινήσει η αναβάθμιση.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>Είναι διαθέσιμη η έκδοση %1 %2. Χρησιμοποιήστε το εργαλείο αναβάθμισης του συστήματός σας για να την εγκαταστήσετε.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Έλεγχος διακομιστή ενημερώσεων...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>Η κατάσταση ενημέρωσης είναι άγνωστη: Δεν έγινε έλεγχος για για νέες ενημερώσεις.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>Δεν υπάρχουν ενημερώσεις διαθέσιμες. Η εγκατάστασή σας βρίσκεται στην τελευταία έκδοση.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Έλεγχος για ενημερώσεις</translation>
</message>
@@ -1786,43 +1946,43 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Σύνδεση με %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Ρύθμιση επιλογών τοπικών φακέλων</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Σύνδεση...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>Ο %1 φάκελος &apos;%2&apos; είναι συγχρονισμένος με τον τοπικό φάκελο &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>Συγχρονισμός φακέλου &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Προσοχή:&lt;/strong&gt; Ο τοπικός φάκελος δεν είναι άδειος. Επιλέξτε μια επίλυση!&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Τοπικός Φάκελος Συγχρονισμού</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1881,15 +2041,20 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Σύνδεση με %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation>Αντιγραφή συνδέσμου στο πρόχειρο</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1920,153 +2085,163 @@ It is not advisable to use it.</source>
<source>&amp;Next &gt;</source>
<translation>&amp;Επόμενο &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>Μη έγκυρη URL</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Επιτυχής σύνδεση στο %1: %2 έκδοση %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Αποτυχία σύνδεσης με το %1 στο %2:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>Λήξη χρονικού ορίου κατά τη σύνδεση σε %1 σε %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Προσπάθεια σύνδεσης στο %1 για %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>Η πιστοποιημένη αίτηση στον διακομιστή ανακατευθύνθηκε σε &apos;%1&apos;. Το URL είναι εσφαλμένο, ο διακομιστής δεν έχει διαμορφωθεί σωστά.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>Υπήρξε μια άκυρη απόκριση σε μια πιστοποιημένη αίτηση </translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>Απαγόρευση πρόσβασης από τον διακομιστή. Για να επιβεβαιώσετε ότι έχετε δικαιώματα πρόσβασης, &lt;a href=&quot;%1&quot;&gt;πατήστε εδώ&lt;/a&gt; για να προσπελάσετε την υπηρεσία με το πρόγραμμα πλοήγησής σας.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>Μη έγκυρη URL</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>Ο τοπικός φάκελος συγχρονισμού %1 υπάρχει ήδη, ρύθμιση για συγχρονισμό.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>Δημιουργία τοπικού φακέλου συγχρονισμού %1...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>οκ</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>απέτυχε.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>Αδυναμία δημιουργίας τοπικού φακέλου %1 </translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>Δεν προσδιορίστηκε κανένας απομακρυσμένος φάκελος!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Σφάλμα: %1 </translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>δημιουργία φακέλου στο ownCloud: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>Ο απομακρυσμένος φάκελος %1 δημιουργήθηκε με επιτυχία.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>Ο απομακρυσμένος φάκελος %1 υπάρχει ήδη. Θα συνδεθεί για συγχρονισμό. </translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>Η δημιουργία φακέλου είχε ως αποτέλεσμα τον κωδικό σφάλματος HTTP %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>Η δημιουργία απομακρυσμένου φακέλλου απέτυχε επειδή τα διαπιστευτήρια είναι λάθος!&lt;br/&gt;Παρακαλώ επιστρέψετε και ελέγξετε τα διαπιστευτήριά σας.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Η δημιουργία απομακρυσμένου φακέλου απέτυχε, πιθανώς επειδή τα διαπιστευτήρια που δόθηκαν είναι λάθος.&lt;/font&gt;&lt;br/&gt;Παρακαλώ επιστρέψτε πίσω και ελέγξτε τα διαπιστευτήρια σας.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>Η δημιουργία απομακρυσμένου φακέλου %1 απέτυχε με σφάλμα &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>Μια σύνδεση συγχρονισμού από τον απομακρυσμένο κατάλογο %1 σε %2 έχει ρυθμιστεί. </translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Επιτυχής σύνδεση με %1!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>Αδυναμία σύνδεσης στον %1. Παρακαλώ ελέξτε ξανά.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Αποτυχία μετονομασίας φακέλου</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>Αδυναμία αφαίρεσης και δημιουργίας αντιγράφου ασφαλείας του φακέλου διότι ο φάκελος ή ένα αρχείο του είναι ανοικτό από άλλο πρόγραμμα. Παρακαλώ κλείστε τον φάκελο ή το αρχείο και πατήστε επανάληψη ή ακυρώστε την ρύθμιση.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Επιτυχής δημιουργία τοπικού φακέλου %1 για συγχρονισμό!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2074,14 +2249,31 @@ It is not advisable to use it.</source>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>%1 Οδηγός Σύνδεσης</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Παράλειψη διαμόρφωσης φακέλων</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2105,7 +2297,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>Λανθασμένη απάντηση JSON από την ιστοσελίδα poll</translation>
</message>
@@ -2113,7 +2305,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>Σφάλμα εγγραφής μεταδεδομένων στην βάση δεδομένων</translation>
</message>
@@ -2121,47 +2313,47 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>Το αρχείο %1 δεν είναι δυνατό να ληφθεί λόγω διένεξης με το όνομα ενός τοπικού αρχείου!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>Ο διαθέσιμος χώρος στο δίσκο είναι λιγότερος από %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>Το αρχείο διαγράφηκε από τον διακομιστή</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>Η λήψη του αρχείου δεν ολοκληρώθηκε.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation>Το ληφθέν αρχείο είναι άδειο, παρόλο που ο διακομιστής ανακοίνωσε ότι θα έπρεπε να ήταν% 1.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>Το αρχείο %1 δεν είναι δυνατό να αποθηκευτεί λόγω διένεξης με το όνομα ενός τοπικού ονόματος αρχείου!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>Το αρχείο έχει αλλάξει από όταν ανακαλύφθηκε</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>Σφάλμα εγγραφής μεταδεδομένων στην βάση δεδομένων</translation>
</message>
@@ -2169,12 +2361,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; Η Αποκατάσταση Απέτυχε: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation>Ένα αρχείο ή ένας κατάλογος αφαιρέθηκε από ένα διαμοιρασμένο κατάλογο μόνο για ανάγνωση, αλλά η επαναφορά απέτυχε: %1</translation>
</message>
@@ -2182,22 +2374,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>αδυναμία διαγραφής αρχείου %1, σφάλμα: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>Προσοχή, πιθανή διένεξη κεφαλαίων-πεζών γραμμάτων με το %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>αδυναμία δημιουργίας φακέλου %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>Σφάλμα εγγραφής μεταδεδομένων στην βάση δεδομένων</translation>
</message>
@@ -2205,17 +2397,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>Σφάλμα κατά την αφαίρεση &apos;%1&apos;: %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>Αδυναμία διαγραφής του φακέλου &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>Δεν ήταν δυνατή η αφαίρεση του %1 λόγω διένεξης με το όνομα ενός τοπικού αρχείου</translation>
</message>
@@ -2223,13 +2415,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>Το αρχείο %1 δεν είναι δυνατό να μετονομαστεί σε %2 λόγω μιας διένεξης με το όνομα ενός τοπικού αρχείου</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>Σφάλμα εγγραφής μεταδεδομένων στην βάση δεδομένων</translation>
</message>
@@ -2237,12 +2429,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>Το αρχείο αφαιρέθηκε από ένα διαμοιρασμένο κατάλογο μόνο για ανάγνωση. Το αρχείο επαναφέρθηκε.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>Ο διακομιστής επέστρεψε εσφαλμένο κωδικό HTTP. Αναμενόταν 204, αλλά ελήφθη &quot;%1 %2&quot;.</translation>
</message>
@@ -2250,12 +2437,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Ο διακομιστής επέστρεψε εσφαλμένο κωδικό HTTP. Αναμενόταν 201, αλλά ελήφθη &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>Σφάλμα εγγραφής μεταδεδομένων στην βάση δεδομένων</translation>
</message>
@@ -2263,28 +2450,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Αυτός ο φάκελος δεν πρέπει να μετονομαστεί. Μετονομάζεται πίσω στο αρχικό του όνομα.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Αυτός ο φάκελος δεν πρέπει να μετονομαστεί. Παρακαλώ ονομάστε τον ξανά Κοινόχρηστος.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>Το αρχείο μετονομάστηκε αλλά είναι τμήμα ενός διαμοιρασμένου καταλόγου μόνο για ανάγνωση. Το αρχικό αρχείο επαναφέρθηκε.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Ο διακομιστής επέστρεψε εσφαλμένο κωδικό HTTP. Αναμενόταν 201, αλλά ελήφθη &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>Σφάλμα εγγραφής μεταδεδομένων στην βάση δεδομένων</translation>
</message>
@@ -2292,33 +2464,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation>Το αρχείο % 1 δεν μπορεί να ανέβει επειδή υπάρχει ένα άλλο αρχείο με το ίδιο όνομα, που διαφέρει μόνο στη περίπτωση,</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Το αρχείο αφαιρέθηκε</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>Το τοπικό αρχείο τροποποιήθηκε κατά τη διάρκεια του συγχρονισμού. Θα συγχρονιστεί πάλι.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>Το τοπικό αρχείο τροποποιήθηκε κατά τον συγχρονισμό.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>Σφάλμα εγγραφής μεταδεδομένων στην βάση δεδομένων</translation>
</message>
@@ -2326,27 +2498,27 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>Το τοπικό αρχείο αφαιρέθηκε κατά το συγχρονισμό.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>Το τοπικό αρχείο τροποποιήθηκε κατά τον συγχρονισμό.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation>Ο διακομιστής επέστρεψε απροσδόκητο κωδικό (%1) </translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation>Απουσία ID αρχείου από τον διακομιστή</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation>Απουσία ETag από τον διακομιστή</translation>
</message>
@@ -2354,27 +2526,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>Το αρχείο υπέστη επεξεργασία τοπικά αλλά είναι τμήμα ενός διαμοιρασμένου καταλόγου μόνο για ανάγνωση. Επαναφέρθηκε και το επεξεργασμένο βρίσκεται στο αρχείο συγκρούσεων.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>Η διεύθυνση poll URL λείπει</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>Το τοπικό αρχείο αφαιρέθηκε κατά το συγχρονισμό.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>Το τοπικό αρχείο τροποποιήθηκε κατά τον συγχρονισμό.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation>Ο διακομιστής δεν αναγνώρισε το τελευταίο τμήμα. (Δεν υπήρχε e-tag)</translation>
</message>
@@ -2392,42 +2559,47 @@ It is not advisable to use it.</source>
<translation>TextLabel</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Άνοιγμα στον περιηγητή ιστού</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Ώρα</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Αρχείο</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Φάκελος</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Ενέργεια</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Μέγεθος</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>Πρωτόκολλο τοπικού συγχρονισμού</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Αντιγραφή</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Αντιγραφή της λίστας δραστηριότητας στο πρόχειρο.</translation>
</message>
@@ -2468,7 +2640,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Επιλέξτε Τι θα Συγχρονιστεί</translation>
</message>
@@ -2476,33 +2648,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Φόρτωση ...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation>Απορρίψτε τους απομακρυσμένους φακέλους που δεν θέλετε να συγχρονιστούν.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Όνομα</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Μέγεθος</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>Δεν υπάρχουν υποφάκελοι αυτή τη στιγμή στον διακομιστή.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation>Παρουσιάστηκε σφάλμα κατά την φόρτωση της λίστας των υπο-φακέλων</translation>
</message>
@@ -2523,22 +2695,22 @@ It is not advisable to use it.</source>
<translation>Ρυθμίσεις</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Δραστηριότητα</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Γενικά</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Δίκτυο</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Λογαριασμός</translation>
</message>
@@ -2546,28 +2718,28 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Δραστηριότητα</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Γενικά</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Δίκτυο</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Λογαριασμός</translation>
</message>
@@ -2595,42 +2767,42 @@ It is not advisable to use it.</source>
<translation>Διαδρομή ownCloud:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>%1 Διαμοιράστηκε</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Φάκελος: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>Ο διακομιστής δεν επιτρέπει τον διαμοιρασμό</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation>Ανάκτηση των μέγιστων δυνατών δικαιωμάτων κοινής χρήσης από το διακομιστή ...</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Το αρχείο δεν μπορεί να διαμοιραστεί γιατί διαμοιράστηκε χωρίς δικαιώματα διαμοιρασμού.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>Χρήστες και Ομάδες</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>Δημόσιοι σύνδεσμοι</translation>
</message>
@@ -2643,7 +2815,17 @@ It is not advisable to use it.</source>
<translation>Διαμοιρασμός NewDocument.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>TextLabel</translation>
</message>
@@ -2673,19 +2855,24 @@ It is not advisable to use it.</source>
<translation>Ορισμός κωδικού πρόσβασης</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>Εμφάνιση αρχείου καταγραφής</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Επιτρέπεται η επεξεργασία</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2693,95 +2880,95 @@ It is not advisable to use it.</source>
<translation>Οποιοσδήποτε με τη σύνδεση έχει πρόσβαση στο αρχείο / φάκελο</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>Π&amp;ροστασία με κωδικό</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Προστατευμένο με κωδικό πρόσβασης</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Το αρχείο δεν μπορεί να διαμοιραστεί γιατί διαμοιράστηκε χωρίς δικαιώματα διαμοιρασμού.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Διαγραφή</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation>Άνοιγμα συνδέσμου στον περιηγητή</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation>Αντιγραφή συνδέσμου στο πρόχειρο</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Αποστολή συνδέσμου με αλληλογραφία</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Ακύρωση</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation>Δημόσιος σύνδεσμος</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>Ο δημόσιος &amp;διαμοιρασμός απαιτεί κωδικό πρόσβασης</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Παρακαλούμε ορίστε Κωδικό</translation>
</message>
@@ -2804,32 +2991,32 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation>Άνοιγμα συνδέσμου στον περιηγητή</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation>Αντιγραφή συνδέσμου στο πρόχειρο</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Αποστολή συνδέσμου με αλληλογραφία</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>Κανένα αποτέλεσμα για &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
@@ -2842,37 +3029,38 @@ It is not advisable to use it.</source>
<translation>Φόρμα</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>TextLabel</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>δυνατότητα επεξεργασίας</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>δυνατότητα διαμοιρασμού</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>δημιουργία</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>αλλαγή</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>διαγραφή</translation>
</message>
@@ -2916,143 +3104,176 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>Διαμοιρασμός με %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation>Διαμοιρασμός</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation>Αντιγραφή ιδιωτικού συνδέσμου στο πρόχειρο</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation>Αποστολή ιδιωτικού συνδέσμου με αλληλογραφία...</translation>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Άνοιγμα στον περιηγητή ιστού</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Λεπτομέρειες Πιστοποιητικού&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Κοινό Όνομα (ΚΟ):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>Εναλλακτικά Ονόματα Υποκειμένου:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Οργανισμός (Ο):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Μονάδα Οργανισμού (ΜΟ):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Νομός/Περιφέρεια:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>Χώρα:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Σειριακός αριθμός:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Εκδότης&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Εκδότης:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Εκδόθηκε στις:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Λήγει στις:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Αποτυπώματα&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>p&gt;&lt;b&gt;Σημείωση:&lt;/b&gt; Αυτό το πιστοποιητικό εγκρίθηκε χειροκίνητα&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (αυτό-πιστοποιημένο)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>Η σύνδεση είναι κρυπτογραφημένη με %1 bit %2
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation>Χωρίς υποστήριξη για ταυτοποιητές συνεδρίας SSL</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Πληροφορίες πιστοποιητικού:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>Αυτή η σύνδεση δεν είναι ασφαλής καθώς δεν είναι κρυπτογραφημένη.
@@ -3140,305 +3361,270 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Επιτυχία.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>Το CSync απέτυχε να φορτώσει ο αρχείο καταλόγου. Το αρχείο καταλόγου έχει καταστραφεί.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;Το πρόσθετο του %1 για το csync δεν μπόρεσε να φορτωθεί.&lt;br/&gt;Παρακαλούμε επαληθεύσετε την εγκατάσταση!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>Μοιραίο σφάλμα παράμετρου CSync.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>Η ενημέρωση του βήματος επεξεργασίας του CSync απέτυχε.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>CSync στάδιο επεξεργασίας συμφιλίωση απέτυχε. </translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>Το CSync δεν μπόρεσε να πιστοποιηθεί στο διακομιστή μεσολάβησης.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>Το CSync απέτυχε να διερευνήσει το διαμεσολαβητή ή το διακομιστή.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>Το CSync απέτυχε να πιστοποιηθεί στο διακομιστή 1%. </translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>Το CSync απέτυχε να συνδεθεί με το δίκτυο.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>Διακοπή σύνδεσης δικτύου λόγω παρέλευσης χρονικού ορίου.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>Ένα σφάλμα μετάδοσης HTTP συνέβη.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation>Ο προσαρτημένος φάκελος δεν είναι διαθέσιμος στον δικομιστή προσωρινά</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>Παρουσιάστηκε σφάλμα κατά το άνοιγμα του φακέλου</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>Σφάλμα κατά την ανάγνωση του φακέλου.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>Το Αρχείο/ο Φάκελος αγνοήθηκε επειδή είναι κρυφό.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation>Μόνο %1 είναι διαθέσιμα, απαιτούνται τουλάχιστον %2 για την εκκίνηση</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation>Δεν επιτρέπεται επειδή δεν έχετε δικαιώματα να προσθέσετε γονικό κατάλογο</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation>Δεν επιτρέπεται επειδή δεν έχετε δικαιώματα να προσθέσετε αρχεία σε αυτόν τον φάκελο</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: Δεν υπάρχει διαθέσιμος χώρος στο διακομιστή 1%.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>Άγνωστο σφάλμα CSync.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Ματαιώθηκε από το χρήστη</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>Το CSync απέτυχε να αποκτήσει πρόσβαση</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
- <translation>Το CSync απέτυχε να φορτώσει ή να δημιουργήσει το αρχείο καταγραφής. Βεβαιωθείτε ότι έχετε άδεια ανάγνωσης και εγγραφής στον τοπικό κατάλογο συγχρονισμού.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
- <translation>Το CSync απέτυχε λόγω κατάστασης &quot;permission denied&quot;</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
- <translation>Το CSync προσπάθησε να δημιουργήσει φάκελο που υπάρχει ήδη.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>Η υπηρεσία δεν είναι διαθέσιμη προσωρινά</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>Δεν επιτρέπεται η πρόσβαση</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>Προέκυψε ένα εσωτερικό σφάλμα με αριθμό %1.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>Οι συμβολικού σύνδεσμοι δεν υποστηρίζονται για το συγχρονισμό.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>Το αρχείο περιέχεται στη λίστα αρχείων προς αγνόηση.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation>Τα ονόματα αρχείων που διαρκούν μια ορισμένη χρονική περίοδο δεν υποστηρίζονται σε αυτό το σύστημα αρχείων.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation>Τα ονόματα αρχείων που περιέχουν τον χαρακτήρα &apos;% 1&apos; δεν υποστηρίζονται σε αυτό το σύστημα αρχείων.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation>Το όνομα αρχείου είναι ένα κατοχυρωμένο όνομα σε αυτό το σύστημα αρχείων.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation>Το όνομα του αρχείου περιέχει συνεχόμενα κενά.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>Το όνομα αρχείου είνια πολύ μεγάλο.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>Απέτυχε.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>Η κωδικοποίηση του ονόματος αρχείου δεν είναι έγκυρη</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>Μη έγκυροι χαρακτήρες, παρακαλώ μετονομάστε το &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation>Αδυναμία ανάγνωσης της μαύρης λίστας από την τοπική βάση δεδομένων</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation>Αδυναμία ανάγνωσης από το ημερολόγιο συγχρονισμού.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>Αδυναμία ανοίγματος του αρχείου συγχρονισμού</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>Το όνομα αρχείου περιέχει έναν τουλάχιστον μη έγκυρο χαρακτήρα</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>Αγνοήθηκε εξαιτίας της μαύρης λίστας &quot;διάλεξε τι να συγχρονιστεί&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation>Δεν επιτρέπεται επειδή δεν έχετε δικαιώματα να προσθέσετε υποφακέλους σε αυτό τον φάκελο</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>Δεν επιτρέπεται να μεταφορτώσετε αυτό το αρχείο επειδή είναι μόνο για ανάγνωση στο διακομιστή, αποκατάσταση σε εξέλιξη</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>Δεν επιτρέπεται η αφαίρεση, αποκατάσταση σε εξέλιξη</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>Οι τοπικοί φάκελοι και ο φάκελος κοινής χρήσης αφαιρέθηκαν.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>Η μετακίνηση δεν επιτρέπεται, το αντικείμενο αποκαταστάθηκε</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>Η μετακίνηση δεν επιτρέπεται επειδή το %1 είναι μόνο για ανάγνωση</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>ο προορισμός</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>η προέλευση</translation>
</message>
@@ -3462,17 +3648,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Έκδοση %1. Για περισσότερες πληροφορίες δείτε &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation>&lt;p&gt;Πνευματικά δικαιώματα ownCloud, GmbH&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;Διανέμεται από 1% και υπό την άδεια GNU General Public License (GPL) έκδοση 2.0.&lt;br/&gt;% 2 και το 2% το λογότυπο είναι σήματα κατατεθέντα της 1% στις Ηνωμένες Πολιτείες, άλλες χώρες, ή και τα δύο.&lt;/ p&gt;</translation>
</message>
@@ -3503,81 +3689,81 @@ It is not advisable to use it.</source>
<translation>Παρκαλώ συνδεθείτε</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Φάκελος %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Δεν έχουν ρυθμιστεί φάκελοι συγχρονισμού.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Άνοιγμα στον περιηγητή ιστού</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Σύνδεση...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Αποσύνδεση</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Πρόσφατες Αλλαγές</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Έλεγχος αλλαγών στο &apos;%1&apos;.</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Φάκελοι υπό Διαχείριση:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Άνοιγμα φακέλου &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Άνοιγμα %1 στον περιηγητή</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Άγνωστη κατάσταση</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Ρυθμίσεις...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Λεπτομέρειες...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Βοήθεια</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>Κλείσιμο %1</translation>
</message>
@@ -3592,11 +3778,6 @@ It is not advisable to use it.</source>
<translation>Μη υποστηριζόμενη έκδοση διακομιστή</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation>Ο διακομιστής στο λογαριασμό% 1 εκτελεί μια παλιά και μη υποστηριζόμενη έκδοση% 2. Η χρήση αυτού του προγράμματος-πελάτη με μη υποστηριζόμενες εκδόσεις διακομιστών δεν είναι δοκιμασμένη και ενδεχομένως επικίνδυνη. Προχωρήστε με δική σας ευθύνη.</translation>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Αποσυνδεδεμένο</translation>
@@ -3628,116 +3809,129 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation>Παύθηκε ο συγχρονισμός</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation>Σφάλμα κατά τον συγχρονισμό</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation>Δεν ρυθμίστηκαν φάκελοι συγχρονισμού</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation>Αναίρεση παύσης όλων των φακέλων</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>Παύση όλων των φακέλων</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>Αναίρεση παύσης όλων των συγχρονισμών</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>Αναίρεση παύσης συγχρονσμού</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>Παύση όλων των συγχρονισμών</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>Παύση συγχρονισμού</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Έξοδος από όλους τους λογαριασμούς</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Είσοδος σε όλους τους λογαριασμούς</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>Νέος λογαριασμός...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>Σχετικά %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>Κατάρρευση τώρα</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Κανένα στοιχείο δεν συγχρονίστηκε πρόσφατα</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Συγχρονισμός %1 από %2 (%3 απομένουν)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation>Συγχρονισμός %1 από %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Συγχρονισμός %1 (%2 απομένουν)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>Συγχρονισμός %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Ενημερωμένο</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation type="unfinished"/>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3749,9 +3943,9 @@ It is not advisable to use it.</source>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>TextLabel</translation>
</message>
@@ -3787,11 +3981,22 @@ It is not advisable to use it.</source>
<translation>Επιβεβαίωση πριν τον συγχρονισμό &amp;εξωτερικών αποθηκευτικών χώρων</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Επιλέξτε τι θα συγχρονιστεί</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>&amp;Τοπικός Φάκελος</translation>
@@ -3808,11 +4013,16 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>Σ&amp;υγχρονισμός όλων από τον διακομιστή</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Μήνυμα κατάστασης</translation>
</message>
@@ -3849,7 +4059,7 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
+ <source>An error occurred while connecting. Please try again.</source>
<translation type="unfinished"/>
</message>
<message>
@@ -4029,7 +4239,7 @@ It is not advisable to use it.</source>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;Δημιουργήθηκε από την διασκευή Git &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; στο %3, %4 χρησιμοποιώντας Qt %5, %6&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4127,52 +4337,52 @@ It is not advisable to use it.</source>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Απροσδιόριστη κατάσταση</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Αναμονή έναρξης συγχρονισμού</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>Ο συγχρονισμός εκτελείται</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Επιτυχημένος Συγχρονισμός</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Επιτυχία Συγχρονισμού, κάποια αρχεία αγνοήθηκαν.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Σφάλμα Συγχρονισμού</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Σφάλμα Ρυθμίσεων</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Προετοιμασία για συγχρονισμό</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Ματαίωση σε εξέλιξη...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>Παύση συγχρονισμού</translation>
</message>
@@ -4180,22 +4390,22 @@ It is not advisable to use it.</source>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation>Αδυναμία ανοίγματος περιηγητή</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation>Αδυναμία ανοίγματος πελάτη ηλεκτρονικής αλληλογραφίας</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation>Παρουσιάστηκε σφάλμα κατά την εκκίνηση του προγράμματος-πελάτη ηλεκτρονικού ταχυδρομείου για τη δημιουργία νέου μηνύματος. Ίσως δεν έχει ρυθμιστεί προεπιλεγμένο πρόγραμμα-πελάτη ηλεκτρονικού ταχυδρομείου;</translation>
</message>
diff --git a/translations/client_en.ts b/translations/client_en.ts
index cec124faa..f17499c10 100644
--- a/translations/client_en.ts
+++ b/translations/client_en.ts
@@ -2,6 +2,25 @@
<!DOCTYPE TS>
<TS version="2.1" language="en_US">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -78,17 +97,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation type="unfinished"></translation>
</message>
@@ -137,8 +156,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
@@ -168,184 +187,184 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation type="unfinished"></translation>
</message>
@@ -353,47 +372,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation type="unfinished"></translation>
</message>
@@ -414,44 +433,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation type="unfinished"></translation>
</message>
@@ -471,32 +490,32 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -504,7 +523,7 @@
</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -512,12 +531,12 @@
</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation type="unfinished"></translation>
</message>
@@ -563,17 +582,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation type="unfinished"></translation>
</message>
@@ -604,7 +648,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"></translation>
</message>
@@ -612,32 +656,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation type="unfinished"></translation>
</message>
@@ -645,59 +689,67 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -705,7 +757,7 @@
</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -713,7 +765,7 @@
</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -721,7 +773,7 @@
</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -729,7 +781,7 @@
</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -737,7 +789,7 @@
</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -745,12 +797,12 @@
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -758,39 +810,58 @@
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder &apos;%1&apos; folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -798,46 +869,46 @@ If you decide to delete the files, they will be unavailable to you, unless you a
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder &apos;%1&apos; were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder &apos;%1&apos;.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation type="unfinished"></translation>
</message>
@@ -845,115 +916,105 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation type="unfinished"></translation>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -963,7 +1024,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation type="unfinished"></translation>
</message>
@@ -998,7 +1059,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation type="unfinished"></translation>
</message>
@@ -1013,97 +1074,107 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing &apos;foo.txt&apos;, &apos;bar.txt&apos;&quot;</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -1111,20 +1182,28 @@ Continuing the sync as normal will cause all your files to be overwritten by an
</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation type="unfinished"></translation>
</message>
@@ -1132,17 +1211,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation type="unfinished"></translation>
</message>
@@ -1150,60 +1229,68 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
@@ -1211,22 +1298,22 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation type="unfinished"></translation>
</message>
@@ -1249,23 +1336,38 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation type="unfinished"></translation>
</message>
@@ -1285,31 +1387,67 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
- <source>S&amp;how crash reporter</source>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
+ <source>S&amp;how crash reporter</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
+ <location filename="../src/gui/generalsettings.ui" line="53"/>
<source>Updates</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1377,34 +1515,34 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation type="unfinished"></translation>
</message>
@@ -1434,7 +1572,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation type="unfinished"></translation>
</message>
@@ -1449,35 +1587,45 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1503,36 +1651,48 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation type="unfinished"></translation>
</message>
@@ -1540,12 +1700,12 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation type="unfinished"></translation>
</message>
@@ -1553,27 +1713,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation type="unfinished"></translation>
</message>
@@ -1661,27 +1821,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation type="unfinished"></translation>
</message>
@@ -1689,23 +1849,23 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as &apos;failed at 09:58pm&apos;</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as &apos;selected at 09:58pm&apos;</extracomment>
<translation type="unfinished"></translation>
@@ -1714,32 +1874,32 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
@@ -1747,58 +1907,58 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation type="unfinished"></translation>
</message>
@@ -1806,43 +1966,43 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation type="unfinished"></translation>
</message>
@@ -1901,15 +2061,20 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1939,153 +2104,163 @@ It is not advisable to use it.</source>
<source>&amp;Next &gt;</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation type="unfinished"></translation>
</message>
@@ -2093,13 +2268,30 @@ It is not advisable to use it.</source>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -2124,7 +2316,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation type="unfinished"></translation>
</message>
@@ -2132,7 +2324,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"></translation>
</message>
@@ -2140,47 +2332,47 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"></translation>
</message>
@@ -2188,12 +2380,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation type="unfinished"></translation>
</message>
@@ -2201,22 +2393,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"></translation>
</message>
@@ -2224,17 +2416,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation type="unfinished"></translation>
</message>
@@ -2242,13 +2434,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"></translation>
</message>
@@ -2256,12 +2448,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation type="unfinished"></translation>
</message>
@@ -2269,12 +2456,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"></translation>
</message>
@@ -2282,28 +2469,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"></translation>
</message>
@@ -2311,33 +2483,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"></translation>
</message>
@@ -2345,27 +2517,27 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation type="unfinished"></translation>
</message>
@@ -2373,27 +2545,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation type="unfinished"></translation>
</message>
@@ -2411,42 +2578,47 @@ It is not advisable to use it.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation type="unfinished"></translation>
</message>
@@ -2487,7 +2659,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation type="unfinished"></translation>
</message>
@@ -2495,33 +2667,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation type="unfinished"></translation>
</message>
@@ -2542,22 +2714,22 @@ It is not advisable to use it.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation type="unfinished"></translation>
</message>
@@ -2565,28 +2737,28 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation type="unfinished"></translation>
</message>
@@ -2614,42 +2786,42 @@ It is not advisable to use it.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation type="unfinished"></translation>
</message>
@@ -2662,7 +2834,17 @@ It is not advisable to use it.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation type="unfinished"></translation>
</message>
@@ -2692,115 +2874,120 @@ It is not advisable to use it.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="20"/>
- <source>Anyone with the link has access to the file/folder</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
- <source>P&amp;assword protect</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="20"/>
+ <source>Anyone with the link has access to the file/folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
+ <source>P&amp;assword protect</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation type="unfinished"></translation>
</message>
@@ -2823,32 +3010,32 @@ It is not advisable to use it.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation type="unfinished"></translation>
</message>
@@ -2861,37 +3048,38 @@ It is not advisable to use it.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation type="unfinished"></translation>
</message>
@@ -2935,142 +3123,181 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation type="unfinished"></translation>
@@ -3157,305 +3384,270 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
+ <source>CSync unspecified error.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
- <source>CSync unspecified error.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
+ <source>Aborted by the user</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
- <source>Aborted by the user</source>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation type="unfinished"></translation>
</message>
@@ -3479,17 +3671,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
@@ -3520,81 +3712,81 @@ It is not advisable to use it.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation type="unfinished"></translation>
</message>
@@ -3609,11 +3801,6 @@ It is not advisable to use it.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation type="unfinished"></translation>
@@ -3645,116 +3832,129 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3766,9 +3966,9 @@ It is not advisable to use it.</source>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation type="unfinished"></translation>
</message>
@@ -3804,11 +4004,22 @@ It is not advisable to use it.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation type="unfinished"></translation>
@@ -3825,11 +4036,16 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation type="unfinished"></translation>
</message>
@@ -3866,7 +4082,7 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
+ <source>An error occurred while connecting. Please try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -4073,7 +4289,7 @@ It is not advisable to use it.</source>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
@@ -4171,52 +4387,52 @@ It is not advisable to use it.</source>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation type="unfinished"></translation>
</message>
@@ -4224,22 +4440,22 @@ It is not advisable to use it.</source>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation type="unfinished"></translation>
</message>
diff --git a/translations/client_es.ts b/translations/client_es.ts
index 1d26e031f..c90a09da2 100644
--- a/translations/client_es.ts
+++ b/translations/client_es.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="es" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation>No se pueden crear carpetas en la papelera.</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation>No se puede mover &apos;%1&apos; a &apos;%2&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation>Mover a la papelera no está implementado en esta plataforma.</translation>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,17 +95,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Tiempo de conexión agotado</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation>Error desconocido: la respuesta de red fue eliminada</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation>El servidor respondió &quot;%1 %2&quot; a &quot;%3 %4&quot;</translation>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Cancelar</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Cuenta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Elija qué sincronizar</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Forzar la sincronización ahora</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
- <translation>Reiniciar sync</translation>
+ <translation>Reiniciar sincronización</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>Eliminar la sincronización de carpetas conectadas</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Hubo un fallo al crear la carpeta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;No se pudo crear la carpeta local &lt;i&gt;%1&lt;/i&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>Confirme la sincronización para la eliminación de la carpeta conectada</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>Eliminar carpeta de sincronización conectada</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Sincronización en curso</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>La sincronización está en curso.&lt;br/&gt;¿Desea interrumpirla?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 en uso</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 como &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>La versión del servidor %1 es antigua, ¡y no está soportada! Si continúas, lo haces bajo tu propio riesgo.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Conectado a %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>Servidor %1 no está disponible temporalmente.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation>El servidor %1 está actualmente en modo mantenimiento.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>Cerró sesión desde %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation>Obteniendo autorización desde el navegador. &lt;a href=&apos;%1&apos;&gt;Haga click aqui&lt;/a&gt; para re-abrir el navegador .</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation>Conectando a %1...</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>Sin conexión a %1 en %2.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Iniciar sesión</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>Hay carpetas que no fueron sincronizadas porque son demasiado grandes:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>Hay carpetas que no fueron sincronizadas porque residen en almacenamiento externo:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation>Hay carpetas que no fueron sincronizadas porque son demasiado grandes o residen en almacenamiento externo:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Confirmar eliminación de cuenta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;¿De verdad quiere eliminar la conexión a la cuenta &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Nota:&lt;/b&gt; Esto &lt;b&gt;no&lt;/b&gt; eliminará los archivos.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Eliminar conexión</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Abrir carpeta</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Cerrar sesión</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Continuar sincronización</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Pausar sincronización</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;¿De verdad quiere dejar de sincronizar la carpeta &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Nota:&lt;/b&gt; Esto &lt;b&gt;no&lt;/b&gt; elminará los archivo.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1 (%3%) de %2 en uso. Algunas carpetas, como carpetas de red o compartidas, podrían tener límites diferentes.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%1 de %2 en uso</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Actualmente no hay información disponible sobre el uso de almacenamiento.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation>¡La versión del servidor %1 no es compatible! Continúa bajo tu responsabilidad.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>No hay ninguna conexión de %1 configurada.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Cerrar sesión</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Desconectado</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Conectado</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Servicio no disponible</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation>Modo mantenimiento</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Error en la red</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Error en la configuración</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation>Solicitando Credenciales</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Estado de cuenta desconocido</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Actividad del servidor</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Protocolo de Sincronización</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>No sincronizado</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>No Sincronizado (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>La lista de la actividad del servidor se ha copiado en el portapapeles.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>La lista de actividades de sincronización se ha copiado en el portapapeles.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>La lista de elementos sin sincronizar, ha sido copiada al portapapeles.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Copiado al portapapeles</translation>
</message>
@@ -469,47 +488,47 @@
<translation>Etiqueta de texto</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Actividades del servidor</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Copiar</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Copie la lista de actividades al portapapeles</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Acción a realizar: Notificaciones</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;La cuenta %1 no tiene actividades habilitadas.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation><numerusform>Ha recibido %n nueva notificación de %2.</numerusform><numerusform>Ha recibido %n nueva notificacióne(s) de %2.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation><numerusform>Ha recibido %n nueva notificación de %1 y de %2.</numerusform><numerusform>Ha recibido %n nuevas notificacióne(s) de %1 y de %2.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>Ha recibido nuevas notificaciónes de %1, %2 y otras cuentas.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>%1 Notificaciones - Acción requerida</translation>
</message>
@@ -529,7 +548,7 @@
<message>
<location filename="../src/gui/addcertificatedialog.ui" line="35"/>
<source>Certificate &amp; Key (pkcs12) :</source>
- <translation>Certificate &amp; Key (pkcs12) :</translation>
+ <translation>Certificado &amp; Clave (pkcs12) :</translation>
</message>
<message>
<location filename="../src/gui/addcertificatedialog.ui" line="51"/>
@@ -555,19 +574,44 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation>Continuar significa que &lt;b&gt;borrará estas opciones:&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation>Continuar significa que &lt;b&gt;ignorará estas opciones:&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation>Algunas opciones han sido configuradas con nuevas versiones del cliente y por ello algunas opciones no están disponibles en esta versión.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;El archivo de configuración debe ser respaldado en&lt;i&gt;%2&lt;/i&gt;.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Salir</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Continuar</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation>Error al acceder al archivo de configuración</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation>Ha ocurrido un error al acceder al archivo de configuración %1.</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
- <translation>Salir de OwnCloud</translation>
+ <translation>Salir de ownCloud</translation>
</message>
</context>
<context>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>Error al escribir los metadatos en la base de datos</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>No se ha configurado ninguna cuenta de ownCloud</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>La configuración del servidor para este cliente está obsoleta</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Por favor, actualice a la última versión del servidor y reinicie el cliente</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Error de autenticación: El usuario o la contraseña son incorrectos</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>tiempo de espera</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>Las credenciales proporcionadas no son correctas</translation>
</message>
@@ -637,133 +681,164 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Interrumpido por el usuario</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation>El servicio de descubrimiento de archivos ha perdido algún dato.</translation>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>La carpeta local %1 no existe.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 debería ser un directorio, pero no lo es.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 es ilegible.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 ha sido eliminado.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 ha sido descargado.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 ha sido actualizado.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 ha sido renombrado a %2.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 ha sido movido a %2.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation><numerusform>%1 y otro archivo han sido borrados.</numerusform><numerusform>%1 y otros %n archivos han sido borrados.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation><numerusform>%1 y otro archivo han sido descargados.</numerusform><numerusform>%1 y otros %n archivos han sido descargados.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation><numerusform>%1 y otro archivo han sido actualizados.</numerusform><numerusform>%1 y otros %n archivos han sido actualizados.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation><numerusform>%1 ha sido renombrado a %2 y otro archivo ha sido renombrado.</numerusform><numerusform>%1 ha sido renombrado a %2 y otros %n archivos han sido renombrado.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation><numerusform>%1 ha sido movido a %2 y otro archivo ha sido movido.</numerusform><numerusform>%1 ha sido movido a %2 y otros %n archivos han sido movidos.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation><numerusform>%1 y otro archivo han tenido conflictos al sincronizar.</numerusform><numerusform>%1 y otros %n archivos han tenido conflictos al sincronizar.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
- <translation>Conflicto al sincronizar %1. Por favor compruebe el archivo!</translation>
+ <translation>Conflicto al sincronizar %1. ¡Por favor, compruebe el archivo!</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation><numerusform>%1 y otro archivo no pudieron ser sincronizados debido a errores. Para más detalles vea el registro.</numerusform><numerusform>%1 y otros %n archivos no pudieron ser sincronizados debido a errores. Para más detalles vea el registro.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 no pudo ser sincronizado debido a un error. Para más detalles, vea el registro.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Actividad de la sincronización</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>No se ha podido leer el archivo de exclusión del sistema</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation>Una carpeta mayor de %1 MB ha sido añadida: %2.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation>Una carpeta de almacenamiento externo ha sido añadida.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation>Por favor vaya a opciones a seleccionarlo si desea descargar esto.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation>La carpeta %1 ha sido creada, pero tambien ha sido excluida de la sincronización. Los datos que contenga, no serán sincronizados.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation>El archivo %1 ha sido creado, pero tambien ha sido excluido de la sincronización. Por tanto, no será sincronizado.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation>Los cambios en las carpetas sincronizadas no se han podido rastrear de forma fiable.
+
+Esto significa que el cliente de sincronización podría no subir los cambios locales de forma inmediate sino que solo escaneará en busa de cambios locales y los subirá de forma ocasional (cada dos horas, por defecto).
+
+%1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -774,7 +849,7 @@ Si decide mantener estos archivos, serán re-sincronizados con el servidor si Vd
Si decide borrarlos, no serán visibles para Vd. a menos que sea usted el propietario.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
@@ -783,22 +858,22 @@ If this was an accident and you decide to keep your files, they will be re-synce
Si ha sido un accidente, y decide mantener los archivos, serán re-sincronizados con el servidor.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>¿Eliminar todos los archivos?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Eliminar todos los archivos</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Conservar archivos</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
@@ -807,17 +882,17 @@ Esto puede deberse a que una copia de seguridad fue restaurada en el servidor.
Si continua con la sincronización todos los archivos serán remplazados por su versión previa. ¿Desea mantener los archivos locales en su versión actual como archivos en conflicto?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>Backup detectado</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>Sincronización Normal</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>Mantener los archivos locales en caso de conflicto</translation>
</message>
@@ -825,115 +900,105 @@ Si continua con la sincronización todos los archivos serán remplazados por su
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>No se ha podido restablecer el estado de la carpeta</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>Se ha encontrado un antiguo registro de sincronización &apos;%1&apos;; pero no se ha podido eliminar. Por favor, asegúrese de que ninguna aplicación la esté utilizando.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation>(copia de seguridad)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation>(copia de seguridad %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Estado no definido.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>Esperando para comenzar la sincronización.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Preparándose para sincronizar.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>Sincronización en funcionamiento.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>La última sincronización se ha realizado con éxito.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation>La sincronización se ha realizado. pero hay conflictos sin resolver.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>La última sincronización salió bien; pero hay advertencias para archivos individuales.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>La última sincronización se ha realizado con éxito.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Error de configuración.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Interrumpido por el usuario.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>La sincronización está en pausa.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Sincronización en pausa)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>¡La carpeta seleccionada no es válida!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>¡La ruta seleccionada no es un directorio!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>¡Usted no tiene permiso para escribir en la carpeta seleccionada!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation>El directorio local %1 es un enlace simbólico. El objetivo del enlace ya contiene un directorio usado en una conexión de sincronización de directorios. Por favor, elija otro.</translation>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation>Ya existe una tarea de sincronización entre el servidor y esta carpeta. Por favor elija otra carpeta local.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>El directorio local %1 ya contiene un directorio usado en una conexión de sincronización de directorios. Por favor, elija otro.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>El directorio local %1 está dentro de un directorio usado en una conexión de sincronización de directorios. Por favor, elija otro.</translation>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation>El directorio local %1 es un enlace simbólico. El objetivo está incluido en un directorio usado en una conexión de sincronización de directorios. Por favor, elija otro.</translation>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -943,7 +1008,7 @@ Si continua con la sincronización todos los archivos serán remplazados por su
<translation>Añadir Conexión para el Directorio de Sincronización</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>Sincronizando con carpeta local</translation>
</message>
@@ -978,7 +1043,7 @@ Si continua con la sincronización todos los archivos serán remplazados por su
<translation>Error mientras se cargaba la lista de carpetas desde el servidor.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Cerrar sesión</translation>
</message>
@@ -993,115 +1058,133 @@ Si continua con la sincronización todos los archivos serán remplazados por su
<translation>Hay conflictos sin resolver. Haz click para mas detalles.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation>Los archivos nuevos se crean como archivos virtuales.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
<translation>Buscando cambios en &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation>Buscando cambios en local &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation>Reconciliando cambios</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>Sincronizando %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>descargando: %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>cargar %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 de %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%5 restantes, %1 de %2, archivo %3 de %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 de %2, archivo %3 de %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>archivo %1 de %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>Esperando...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>Esperando por %n carpeta...</numerusform><numerusform>Esperando por %n otras carpetas...</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>Preparando para sincronizar...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation>Este problema sucede habitualmente cuando las búsquedas de inotify están agotadas. Comprueba las FAQ para más detalles.</translation>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>Añadir Conexión para el Directorio de Sincronización</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>Añadir Sincronización de Conexión</translation>
</message>
@@ -1109,17 +1192,17 @@ Si continua con la sincronización todos los archivos serán remplazados por su
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Haga clic para seleccionar una carpeta local para sincronizar.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Ingrese la ruta de la carpeta local.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Seleccione la carpeta de origen</translation>
</message>
@@ -1127,60 +1210,68 @@ Si continua con la sincronización todos los archivos serán remplazados por su
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Crear carpeta remota</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>Introduzca más abajo el nombre de la nueva carpeta que crear &apos;%1&apos;:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>La carpeta fue creada con éxito en %1.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>Falló la autenticación al acceder a %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>Fallo al crear la carpeta %1. Por favor, revíselo manualmente.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>Falló al listar una carpeta. Error: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Elija esto para sincronizar la cuenta entera</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Este directorio ya se ha sincronizado.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Ya ha sincronizado &lt;i&gt;%1&lt;/i&gt;, el cual es la carpeta de &lt;i&gt;%2&lt;/i&gt;.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation>Usar archivos virtuales, en lugar de descargarse el contenido inmediatamente (experimental)</translation>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Advertencia:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Advertencia:&lt;/b&gt; </translation>
</message>
@@ -1188,22 +1279,22 @@ Si continua con la sincronización todos los archivos serán remplazados por su
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>No se ha recibido ninguna e-tag del servidor, revise el proxy/puerta de enlace</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>Se ha recibido una e-tag distinta para reanudar. Se volverá a intentar.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>El servidor ha devuelto un content-range erróneo</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Tiempo de espera de conexión agotado</translation>
</message>
@@ -1226,23 +1317,38 @@ Si continua con la sincronización todos los archivos serán remplazados por su
<translation>A la bandeja del sistema</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation>&amp;Canal</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation>estable</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation>beta</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Avanzado</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation>Preguntar si se desea sincronizar carpetas mayores de</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation>Preguntar si se desea sincronizar carpetas de almacenamiento externo</translation>
</message>
@@ -1262,31 +1368,71 @@ Si continua con la sincronización todos los archivos serán remplazados por su
<translation>Usar Iconos &amp;Monocromáticos</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>Editar archivos &amp;ignorados</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation>Mostrar carpetas a sincronizar en &amp;Explorer&apos;s Navigation Panel</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>M&amp;ostrar el informe de fallos</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>Acerca de</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>Actualizaciones</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>&amp;Reiniciar &amp;&amp; Actualizar</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation>¿Cambiar canal de actualizaciones?</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation>El canal de actualizaciones determina que actualizaciones son necesarias y ofrecidas para su instalación en el cliente. El canal &quot;Estable&quot; contiene actualizaciones consideradas estables, mientras que el canal &quot;beta&quot; contiene parches y funcionalidad nueva que podria ser inestable.
+
+Nota: esto solo selecciona el canal deseado y no permite vueltas atras. Por lo que volver atras desde el canal beta al canal estable, puede ser que tarde un cierto tiempo dado que los parches y nueva funcionalidades, deben acabar siendo trasladadas al canal &quot;estable&quot;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation>Cambiar canal de actualizaciones</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation>Error al compartir</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation>No es posible crear el enlace publico compartido . Error:
+
+%1</translation>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1354,7 +1500,7 @@ Si continua con la sincronización todos los archivos serán remplazados por su
<translation>Eliminar</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1363,27 +1509,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
Los elementos cuya eliminación está permitida serán eliminados si impiden que un directorio sea eliminado. Esto es útil para sus metadatos.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>No se ha podido abrir el archivo</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>No se pueden guardar cambios en &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Añadir patrón para ignorar</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Añadir nuevo patrón para ignorar:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Esta entrada la proporciona el sistema en &apos;%1&apos; y no se puede modificar en esta vista.</translation>
</message>
@@ -1413,7 +1559,7 @@ Los elementos cuya eliminación está permitida serán eliminados si impiden que
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Carpeta</translation>
</message>
@@ -1428,35 +1574,45 @@ Los elementos cuya eliminación está permitida serán eliminados si impiden que
<translation>Mostrar archivos ignorados</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
- <translation type="unfinished"/>
+ <translation>Hay demasiados problemas, No todos se visualizan aquí.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation>Ha habido conflictos. Comprueba la documentaci´no sobre cómo resolverlos.</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation>Copiar la lista de problemas al portapapeles.</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Copiar</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Hora</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Archivo</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation>Problema</translation>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation>Ha habido conflictos. &lt;a href=&quot;%1&quot;&gt;Comprueba la documentación sobre cómo resolverlos.&lt;/a&gt;</translation>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1482,36 +1638,48 @@ Los elementos cuya eliminación está permitida serán eliminados si impiden que
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation>Guardar registros permanentemente</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation>Cuando esta opción está habilitada y ningún otro registro está configurado, los rergistros serán escritos a una carpeta temporal y caducarán al cabo de unas pocas horas. Esta configuración se mantiene tras reiniciar el cliente. Los registros serán escritos a %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Borrar</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Limpiar la pantalla de registros.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>Gu&amp;ardar</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Guardar el archivo de registro a un archivo en disco para depuración.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Guardar archivo de registro</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>No se ha podido escribir en el archivo de registro %1</translation>
</message>
@@ -1519,12 +1687,12 @@ Los elementos cuya eliminación está permitida serán eliminados si impiden que
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;El archivo &apos;%1&apos;&lt;br/&gt;no se puede abrir para escritura.&lt;br/&gt;&lt;br/&gt;¡El archivo de registro &lt;b&gt;no&lt;/b&gt; se puede guardar!&lt;/nobr&gt;</translation>
</message>
@@ -1532,27 +1700,27 @@ Los elementos cuya eliminación está permitida serán eliminados si impiden que
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Nueva versión disponible</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;Una nueva versión del programa cliente de %1 está disponible.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; está disponible para descargar. La versión instalada es la %3.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Saltarse esta versión</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Omitir esta vez</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Actualizar</translation>
</message>
@@ -1640,27 +1808,27 @@ Los elementos cuya eliminación está permitida serán eliminados si impiden que
<translation>Limitar automáticamente</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Nombre del host para servidor proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Nombre de usuario para el servidor proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Contraseña para el servidor proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>Proxy HTTP(S)</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>Proxy SOCKS5</translation>
</message>
@@ -1668,23 +1836,23 @@ Los elementos cuya eliminación está permitida serán eliminados si impiden que
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>Creado en %1</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>Cerrando en pocos segundos...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation>%1 petición fallida en %2</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation>&apos;%1&apos; seleccionado en %2</translation>
@@ -1693,32 +1861,32 @@ Los elementos cuya eliminación está permitida serán eliminados si impiden que
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation>Error devuelto desde el servidor: &lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation>Ha ocurrido un error accediendo al Token endpoint:: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation>No puedo procesar el código JSON recibido del servidor: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation>La respuesta del servidor no contiene todos los campos esperados</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation>&lt;h1&gt;Error de Login&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation>&lt;h1&gt;Usuario incorrecto&lt;/h1&gt;&lt;p&gt;Se ha intentado logar con el usuario: &lt;em&gt;%1&lt;/em&gt;, pero debe logarse con el usuario: &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Por favor des-loguese de %3 en otra pestaña, entonces&lt;a href=&apos;%4&apos;&gt;click aqui&lt;/a&gt; y loguese como el usuario %2&lt;/p&gt;</translation>
</message>
@@ -1726,58 +1894,58 @@ Los elementos cuya eliminación está permitida serán eliminados si impiden que
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Nueva %1 actualización está lista</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>Se instalará una nueva actualización de %1. Durante esta actualización puede que se soliciten privilegios adicionales.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>Descargando la versión %1. Espere...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>No se puede descargar la actualización. Por favor, haga clic &lt;a href=&apos;%1&apos;&gt;aquí&lt;/a&gt; para iniciar una descarga manual.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>No se puede comprobar si hay actualizaciones.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>%1 versión %2 disponible. Reiniciar aplicación para comenzar la actualización.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>Nueva %1 versión %2 está disponible. Use la herramienta de actualización de su sistema para instalarla.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Consultando al servidor de actualizaciones...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>Estado de actualización desconocido: no se buscaron nuevas actualizaciones.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>No hay actualizaciones disponibles. Tiene la última versión.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Comprobar si hay actualizaciones</translation>
</message>
@@ -1785,43 +1953,43 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Conectar a %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Configurar opciones de carpeta local</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Conectar...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>La carpeta %1 &apos;%2&apos; está sincronizada con la carpeta local &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>Sincronizar el directorio &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Advertencia:&lt;/strong&gt; El directorio local no está vacío. ¡Seleccione una resolución!&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Carpeta local de sincronización</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1880,15 +2048,20 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Conectar a %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation>Inicia sesión en tu navegador de internet</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation>Copiar enlace al portapapeles</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1919,153 +2092,163 @@ No se recomienda usarla.</translation>
<source>&amp;Next &gt;</source>
<translation>&amp;Siguiente &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>URL inválida.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation>No se pudo cargar el certificado. ¿Quizás contraseña incorrecta?</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Conectado con éxito a %1: versión %2 %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Fallo al conectar %1 a %2:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>Tiempo de espera agotado mientras se intentaba conectar a %1 en %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Intentando conectar a %1 desde %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>La petición autenticada al servidor ha sido redirigida a &apos;%1&apos;. La dirección URL es errónea, el servidor está mal configurado.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>Ha habido una respuesta no válida a una solicitud autenticada de webdav</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>Acceso denegado por el servidor. Para verificar que usted tiene acceso, &lt;a href=&quot;%1&quot;&gt;haga clic aquí&lt;/a&gt; para acceder al servicio con su navegador.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>URL inválida.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation>El servidor informa del siguiente error:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>La carpeta de sincronización local %1 ya existe, configurándola para la sincronización.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>Creando carpeta de sincronización local %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>bien</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>ha fallado.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>No se ha podido crear la carpeta local %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>¡No se ha especificado ninguna carpeta remota!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Error: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>creando carpeta en ownCloud: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>Carpeta remota %1 creado correctamente.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>La carpeta remota %1 ya existe. Conectándola para sincronizacion.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>La creación de la carpeta ha producido el código de error HTTP %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>¡La creación de la carpeta remota ha fallado debido a que las credenciales proporcionadas son incorrectas!&lt;br/&gt;Por favor, vuelva atrás y compruebe sus credenciales&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;La creación de la carpeta remota ha fallado, probablemente porque las credenciales proporcionadas son incorrectas.&lt;/font&gt;&lt;br/&gt;Por favor, vuelva atrás y compruebe sus credenciales.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>Creación %1 de carpeta remota ha fallado con el error &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>Se ha configarado una conexión de sincronización desde %1 al directorio remoto %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>¡Conectado con éxito a %1!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>No se ha podido establecer la conexión con %1. Por favor, compruébelo de nuevo.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Error al renombrar la carpeta</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>No se puede eliminar y respaldar la carpeta porque la misma o un fichero en ella está abierto por otro programa. Por favor, cierre la carpeta o el fichero y reintente, o cancele la instalación.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Carpeta de sincronización local %1 creada con éxito&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2073,14 +2256,33 @@ No se recomienda usarla.</translation>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>Asistente de conexión %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Omitir la configuración de carpetas</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation>¿Activar característica experimental?</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation>Cuando está activado el &quot;modo virtual&quot;, no se descargan los archivos inicialmente, en su lugar se crea un pequeño archivo &quot;%1&quot; para cada archivo que existe en el servidor. El contenido puede ser descargado ejecutando esos archivos, o usando el menú contextual.
+
+Este es un nuevo modo experimental. Si decide usarlo, por favor informe de los problemas que detecte.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation>Activar modo experimental</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation>Permanecer seguro</translation>
</message>
</context>
<context>
@@ -2104,15 +2306,15 @@ No se recomienda usarla.</translation>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
- <translation>Respuesta JSON invalida desde URL</translation>
+ <translation>Respuesta JSON inválida desde URL</translation>
</message>
</context>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>Error al escribir los metadatos en la base de datos</translation>
</message>
@@ -2120,47 +2322,47 @@ No se recomienda usarla.</translation>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>¡El archivo %1 no se puede descargar a causa de un conflicto con el nombre de un archivo local!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
- <translation>La descarga reducirá el espacio libre local por debajo del limite.</translation>
+ <translation>La descarga reducirá el espacio libre local por debajo del límite.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>El espacio libre en el disco es inferior a %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>Se ha eliminado el archivo del servidor</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>No se ha podido descargar el archivo completamente.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation>El archivo descargado está vacio aunque el servidor dice que deberia haber sido %1.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
- <translation>¡El fichero %1 no puede guardarse debido a un conflicto con el nombre de otro fichero local!</translation>
+ <translation>¡El archivo %1 no puede guardarse debido a un conflicto con el nombre de otro archivo local!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>El archivo ha cambiado desde que fue descubierto</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>Error al escribir los metadatos en la base de datos</translation>
</message>
@@ -2168,12 +2370,12 @@ No se recomienda usarla.</translation>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; Falló la restauración: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation>Un archivo o directorio fue eliminado de una carpeta de compartida de solo lectura pero la recuperación falló: %1</translation>
</message>
@@ -2181,22 +2383,22 @@ No se recomienda usarla.</translation>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>no pudo borrar el archivo %1, error: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>Atención, posible error de mayúsculas/minúsculas en %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>No se ha podido crear el directorio %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>Error al escribir los metadatos en la base de datos</translation>
</message>
@@ -2204,17 +2406,17 @@ No se recomienda usarla.</translation>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>Error al borrar &apos;%1&apos;: %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>No se pudo eliminar la carpeta &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>No se ha podido eliminar %1 por causa de un conflicto con el nombre de un archivo local</translation>
</message>
@@ -2222,13 +2424,13 @@ No se recomienda usarla.</translation>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>El archivo %1 no se puede renombrar a %2 por causa de un conflicto con el nombre de un archivo local</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>Error al escribir los metadatos en la base de datos</translation>
</message>
@@ -2236,12 +2438,7 @@ No se recomienda usarla.</translation>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>El archvo fue eliminado de una carpeta compartida en modo de solo lectura. Ha sido recuperado.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>El código HTTP devuelto por el servidor es erróneo. Esperado 204, pero recibido &quot;%1 %2&quot;.</translation>
</message>
@@ -2249,12 +2446,12 @@ No se recomienda usarla.</translation>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>El código HTTP devuelto por el servidor es erróneo. Esperado 201, pero recibido &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>Error al escribir los metadatos en la base de datos</translation>
</message>
@@ -2262,28 +2459,13 @@ No se recomienda usarla.</translation>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Esta carpeta no debe ser renombrada. Ha sido renombrada a su nombre original</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Esta carpeta no debe ser renombrada. Favor de renombrar a Compartida.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>El archivo fue renombrado, pero es parte de una carpeta compartida en modo de solo lectura. El archivo original ha sido recuperado.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>El código HTTP devuelto por el servidor es erróneo. Esperado 201, pero recibido &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>Error al escribir los metadatos en la base de datos</translation>
</message>
@@ -2291,33 +2473,33 @@ No se recomienda usarla.</translation>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
- <translation>El archivo %1 No puede ser subido porque ya existe otro con el mismo nombre, puede haber diferencias en mayusculas o minusculas</translation>
+ <translation>El archivo %1 no puede ser subido porque ya existe otro con el mismo nombre, puede haber diferencias en mayúsculas o minúsculas</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Archivo eliminado</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>Archivo local cambió durante la sincronización. Será actualizado.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>Un archivo local fue modificado durante la sincronización.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation>La subida %1 excede la quota de la carpeta</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>Error al escribir los metadatos en la base de datos</translation>
</message>
@@ -2325,27 +2507,27 @@ No se recomienda usarla.</translation>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>El archivo local ha sido eliminado durante la sincronización.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>Un archivo local fue modificado durante la sincronización.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation>Respuesta inesperada del servidor (%1)</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
- <translation>Perdido archivo ID del servidor</translation>
+ <translation>Perdido ID del archivo en el servidor</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation>Perdido ETag del servidor</translation>
</message>
@@ -2353,27 +2535,22 @@ No se recomienda usarla.</translation>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>El archivo fue modificado localmente; pero es parte de una carpeta compartida en modo de sólo lectura. Ha sido recuperado y su modificación está en el archivo de conflicto.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>Falta la URL de la encuesta</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>El archivo local ha sido eliminado durante la sincronización.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>Un archivo local fue modificado durante la sincronización.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation>El servidor no reconoció la última parte. (No había una e-tag presente)</translation>
</message>
@@ -2391,42 +2568,47 @@ No se recomienda usarla.</translation>
<translation>Etiqueta de texto</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Abrir en navegador</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Hora</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Archivo</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Carpeta</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Acción</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Tamaño</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>Protocolo de sincronización local</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Copiar</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Copie la lista de actividades al portapapeles</translation>
</message>
@@ -2461,13 +2643,13 @@ No se recomienda usarla.</translation>
<message>
<location filename="../src/gui/proxyauthdialog.ui" line="74"/>
<source>TextLabel</source>
- <translation>Etiqueta de texto</translation>
+ <translation>EtiquetaDeTexto</translation>
</message>
</context>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Escoja qué sincronizar</translation>
</message>
@@ -2475,33 +2657,33 @@ No se recomienda usarla.</translation>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Cargando...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation>Deseleccione las carpetas remotas que no desea sincronizar.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Nombre</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Tamaño</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>No hay subcarpetas actualmente en el servidor.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation>Ha ocurrido un error mientras cargaba la lista de carpetas.</translation>
</message>
@@ -2522,22 +2704,22 @@ No se recomienda usarla.</translation>
<translation>Ajustes</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Actividad</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>General</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Red</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Cuenta</translation>
</message>
@@ -2545,28 +2727,28 @@ No se recomienda usarla.</translation>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Actividad</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>General</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Red</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Cuenta</translation>
</message>
@@ -2576,7 +2758,7 @@ No se recomienda usarla.</translation>
<message>
<location filename="../src/gui/sharedialog.ui" line="60"/>
<source>TextLabel</source>
- <translation>Etiqueta de texto</translation>
+ <translation>EtiquetaDeTexto</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="28"/>
@@ -2594,42 +2776,42 @@ No se recomienda usarla.</translation>
<translation>Ruta de OwnCloud:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>%1 Compartiendo</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Carpeta: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>El servidor no permite compartir</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation>Descargando el maximo número de permisos compartidos del servidor...</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>El archivo no puede compartirse; ya que fue compartido sin permisos correspondientes.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>Usuarios y Grupos</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>Enlaces Publicos</translation>
</message>
@@ -2642,7 +2824,17 @@ No se recomienda usarla.</translation>
<translation>Compartir nuevo documento.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation>Sólo subir (Goteo de Archivo)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation>Reciba archivos de otros sin revelar el contenido de la carpeta.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>Etiqueta de texto</translation>
</message>
@@ -2672,19 +2864,24 @@ No se recomienda usarla.</translation>
<translation>Establecer contraseña</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
- <translation>Propiedades del Link:</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
+ <translation>Se puede ver o descargar el contenido</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation>Descargar / Ver</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>Mostrar listado de archivos</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation>Descargar / Ver / Subir</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Permitir edición</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation>Se puede ver, descargar, editar, borrar y subir contenido.</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2692,95 +2889,95 @@ No se recomienda usarla.</translation>
<translation>Quienquiera que posea el vínculo tendrá acceso al archivo/carpeta</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>Protegido por contr&amp;aseña </translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Protegido con contraseña</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>El archivo no puede compartirse; ya que fue compartido sin permisos correspondientes.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation>Se ha deshabilitado la compartición de enlaces</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation>Crear un enlace público compartido</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Eliminar</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation>Abrir enlace en el explorador</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation>Copiar enlace al portapapeles</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation>Copiar enlace al portapapeles (descarga directa)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Enviar enlace por e-mail</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation>Enviar enlace por e-mail (descarga directa)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation>He compartido %1 contigo</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation>Confirmar eliminación de enlace de recurso compartido</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation>&lt;p&gt;¿Realmente desea borrar el enlace público compartido &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Nota: Esta acción no se puede deshacer&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Cancelar</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation>Enlace Publico</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation>Borrar el enlace compartido</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>Compartir public&amp;amente requiere contraseña</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Por favor establece una contraseña</translation>
</message>
@@ -2803,32 +3000,32 @@ No se recomienda usarla.</translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Se puede compartir directamente con otras personas &lt;a href=&quot;private link menu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;enviandolas el enlace directo privado&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation>El elemento no ha sido compartido con ningun grupo o persona.</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation>Abrir enlace en el explorador</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation>Copiar enlace al portapapeles</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Enviar enlace por e-mail</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>No hay resultados para &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation>He compartido algo contigo</translation>
</message>
@@ -2841,37 +3038,38 @@ No se recomienda usarla.</translation>
<translation>Formulario</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>Etiqueta de texto</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>puede editar</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>puede compartir</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>crear</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>Cambiar</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>eliminar</translation>
</message>
@@ -2915,146 +3113,179 @@ No se recomienda usarla.</translation>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>Compartir con %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation>Compartido de menu contextual</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation>He compartido algo contigo</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation>Compartir...</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation>Copiar enlace privado al portapapeles</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation>Enviar enlace privado por e-mail...</translation>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation>No está permitido volver a compartir este archivo</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation>Copiar el enlace a la pizarra</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Abrir en navegador</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation><numerusform>Descargar archivoº</numerusform><numerusform>Descargar archivo(s)</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation><numerusform>Reemplazar archivo por archivo virtual</numerusform><numerusform>Reemplazar archivos por archivo virtual</numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Detalles del certificado&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Nombre común (NC):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>Nombres alternativos del sujeto:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Organización (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Unidad organizacional (UO):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Estado/provincia:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>País:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Nº de serie:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Emisor&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Emisor:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Emitido en:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Expira en:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Firma&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;Notificación:&lt;/b&gt; Este certificado fue aprobado manualmente&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (autofirmado)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>Esta conexión está cifrada con %1 bit %2.
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation>No admite tickets de sesión/dentificadores SSL</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Información del certificado:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
- <translation>Esta conexión NO ES SEGURA, pues no está cifrada.
+ <translation>Esta conexión NO es segura, pues no está cifrada.
</translation>
</message>
</context>
@@ -3078,7 +3309,7 @@ No se recomienda usarla.</translation>
<message>
<location filename="../src/gui/sslerrordialog.cpp" line="132"/>
<source>Cannot connect securely to &lt;i&gt;%1&lt;/i&gt;:</source>
- <translation>No puedo conectar de forma segura a &lt;i&gt;%1&lt;/i&gt;:</translation>
+ <translation>No se puede conectar de forma segura a &lt;i&gt;%1&lt;/i&gt;:</translation>
</message>
<message>
<location filename="../src/gui/sslerrordialog.cpp" line="166"/>
@@ -3139,305 +3370,270 @@ No se recomienda usarla.</translation>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Completado con éxito.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>CSync falló al cargar el archivo de diaro. El darchivo de diario se encuentra corrupto.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;El %1 complemento para csync no se ha podido cargar.&lt;br/&gt;Por favor, verifique la instalación&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>Error fatal de parámetro en CSync.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>El proceso de actualización de CSync ha fallado.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>Falló el proceso de composición de CSync</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync no pudo autenticar el proxy.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSync falló al realizar la búsqueda del proxy</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync: Falló la autenticación con el servidor %1.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync: Falló la conexión con la red.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>Se sobrepasó el tiempo de espera de la conexión de red.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>Se ha producido un error de transmisión HTTP.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation>El directorio montado no está disponible temporalmente en el servidor</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>Se produjo un error al abrir un directorio</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>Error al leer el directorio.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation>%1 (no realizado por el error anterior, intente de nuevo %2)</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>Se ignoran los Archivos/Carpetas ocultos.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation>demasiadas subcarpetas anidadas</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
- <translation>Conflicto: Versión del servidor descargada, La copia local ha sido renombrada pero no se ha podido subir.</translation>
+ <translation>Conflicto: versión del servidor descargada, la copia local ha sido renombrada pero no se ha podido subir.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation>Solo %1 disponible, se necesita por lo menos %2 para comenzar</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
- <translation>Imposible abrir o crear la BBDD local de sync. Asegurese de que tiene permisos de escritura en la carpeta de sync.</translation>
+ <translation>Imposible abrir o crear la base de datos local de sincronización. Asegúrese de que tiene permisos de escritura en la carpeta de sincronización.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
- <translation>No permitido porque no tienes permiso para añadir un directorio padre</translation>
+ <translation>No permitido porque no tiene permiso para añadir un directorio padre</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
- <translation>No permitido porque no tienes permiso para añadir archivos a ese directorio</translation>
+ <translation>No permitido porque no tiene permiso para añadir archivos a ese directorio</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
- <translation>Poco espacio libre en disco: La descarga lo reducirá por debajo del %1, deberia abortar.</translation>
+ <translation>Poco espacio libre en disco: La descarga lo reducirá por debajo del %1, debería abortar.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation>No hay suficiente espacio libre en el servidor para algunas subidas.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: No queda espacio disponible en el servidor %1.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>Error no especificado de CSync</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Interrumpido por el usuario</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>CSync ha fallado al acceder</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation>Fallo al crear o cargar el archivo de sesión. Asegúrese de que tiene permisos de lectura/escritura en la carpeta local a sincronizar</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation>Ha fallado el descubrimiento</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation>Permiso denegado.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
- <translation>CSync falló al cargar o crear el archivo de diario. Asegúrese de tener permisos de lectura y escritura en el directorio local de sincronización.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
+ <translation>Archivo o carpeta no encontrado:</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
- <translation>CSync falló debido a un permiso denegado.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
+ <translation>Se ha tratado de crear una carpeta que ya existe.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
- <translation>CSync trató de crear un directorio que ya existe.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation>No hay espacio disponible en %1 .</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>El servicio no está disponible temporalmente </translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>Acceso prohibido</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>Ocurrió un error interno número %1.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>No se admiten enlaces simbólicos en la sincronización.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>El fichero está en la lista de ignorados</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation>Los nombres de archivo que terminan con un punto no son compatibles con este sistema de archivos.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation>Los nombres de archivo que contengan el caracter &apos;%1&apos; no son compatibles con este sistema de archivos.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation>El nombre del archivo es una palabra reservada del sistema de archivos.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation>El nombre del archivo contiene espacios finales.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>El nombre del archivo es demasiado largo.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
- <translation>El nombre de archivo no se puede codificar en tu sistema de archivos.</translation>
+ <translation>El nombre de archivo no se puede codificar en su sistema de archivos.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation>Conflicto sin resolver.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>Stat ha fallado.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>Los caracteres del nombre de fichero no son válidos</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>Caracteres inválidos, por favor renombre &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation>En uso archivos virtuales, pero sin el sufijo.</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation>No se pudo leer la lista de bloqueo de la base de datos local</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation>No se ha podido leer desde el registro de sincronización</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>No es posible abrir el diario de sincronización</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
- <translation>Nombre de archivo contiene al menos un caracter no válido</translation>
+ <translation>El nombre de archivo contiene al menos un carácter no válido</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>Ignorado porque se encuentra en la lista negra de &quot;elija qué va a sincronizar&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
- <translation>No permitido porque no tienes permiso para añadir subdirectorios a ese directorio</translation>
+ <translation>No permitido porque no tiene permiso para añadir subdirectorios a ese directorio</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>No está permitido subir este archivo porque es de solo lectura en el servidor, restaurando.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>No está permitido borrar, restaurando.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>Se han eliminado los archivos locales y la carpeta compartida.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>No está permitido mover, elemento restaurado.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>No está permitido mover, porque %1 es de sólo lectura.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>destino</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>origen</translation>
</message>
@@ -3461,17 +3657,17 @@ No se recomienda usarla.</translation>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Versión %1. Para obtener más información, visita &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Versión %2. para más información, visite &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Para fallos conocidos y ayuda, visite: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;Por Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, y otros.&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;Distribuido por %1 y bajo la licencia GNU General Public License (GPL) versión 2.0.&lt;br/&gt;%2 y el logotipo de %2 son marcas registradas de %1 en los Estados Unidos y otros países, o ambos.&lt;/p&gt;</translation>
</message>
@@ -3502,81 +3698,81 @@ No se recomienda usarla.</translation>
<translation>Por favor, regístrese</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Archivo %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>No hay carpetas configuradas para sincronizar.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Abrir en navegador</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Inicio de sesión...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Cerrar sesión</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Cambios recientes</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Buscando cambios en &apos;%1&apos;</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Carpetas administradas:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Abrir carpeta &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Abrir %1 en el navegador</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation>El servidor de la cuenta %1 ejecuta una versión %2 no compatible. Este cliente con versiones del servidor no compatibles es potencialmente peligroso. Continúa bajo tu responsabilidad.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Estado desconocido</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Configuraciones...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Detalles...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Ayuda</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>Salir de %1</translation>
</message>
@@ -3591,11 +3787,6 @@ No se recomienda usarla.</translation>
<translation>Versión del servidor no soportada</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation>El servidor en la cuenta %1 usa una versión antigua y no soportada %2. Usando este cliente con las versiones de servidor no soportadas no está probado y es potencialmente peligroso. Procede bajo tu propio riesgo.</translation>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Desconectado</translation>
@@ -3627,116 +3818,129 @@ No se recomienda usarla.</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation>La sincronización se ha detenido</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation>Conflictos sin resolver</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation>Error durante la sincronización</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation>No hay carpetas sincronizado configuradas</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation>Reanudar todas las carpetas</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>Pausar todas las carpetas</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>Reanudar toda la sincronización</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>Reanudar la sincronización</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>Pausar todas las sincronizaciones</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>Pausar la sincronización</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Terminar sessión en todas las cuentas</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Iniciar sesión en todas las cuentas...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>Nueva cuenta ...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>Acerca de %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>Se ha producido un fallo</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>No se han sincronizado elementos recientemente</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation>Buscando cambios en remoto: &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation>Buscando cambios en local &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Sincronizando %1 de %2 (quedan %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation>Sincronizando %1 de %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Sincronizando %1 (quedan %2)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>Sincronizando %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Actualizado</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Version %2. Para mas información visite: &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Para ayuda y asistencia , visite: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licenciado bajo la GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud y el logo de ownCloud son marcas registradas de ownCloud GmbH en los Estados Unidos, en otros paises o en ambos.&lt;/p&gt;</translation>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3748,11 +3952,11 @@ No se recomienda usarla.</translation>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
- <translation>Etiqueta de texto</translation>
+ <translation>EtiquetaDeTexto</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="91"/>
@@ -3786,11 +3990,22 @@ No se recomienda usarla.</translation>
<translation>Preguntar si se desea sincronizar carpetas de almacenamiento e&amp;xterno</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Elija qué sincronizar</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Cuando se selecciona esta opción, el asistente se cerrará sin sincronizar nada. Puedes usar el botón &amp;quot;Añadir conexión de sincronización de carpeta&amp;quot; en las configuración de la cuenta para escoger qué pareja de carpetas local y remota quieres sincronizar&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation>Crear manualmente las conexiones de sincronización de carpeta</translation>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>Carpeta &amp;local</translation>
@@ -3807,11 +4022,16 @@ No se recomienda usarla.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>Sincronizar todo desde el servidor</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation>Sincronizar todo desde el servidor (recomendado)</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation>Usar archivos virtuales, en lugar de descargarse el contenido inmediatamente (e&amp;xperimental)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Mensaje de estado</translation>
</message>
@@ -3848,8 +4068,8 @@ No se recomienda usarla.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
- <translation>Ha ocurrido un error al conectar. Por favor intente de nuevo.</translation>
+ <source>An error occurred while connecting. Please try again.</source>
+ <translation>Ha ocurrido un error al conectar. Por favor intentelo de nuevo.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="56"/>
@@ -3984,12 +4204,12 @@ No se recomienda usarla.</translation>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="311"/>
<source>%n month(s)</source>
- <translation><numerusform>%n Mes</numerusform><numerusform>%n Mese(s)</numerusform></translation>
+ <translation><numerusform>%n Mes</numerusform><numerusform>%n mes(es)</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="312"/>
<source>%n day(s)</source>
- <translation><numerusform>%n dia</numerusform><numerusform>%n dia(s)</numerusform></translation>
+ <translation><numerusform>%n dia</numerusform><numerusform>%n día(s)</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="313"/>
@@ -4022,13 +4242,13 @@ No se recomienda usarla.</translation>
<message>
<location filename="../src/gui/main.cpp" line="39"/>
<source>%1 requires on a working system tray. If you are running XFCE, please follow &lt;a href=&quot;http://docs.xfce.org/xfce/xfce4-panel/systray&quot;&gt;these instructions&lt;/a&gt;. Otherwise, please install a system tray application such as &apos;trayer&apos; and try again.</source>
- <translation>% 1 requiere una bandeja del sistema de trabajo. Si está ejecutando XFCE, por favor siga &lt;a href=&quot;http://docs.xfce.org/xfce/xfce4-panel/systray&quot;&gt; estas instrucciones &lt;/ a&gt;. De lo contrario, instale una aplicación de la bandeja del sistema, tales como &apos;trayer&apos; y vuelva a intentarlo.</translation>
+ <translation>% 1 requiere una bandeja del sistema de trabajo. Si está ejecutando XFCE, por favor siga &lt;a href=&quot;http://docs.xfce.org/xfce/xfce4-panel/systray&quot;&gt; estas instrucciones&lt;/a&gt;. De lo contrario, instale una aplicación de la bandeja del sistema, como &apos;trayer&apos;, y vuelva a intentarlo.</translation>
</message>
</context>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;Revisión Git &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; en %3, %4 compilada usando Qt %5, %6&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4126,52 +4346,52 @@ No se recomienda usarla.</translation>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Estado indefinido</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Esperando para comenzar la sincronización</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>Sincronizado en proceso</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Sincronizado con éxito</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Sincronizado con éxito, algunos archivos han sido ignorados.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Error de sincronización.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Error en la instalación</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Preparando para sincronizar</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Cancelando...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>La sincronización está en pausa.</translation>
</message>
@@ -4179,24 +4399,24 @@ No se recomienda usarla.</translation>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation>No puedo abrir el explorador</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
- <translation>Ha ocurrido un error al lanzar el navegador para ir a la URL: %1 , ¿podria ser que no tenga ningún navegador por defecto?.</translation>
+ <translation>Ocurrió un error al lanzar el navegador para ir a la URL: %1 , ¿podría ser que no haya ningún navegador configurado como predeterminado?</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation>No se pudo abrir el cliente de correo</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
- <translation>Ocurrió un error al lanzar el cliente de correo electrónico para crear un nuevo mensaje. ¿Puede ser que no haya ningún cliente de correo electrónico configurado?</translation>
+ <translation>Ocurrió un error al lanzar el cliente de correo electrónico para crear un nuevo mensaje. ¿Podría ser que no haya ningún cliente de correo electrónico configurado como predeterminado?</translation>
</message>
</context>
</TS> \ No newline at end of file
diff --git a/translations/client_es_AR.ts b/translations/client_es_AR.ts
index d4aea5cb5..1242baab3 100644
--- a/translations/client_es_AR.ts
+++ b/translations/client_es_AR.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="es_AR" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation>Imposible colocar directorios en la papelera</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation>Imposible mover &apos;%1&apos; a &apos;%2&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation>Mover hacia la papelera no está implementado en esta plataforma</translation>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -60,12 +79,12 @@
<message>
<location filename="../src/gui/notificationwidget.ui" line="56"/>
<source>Lorem ipsum dolor sit amet</source>
- <translation type="unfinished"/>
+ <translation>Lorem ipsum dolor sit amet</translation>
</message>
<message>
<location filename="../src/gui/notificationwidget.ui" line="69"/>
<source>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod temporm </source>
- <translation type="unfinished"/>
+ <translation>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod temporm</translation>
</message>
<message>
<location filename="../src/gui/notificationwidget.ui" line="89"/>
@@ -76,17 +95,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Tiempo de conexión agotado</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
- <translation type="unfinished"/>
+ <translation>Error desconocido: la respuesta de la red fue eliminada</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation type="unfinished"/>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Cancelar</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Cuenta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Elegir que sincronizar</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Forzar sincronización ahora</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>Reinicia sincronización </translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>Eliminar conexión de sincronización de carpeta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Falló la creacion de la carpeta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;No pudó ser creada la carpeta local &lt;i&gt;%1&lt;/i&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>Confirmar eliminación de conexión de sincronización de carpeta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>Eliminar Conexión de Sincronización de Carpeta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Sincronización en curso</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>La sincronización está en curso.&lt;br/&gt;¿Querés interrumpirla?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 en uso</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 de &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>¡La versión del servidor% 1 es antigua y no está soportada! Proceda bajo su propio riesgo.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Conectado a %1</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>El servidor %1 esta temporalmente sin conexión</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation>Servidor %1 actualmente en modo mantenimiento.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>Registrado desde %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation>Obteniendo autorización del navegador. &lt;a href=&apos;%1&apos;&gt;Click aquí&lt;/a&gt; para volver a abrir el navegador.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation>Conectando a %1...</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>Sin conexión a %1 desde %2.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Iniciar sesión</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
- <translation type="unfinished"/>
+ <translation>Hay carpetas que no fueron sincronizadas debido a que son demasiado grandes:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Confirmar la eliminación de la cuenta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Eliminar conexión</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Abrir carpeta</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Cerrar la sesión</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Reanudar sincronización</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Pausar sincronización</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Realmente quieres detener la sincronización de la carpeta &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Nota:&lt;/b&gt; Esto &lt;b&gt;no&lt;/b&gt; eliminara ningun archivo.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%1 de %2 en uso</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Actualmente no hay información disponible acerca del uso del almacenamiento.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>No hay ninguna conexión de %1 configurada.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Desautentificado</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Desconectado</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Conectado</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Servicio no disponible</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation>Modo mantenimiento</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Error de red</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Error de configuración</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation>Pidiendo Credenciales</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Estado de la cuenta desconocido</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Actividad de Servidor</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Protocolo de Sincronización</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>No Sincronizado </translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>No Sincronizado (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Copiado al portapapeles</translation>
</message>
@@ -469,47 +488,47 @@
<translation>EtiquetaDeTexto</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Actividades de Servidor</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Copiar</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Copiar la lista de actividades al portapapeles.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Acción Requerida: Notificaciones. </translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation type="unfinished"/>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Salir</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Continuar</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>Salir de ownCloud</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>Error escribiendo metadatos a la base de datos</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>No hay una cuenta ownCloud configurada.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>La configuración del servidor al cliente es obsoleta</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Por favor actualice a la última versión del servidor y reinicie el cliente.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Error de autentificación: el usuario o contraseña es incorrecta.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>agotado</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>Las credenciales otorgadas no son correctas</translation>
</message>
@@ -637,131 +681,158 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Interrumpido por el usuario</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>El directorio local %1 no existe.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 debé ser una carpeta pero no lo es.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>No se puede leer %1.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 ha sido eliminado.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 ha sido descargado.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 ha sido actualizado</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Actividad de Sync</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -769,46 +840,46 @@ If you decide to delete the files, they will be unavailable to you, unless you a
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>¿Borrar todos los archivos?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Borrar todos los archivos</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Conservar archivos</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>Sincronizacón Normal.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>Mantener Archivos Locales como Conflicto</translation>
</message>
@@ -816,115 +887,105 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>No se pudo </translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>Una antigua sincronización con journaling &apos;%1&apos; fue encontrada, pero no se pudo eliminar. Por favor, asegurate que ninguna aplicación la está utilizando.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation>(Copia de seguridad)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation>(Copia de seguridad %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Estado no definido.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>Esperando para comenzar sincronización.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Preparando la sincronización.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>Sincronización en funcionamiento.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>La última sincronización fue exitosa.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>El último Sync fue exitoso, pero hubo advertencias en archivos individuales.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>La última sincronización fue exitosa.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Error de configuración.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Interrumpir.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>La sincronización está en pausa.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Sincronización en pausa)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>Carpeta válida no seleccionada! </translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>¡No tenés permisos para escribir el directorio seleccionado!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -934,7 +995,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation type="unfinished"/>
</message>
@@ -969,7 +1030,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Desautentificado</translation>
</message>
@@ -984,115 +1045,133 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>Sincronizando %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>descargado %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>Cargado %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 of %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%5 izquierda, %1 de %2, archivo %3 de %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 de %2, archivo %3 de %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>Archivo %1 de %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>Esperando...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>Preparando para sincronizar...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation type="unfinished"/>
</message>
@@ -1100,17 +1179,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Clic para seleccionar un directorio local a sincornizar</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Ingrese el path al directorio local.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Seleccioná el directorio origen</translation>
</message>
@@ -1118,60 +1197,68 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Crear carpeta remota</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>El directorio fue creado con éxito en %1.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>Autenticación fallida accediendo a %1.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>Fallo al crear el directorio en %1. Por favor chequee manualmente.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>Fallo al listar carpetas. Error: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Seleccioná acá para sincronizar la cuenta completa</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Este folder ya está siendo sincronizado.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Ya estás sincronizando &lt;i&gt;%1&lt;/i&gt;, el cual es el directorio de &lt;i&gt;%2&lt;/i&gt;.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation type="unfinished"/>
</message>
@@ -1179,22 +1266,22 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation type="unfinished"/>
</message>
@@ -1217,23 +1304,38 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Avanzado</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation type="unfinished"/>
</message>
@@ -1253,31 +1355,67 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
- <source>S&amp;how crash reporter</source>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>Acerca de</translation>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
+ <source>S&amp;how crash reporter</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
+ <location filename="../src/gui/generalsettings.ui" line="53"/>
<source>Updates</source>
<translation>Actualizaciones</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1345,34 +1483,34 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Borrar</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>No se pudo abrir el archivo</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>No se pueden guardar cambios en &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Agregar patrón a ignorar</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Añadir nuevo patrón a ignorar:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Esta entrada es provista por el sistema en &apos;%1&apos; y no puede ser modificada en esta vista.</translation>
</message>
@@ -1402,7 +1540,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Carpeta</translation>
</message>
@@ -1417,35 +1555,45 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Copiar</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Hora</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Archivo</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1471,36 +1619,48 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Borrar</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Limpiar la pantalla de registros.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>G&amp;uardar</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Guardar el log en un archivo en disco para depuración.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Guardar archivo de log</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation type="unfinished"/>
</message>
@@ -1508,12 +1668,12 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;El archivo &apos;%1&apos;&lt;br/&gt;no puede ser abierto para escritura.&lt;br/&gt;&lt;br/&gt;¡El archivo de log &lt;b&gt;no&lt;/b&gt; puede ser guardado!&lt;/nobr&gt;</translation>
</message>
@@ -1521,27 +1681,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Nueva versión disponible</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Saltear esta vez</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Obtener actualización</translation>
</message>
@@ -1629,27 +1789,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation>Limitar automáticamente</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Nombre del host para servidor proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Nombre de usuario para el servidor proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Contraseña para el servidor proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>Proxy HTTP(S)</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>Proxy SOCKS5</translation>
</message>
@@ -1657,23 +1817,23 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation type="unfinished"/>
@@ -1682,32 +1842,32 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -1715,58 +1875,58 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation type="unfinished"/>
</message>
@@ -1774,43 +1934,43 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Conectar a %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Configurar opciones de directorio local</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Conectar...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>El directorio %1 &apos;%2&apos; está sincronizado con el directorio local &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Directorio local de sincronización</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation type="unfinished"/>
</message>
@@ -1869,15 +2029,20 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Conectar a %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1907,153 +2072,163 @@ It is not advisable to use it.</source>
<source>&amp;Next &gt;</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Conectado a %1: versión de %2 %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Falló al conectarse a %1 en %2:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>Tiempo excedido mientras se intentaba conectar a %1 desde %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Intentando conectar a %1 en %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>El directorio de sincronización local %1 ya existe, configurándolo para la sincronización.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>aceptar</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>Error.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>No fue posible crear el directorio local %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>¡No se ha especificado un directorio remoto!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Error: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>Creando carpeta en ownCloud: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>El directorio remoto %1 fue creado con éxito.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>El directorio remoto %1 ya existe. Estableciendo conexión para sincronizar.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>La creación del directorio resultó en un error HTTP con código de error %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Error al crear el directorio remoto porque las credenciales provistas son incorrectas.&lt;/font&gt;&lt;br/&gt;Por favor, volvé atrás y verificá tus credenciales.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Error al crear el directorio remoto, probablemente porque las credenciales provistas son incorrectas.&lt;/font&gt;&lt;br/&gt;Por favor, volvé atrás y verificá tus credenciales.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>Se prtodujo un error &lt;tt&gt;%2&lt;/tt&gt; al crear el directorio remoto %1.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>Fue creada una conexión de sincronización desde %1 al directorio remoto %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Conectado con éxito a %1!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>No fue posible establecer la conexión a %1. Por favor, intentalo nuevamente.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Error Al Renombrar Directorio</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Directorio local %1 creado&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2061,13 +2236,30 @@ It is not advisable to use it.</source>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>%1 Asistente de Conexión</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
<translation type="unfinished"/>
</message>
</context>
@@ -2092,7 +2284,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation type="unfinished"/>
</message>
@@ -2100,7 +2292,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>Error escribiendo metadatos a la base de datos</translation>
</message>
@@ -2108,47 +2300,47 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>Error escribiendo metadatos a la base de datos</translation>
</message>
@@ -2156,12 +2348,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation type="unfinished"/>
</message>
@@ -2169,22 +2361,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>Error escribiendo metadatos a la base de datos</translation>
</message>
@@ -2192,17 +2384,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation type="unfinished"/>
</message>
@@ -2210,13 +2402,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>Error escribiendo metadatos a la base de datos</translation>
</message>
@@ -2224,12 +2416,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation type="unfinished"/>
</message>
@@ -2237,12 +2424,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>Error escribiendo metadatos a la base de datos</translation>
</message>
@@ -2250,28 +2437,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>Error escribiendo metadatos a la base de datos</translation>
</message>
@@ -2279,33 +2451,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>Error escribiendo metadatos a la base de datos</translation>
</message>
@@ -2313,27 +2485,27 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation type="unfinished"/>
</message>
@@ -2341,27 +2513,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation type="unfinished"/>
</message>
@@ -2379,42 +2546,47 @@ It is not advisable to use it.</source>
<translation>EtiquetaDeTexto</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Hora</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Archivo</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Carpeta</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Acción</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Tamaño</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Copiar</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Copiar la lista de actividades al portapapeles.</translation>
</message>
@@ -2455,7 +2627,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Elige </translation>
</message>
@@ -2463,33 +2635,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Cargando...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Nombre</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Tamaño</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation type="unfinished"/>
</message>
@@ -2510,22 +2682,22 @@ It is not advisable to use it.</source>
<translation>Configuración</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Actividad</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>General</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Red</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Cuenta</translation>
</message>
@@ -2533,28 +2705,28 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Actividad</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>General</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Red</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Cuenta</translation>
</message>
@@ -2582,42 +2754,42 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation type="unfinished"/>
</message>
@@ -2630,7 +2802,17 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>EtiquetaDeTexto</translation>
</message>
@@ -2660,115 +2842,120 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="20"/>
- <source>Anyone with the link has access to the file/folder</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
- <source>P&amp;assword protect</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="20"/>
+ <source>Anyone with the link has access to the file/folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
+ <source>P&amp;assword protect</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Borrar</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Mandar enlace por e-mail</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Cancelar</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation type="unfinished"/>
</message>
@@ -2791,32 +2978,32 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Mandar enlace por e-mail</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
@@ -2829,37 +3016,38 @@ It is not advisable to use it.</source>
<translation>Formulario</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>EtiquetaDeTexto</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>podés editar</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>puede compartir</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>crear</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>borrar</translation>
</message>
@@ -2903,142 +3091,175 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>Pais:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation type="unfinished"/>
@@ -3125,305 +3346,270 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Éxito.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;No fue posible cargar el plugin de %1 para csync.&lt;br/&gt;Por favor, verificá la instalación&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>Error fatal de parámetro en CSync.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>Falló el proceso de actualización de CSync.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>Falló el proceso de composición de CSync</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync no pudo autenticar el proxy.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSync falló al realizar la busqueda del proxy.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync: fallo al autenticarse en el servidor %1.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync: fallo al conectarse a la red</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>Ha ocurrido un error de transmisión HTTP.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: No hay más espacio disponible en el servidor %1.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>Error no especificado de CSync</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Interrumpido por el usuario</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>Los vínculos simbólicos no está soportados al sincronizar.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>El archivo está en la lista de ignorados.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation type="unfinished"/>
</message>
@@ -3447,17 +3633,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -3488,81 +3674,81 @@ It is not advisable to use it.</source>
<translation>Por favor, inicie sesión</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Directorio %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Cerrar la sesión</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Cambios recientes</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Directorios administrados:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Abrir carpeta &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Abrir %1 en el navegador...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Estado desconocido</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Configuraciones...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Detalles...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Ayuda</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>Cancelar %1</translation>
</message>
@@ -3577,11 +3763,6 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Desconectado</translation>
@@ -3613,116 +3794,129 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>Sobre %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>No se sincronizaron elementos recientemente</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>Sincronizando %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>actualizado</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation type="unfinished"/>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3734,9 +3928,9 @@ It is not advisable to use it.</source>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>EtiquetaDeTexto</translation>
</message>
@@ -3772,11 +3966,22 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Elegir que sincronizar</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>Directorio &amp;local</translation>
@@ -3793,11 +3998,16 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Mensaje de estado</translation>
</message>
@@ -3834,7 +4044,7 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
+ <source>An error occurred while connecting. Please try again.</source>
<translation type="unfinished"/>
</message>
<message>
@@ -4015,7 +4225,7 @@ It is not advisable to use it.</source>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -4113,52 +4323,52 @@ It is not advisable to use it.</source>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Estado indefinido</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Esperando para comenzar sincronización</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>Sincronización en ejecución</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Sincronización Exitosa</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Syncronización exitosa, algunos archivos fueron ignorados.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Error de Sync</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Error de instalación</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Preparando para la sincronizacipon</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Abortando...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>Sincronización Pausada</translation>
</message>
@@ -4166,22 +4376,22 @@ It is not advisable to use it.</source>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation type="unfinished"/>
</message>
diff --git a/translations/client_et.ts b/translations/client_et.ts
index e477a5ecb..36a0bdb62 100644
--- a/translations/client_et.ts
+++ b/translations/client_et.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="et_EE" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,17 +95,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Ühendus aegus</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation type="unfinished"/>
</message>
@@ -116,17 +135,17 @@
<message>
<location filename="../src/gui/accountsettings.ui" line="198"/>
<source>Synchronize all</source>
- <translation type="unfinished"/>
+ <translation>Sünkrooni kõik</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="205"/>
<source>Synchronize none</source>
- <translation type="unfinished"/>
+ <translation>Ära sünkrooni midagi</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="212"/>
<source>Apply manual changes</source>
- <translation type="unfinished"/>
+ <translation>Rakenda käsitsi tehtud muudatused</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="260"/>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Loobu</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Konto</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
- <translation>Vali, mida sünkroniseerida</translation>
+ <translation>Vali, mida sünkroonida</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
- <translation type="unfinished"/>
+ <translation>Sünkrooni jõuga kohe</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
- <translation type="unfinished"/>
+ <translation>Taaskäivita sünkroonimine</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Kausta loomine ebaõnnestus</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Sünkroniseerimine on käimas</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>Sünkroniseerimine on käimas.&lt;br/&gt;Kas sa soovid seda lõpetada?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 kasutusel</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 as &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Ühendatud %1</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>Server %1 pole ajutiselt saadaval.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Logi sisse</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Kinnita konto eemaldamine</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Eemalda ühendus</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Ava kaust</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Logi välja</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Taasta sünroonimist</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Peata sünkroonimine</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Hetkel pole mahu kasutuse info saadaval.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>Ühtegi %1 ühendust pole seadistatud.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Välja logitud</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Lahti ühendatud</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Ühendatud</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Teenus pole saadaval</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
- <translation type="unfinished"/>
+ <translation>Hooldusrežiim</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Võrgu viga</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Seadistamise tõrge</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
- <translation type="unfinished"/>
+ <translation>Kasutajatunnuste küsimine</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Tundmatu konto olek</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Serveri aktiivsus</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Sünkroniseerimisprotokoll</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>Pole sünkroonitud</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Kopeeritud lõikepuhvrisse</translation>
</message>
@@ -469,47 +488,47 @@
<translation>Tekstisilt</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Serveri tegevused</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Kopeeri</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Kopeeri tegevuste nimistu puhvrisse.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation type="unfinished"/>
</message>
@@ -555,19 +574,44 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Lõpeta</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Jätka</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
- <translation type="unfinished"/>
+ <translation>Sulge ownCloud</translation>
</message>
</context>
<context>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>Ühtegi ownCloud kontot pole seadistatud</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>Seadistatud server on selle kliendi jaoks liiga vana</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Palun uuenda server viimasele versioonile ning taaskäivita klient.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Autentimise tõrge: Kasutajanimi või parool on vale</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>aegumine</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>Sisestatud kasutajatunnused pole õiged</translation>
</message>
@@ -637,131 +681,158 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Kasutaja poolt tühistatud</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>Kohalikku kausta %1 pole olemas.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 pole loetav.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 on eemaldatud.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 on alla laaditud.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 on uuendatud.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 on ümber nimetatud %2.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 on tõstetud %2.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 sünkroniseerimine ebaõnnestus tõrke tõttu. Lisainfot vaata logist.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Sünkroniseerimise tegevus</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>Süsteemi väljajätmiste faili lugemine ebaõnnestus</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -769,46 +840,46 @@ If you decide to delete the files, they will be unavailable to you, unless you a
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Kustutada kõik failid?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Kustutada kõik failid</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Säilita failid</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>Leiti varukoopia</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>Tavaline sünkroonimine</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation type="unfinished"/>
</message>
@@ -816,115 +887,105 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>Ei suutnud tühistada kataloogi staatust</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>Leiti vana sünkroniseeringu zurnaal &apos;%1&apos;, kuid selle eemaldamine ebaõnnenstus. Palun veendu, et seda kasutaks ükski programm.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation>(varukoopia)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation> (varukoopia %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Määramata staatus.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>Oodatakse sünkroonimise alustamist.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Valmistun sünkroniseerima.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>Sünkroniseerimine on käimas.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>Viimane sünkroniseerimine oli edukas.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>Viimane sünkroniseering oli edukas, kuid mõned failid põhjustasid tõrkeid.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>Viimane sünkroniseerimine oli edukas.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Seadistamise viga.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Kasutaja tühistamine.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>Sünkroniseerimine on peatatud.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Sünkroniseerimine on peatatud)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>Sobilikku kausta pole valitud!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>Valitud asukoht pole kaust!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Sul puuduvad õigused valitud kataloogi kirjutamiseks!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -934,7 +995,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation type="unfinished"/>
</message>
@@ -969,7 +1030,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Välja logitud</translation>
</message>
@@ -984,115 +1045,133 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Kontrollitakse muudatusi kaustas &apos;%1&apos;</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>Sünkroniseerimine %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>allalaadimine %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>üleslaadimine %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 / %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 / %2, fail %3 / %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>fail %1 / %2-st</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>Ootamine...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>Sünkroniseerimiseks valmistumine...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation type="unfinished"/>
</message>
@@ -1100,17 +1179,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Klõpsa valimaks kohalikku sünkroniseeritavat kataloogi.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Sisesta otsingutee kohaliku kataloogini.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Vali algne kaust</translation>
</message>
@@ -1118,60 +1197,68 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Loo kaugkaust</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>%1 - kaust on loodud.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>Kausta loomine ebaõnnestus - %1. Palun kontrolli käsitsi.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Vali see sünkroniseering tervele kontole</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Seda kataloogi juba sünkroniseeritakse.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Sa juba sünkroniseerid &lt;i&gt;%1&lt;/i&gt;, mis on &lt;i&gt;%2&lt;/i&gt; ülemkataloog.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Hoiatus:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Hoiatus:&lt;/b&gt;</translation>
</message>
@@ -1179,22 +1266,22 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>Ühtegi E-Silti ei saabunud serverist, kontrolli puhverserverit/lüüsi.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>Saime jätkamiseks erineva E-Sildi. Proovin järgmine kord uuesti.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>Server tagastas vale vahemiku</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Ühenduse aegumine</translation>
</message>
@@ -1217,23 +1304,38 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Süsteemisalve jaoks</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Täpsem</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation type="unfinished"/>
</message>
@@ -1253,31 +1355,67 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Kasuta ühevärvilisi ikoone</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>Muuda &amp;ignoreeritud faile</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>&amp;Näita kokkujooksmise teavitajat</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>Info</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>Uuendused</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>&amp;Taaskäivita &amp;&amp; Uuenda</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Loobu</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1345,34 +1483,34 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Eemalda</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Ei suutunud avada faili</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>Ei saa kirjutada muudatusi &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Lisa ignoreerimise muster</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Lisa uus ignoreerimise muster:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Selle kirje on pakkunud süsteem &apos;%1&apos; ning seda ei saa antud vaates muuta.</translation>
</message>
@@ -1402,7 +1540,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Kaust</translation>
</message>
@@ -1417,35 +1555,45 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Kopeeri</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Aeg</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Fail</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1471,36 +1619,48 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Tühjenda</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Tühjenda näidatav logi.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>S&amp;alvesta</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Salvesta logi fail kettale täpsemaks uurimiseks.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Salvesta logifail</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Viga</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>Logifaili %1 kirjutamine ebaõnnestus</translation>
</message>
@@ -1508,12 +1668,12 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Viga</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;Faili &apos;%1&apos;&lt;br/&gt;ei saa kirjutamiseks avada.&lt;br/&gt;&lt;br/&gt;Logi väljundit &lt;b&gt;ei saa&lt;/b&gt; salvestada!&lt;/nobr&gt;</translation>
</message>
@@ -1521,27 +1681,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Saadaval on uuem versioon</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;Uus versioon %1 kliendist on saadaval.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; on saadaval alla laadimiseks. Paigaldatud on versioon %3.&lt;p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Jäta see versioon vahele</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Jäta seekord vahele</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Hangi uuendus</translation>
</message>
@@ -1629,27 +1789,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation>Piira automaatselt</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Proksiserveri hostinimi</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Proksiserveri kasutajanimi</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Proksiserveri parool</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>HTTP(S) proksi</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>SOCKS5 proksi</translation>
</message>
@@ -1657,23 +1817,23 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation type="unfinished"/>
@@ -1682,32 +1842,32 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -1715,58 +1875,58 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Uus %1 uuendus on valmis</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>Laadin alla versiooni %1. Palun oota...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>Ei suutnud uuendust alla laadida. Palun klõpsa käsitsi uuenduse alla laadimiseks &lt;a href=&apos;%1&apos;&gt;siia&lt;/a&gt; %2</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Uuenduste kontrollimine ebaõnnestus.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Kontrollin uuendusserverit...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>Uuenduse staatus on teadmata: Uuendusi ei kontrollitud.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>Uuendusi pole saadaval. Kasutad kõige viimast versiooni.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Uuenduste kontrollimine</translation>
</message>
@@ -1774,43 +1934,43 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Ühendu %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Seadista kohaliku kataloogi valikud</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Ühenda...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1 kataloog &apos;%2&apos; on sünkroniseeritud kohalikku kataloogi &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>Sünkrooni kaust &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Kohalik Sync Kataloog</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1869,15 +2029,20 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Ühendu %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1908,153 +2073,163 @@ Selle kasutamine pole soovitatav.</translation>
<source>&amp;Next &gt;</source>
<translation>&amp;Edasi &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Edukalt ühendatud %1: %2 versioon %3 (4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Ühendumine ebaõnnestus %1 %2-st:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Püüan ühenduda %1 kohast %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>Kohalik kataloog %1 on juba olemas. Valmistan selle ette sünkroniseerimiseks.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>Kohaliku kausta %1 sünkroonimise loomine ... </translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>ok</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>ebaõnnestus.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>Ei suuda tekitada kohalikku kataloogi %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>Ühtegi võrgukataloogi pole määratletud!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Viga: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>loon uue kataloogi ownCloudi: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>Eemalolev kaust %1 on loodud.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>Serveris on kataloog %1 juba olemas. Ühendan selle sünkroniseerimiseks.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>Kausta tekitamine lõppes HTTP veakoodiga %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>Kataloogi loomine serverisse ebaõnnestus, kuna kasutajatõendid on valed!&lt;br/&gt;Palun kontrolli oma kasutajatunnust ja parooli.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Serveris oleva kataloogi tekitamine ebaõnnestus tõenäoliselt valede kasutajatunnuste tõttu.&lt;/font&gt;&lt;br/&gt;Palun mine tagasi ning kontrolli kasutajatunnust ning parooli.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>Kataloogi %1 tekitamine serverisse ebaõnnestus veaga &lt;tt&gt;%2&lt;/tt&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>Loodi sünkroniseerimisühendus kataloogist %1 serveri kataloogi %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Edukalt ühendatud %1!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>Ühenduse loomine %1 ebaõnnestus. Palun kontrolli uuesti.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Kataloogi ümbernimetamine ebaõnnestus</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>Ei suuda eemaldada ning varundada kataloogi kuna kataloog või selles asuv fail on avatud mõne teise programmi poolt. Palun sulge kataloog või fail ning proovi uuesti või katkesta paigaldus.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Kohalik kataloog %1 edukalt loodud!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2062,14 +2237,31 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>%1 seadistamise juhendaja</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Jäta kaustade seadistamine vahele</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2093,7 +2285,7 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation type="unfinished"/>
</message>
@@ -2101,7 +2293,7 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2109,47 +2301,47 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>Faili %1 ei saa alla laadida kuna on konflikt kohaliku faili nimega.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>Fail on serverist kustutatud</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>Faili täielik allalaadimine ebaõnnestus.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>Faili %1 ei saa salvestada kuna on nime konflikt kohaliku failiga!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>Faili on pärast avastamist muudetud</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2157,12 +2349,12 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; Taastamine ebaõnnestus: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation type="unfinished"/>
</message>
@@ -2170,22 +2362,22 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>ei saa kustutada faili %1, viga: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>Tähelepanu, võimalik tõusutundliku nime konflikt %1-ga</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>kausta %1 loomine ebaõnnestus</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2193,17 +2385,17 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>Viga eemaldamisel &apos;%1&apos;: %2; </translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>Kausta &apos;%1&apos; eemaldamine ebaõnnestus</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>Ei saa eemaldada %1 kuna on konflikt kohaliku faili nimega</translation>
</message>
@@ -2211,13 +2403,13 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>Faili %1 ei saa ümber nimetada %2-ks, kuna on konflikt kohaliku faili nimega</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2225,12 +2417,7 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>Fail oli eemaldatud kirjutamisõiguseta kataloogist. See on nüüd taastatud.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>Server saatis vale HTTP koodi. Ootuspärane kood oli 204, aga saadeti kood &quot;%1 %2&quot;.</translation>
</message>
@@ -2238,12 +2425,12 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Server saatis vale HTTP koodi. Ootuspärane kood oli 201, aga saadeti kood &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2251,28 +2438,13 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Kausta ei tohi ümber nimetada. Kausta algne nimi taastati.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Kausta nime ei tohi muuta. Palun pane selle nimeks tagasi Shared.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>Fail oli ümber nimetatud, kuid see on osa kirjutamisõiguseta jagamisest. Algne fail taastati.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Server saatis vale HTTP koodi. Ootuspärane kood oli 201, aga saadeti kood &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2280,33 +2452,33 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Fail eemaldatud</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>Kohalik fail muutus sünkroniseeringu käigus. See taastakse.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>Kohalik fail muutus sünkroniseeringu käigus.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2314,27 +2486,27 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>Kohalik fail on eemaldatud sünkroniseeringu käigus.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>Kohalik fail muutus sünkroniseeringu käigus.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation type="unfinished"/>
</message>
@@ -2342,27 +2514,22 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>Faili on lokaalselt muudetud, kuid see on osa kirjutamisõiguseta jagamisest. See on taastatud ning sinu muudatus on konfliktses failis.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>Küsitluse URL puudub</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>Kohalik fail on eemaldatud sünkroniseeringu käigus.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>Kohalik fail muutus sünkroniseeringu käigus.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation type="unfinished"/>
</message>
@@ -2380,42 +2547,47 @@ Selle kasutamine pole soovitatav.</translation>
<translation>Tekstisilt</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Ava veebilehitsejas</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Aeg</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Fail</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Kaust</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Tegevus</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Suurus</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Kopeeri</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Kopeeri tegevuste nimistu puhvrisse.</translation>
</message>
@@ -2456,7 +2628,7 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Vali, mida sünkroniseerida</translation>
</message>
@@ -2464,33 +2636,33 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Laadimine ...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Nimi</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Suurus</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>Serveris pole praegu alamkaustasid.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation type="unfinished"/>
</message>
@@ -2511,22 +2683,22 @@ Selle kasutamine pole soovitatav.</translation>
<translation>Seaded</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Toimingud</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Üldine</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Võrk</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Konto</translation>
</message>
@@ -2534,28 +2706,28 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Toimingud</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Üldine</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Võrk</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Konto</translation>
</message>
@@ -2583,42 +2755,42 @@ Selle kasutamine pole soovitatav.</translation>
<translation>ownCloudi kaust:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>%1 jagamine</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Kaust: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>See server ei luba jagamist</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>Avalikud lingid</translation>
</message>
@@ -2631,7 +2803,17 @@ Selle kasutamine pole soovitatav.</translation>
<translation>Jaga faili NewDocument.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>Tekstisilt</translation>
</message>
@@ -2661,19 +2843,24 @@ Selle kasutamine pole soovitatav.</translation>
<translation>Määra parool</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>Näita failide nimekirja</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Luba muutmine</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2681,95 +2868,95 @@ Selle kasutamine pole soovitatav.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>P&amp;arooliga kaitstud</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Parooliga kaitstud</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Kustuta</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Saada link e-postiga</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Loobu</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation>Avalik link</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>Avalik j&amp;agamine nõuab parooli</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Palun määra parool</translation>
</message>
@@ -2792,32 +2979,32 @@ Selle kasutamine pole soovitatav.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Saada link e-postiga</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
@@ -2830,37 +3017,38 @@ Selle kasutamine pole soovitatav.</translation>
<translation>Vorm</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>Tekstisilt</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>saab muuta</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>saab jagada</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>loo</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>muuda</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>kustuta</translation>
</message>
@@ -2904,143 +3092,176 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>Jagatud kasutajaga %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Ava veebilehitsejas</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Sertifikaadi detailid&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Üldine nimi (CN):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>Subjekti Alternatiivsed Nimed:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Organisatsioon (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Organisatsiooni üksus (OU):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Riik/Maakond:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>Riik:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Järjenumber:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Väljastaja&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Väljastaja:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Väljastatud:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Aegub:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Sõrmejäljendid&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;Märkus&lt;/b&gt;See sertifikaat on käsitsi heakskiidetud&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (oma-signeering)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>Ühendus on krüpteeritud kasutades %1 bitt %2
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Seritifikaadi informatsioon:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>See url EI OLE turvaline, kuna see pole krüpteeritud.
@@ -3128,305 +3349,270 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Korras.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;Ei suuda laadida csync lisa %1.&lt;br/&gt;Palun kontrolli paigaldust!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>CSync parameetri saatuslik viga.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>CSync uuendusprotsess ebaõnnestus.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>CSync tasakaalustuse protsess ebaõnnestus.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync ei suutnud puhverserveris autoriseerida.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>Csync ei suuda leida puhverserverit.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync autoriseering serveris %1 ebaõnnestus.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync võrguga ühendumine ebaõnnestus.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>Toimus võrgukatkestus.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>HTTP ülekande viga.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: Serveris %1 on ruum otsas.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>CSync tuvastamatu viga.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Kasutaja poolt tühistatud</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>CSyncile ligipääs ebaõnnestus</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>Teenus pole ajutiselt saadaval</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>Ligipääs on keelatud</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>Sümboolsed lingid ei ole sünkroniseerimisel toetatud.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>Fail on märgitud ignoreeritavate nimistus.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>Faili nimi on liiga pikk.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>Failinime kodeering pole kehtiv</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>Ei suuda avada sünkroniseeringu zurnaali</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>Faili nimesonvähemalt üks keelatud märk</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>&quot;Vali, mida sünkroniseerida&quot; musta nimekirja tõttu vahele jäetud</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>Pole lubatud üles laadida, kuna tegemist on ainult-loetava serveriga, taastan</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>Eemaldamine pole lubatud, taastan</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>Kohalikud failid ja jagatud kaustad eemaldatud.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>Liigutamine pole lubatud, üksus taastatud</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>Liigutamien pole võimalik kuna %1 on ainult lugemiseks</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>sihtkoht</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>allikas</translation>
</message>
@@ -3450,17 +3636,17 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -3491,81 +3677,81 @@ Selle kasutamine pole soovitatav.</translation>
<translation>Palun logi sisse</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Kaust %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Sünkroniseeritavaid kaustasid pole määratud.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Ava veebilehitsejas</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Logi sisse...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Logi välja</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Hiljutised muudatused</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Kontrollitakse muudatusi kaustas &apos;%1&apos;</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Hallatavad kaustad:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Ava kaust &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Ava %1 veebilehitsejas</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Tundmatu staatus</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Seaded...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Üksikasjad...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Abiinfo</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>Lõpeta %1</translation>
</message>
@@ -3580,11 +3766,6 @@ Selle kasutamine pole soovitatav.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Lahti ühendatud</translation>
@@ -3616,116 +3797,129 @@ Selle kasutamine pole soovitatav.</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Logi välja kõikidelt kontodelt</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Logi sisse kõikidesse kontodesse...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>Rakendusest %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>Jookse kokku</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Ühtegi üksust pole hiljuti sünkroniseeritud</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Sünkroniseerin %1 %2-st (%3 veel)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Sünkroniseerin %1 (%2 veel)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>Sünkroniseerimine %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Ajakohane</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation type="unfinished"/>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3737,9 +3931,9 @@ Selle kasutamine pole soovitatav.</translation>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>Tekstisilt</translation>
</message>
@@ -3775,11 +3969,22 @@ Selle kasutamine pole soovitatav.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Vali, mida sünkroniseerida</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>&amp;Kohalik kataloog</translation>
@@ -3796,11 +4001,16 @@ Selle kasutamine pole soovitatav.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Staatuse teade</translation>
</message>
@@ -3837,7 +4047,7 @@ Selle kasutamine pole soovitatav.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
+ <source>An error occurred while connecting. Please try again.</source>
<translation type="unfinished"/>
</message>
<message>
@@ -4017,7 +4227,7 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -4115,52 +4325,52 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Staatus on määramata</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Oodatakse sünkroniseerimise alustamist</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>Sünkroniseerimine on käimas</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Sünkroniseerimine on tehtud</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Sünkroniseering õnnestus, mõnda faili ignoreeriti.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Sünkroniseerimise viga</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Viga sünkroniseerimisel</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Sünkroniseerimiseks valmistumine</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Tühistamine ...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>Sünkroniseerimine on peatatud</translation>
</message>
@@ -4168,22 +4378,22 @@ Selle kasutamine pole soovitatav.</translation>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation type="unfinished"/>
</message>
diff --git a/translations/client_eu.ts b/translations/client_eu.ts
index 10eea4ab2..1e2ec70d8 100644
--- a/translations/client_eu.ts
+++ b/translations/client_eu.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="eu" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,17 +95,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Konexioa denboraz kanpo</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation type="unfinished"/>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Ezeztatu</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Kontua</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Hautatu zer sinkronizatu</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Behartu orain sinkronizatzen</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>Berrabiarazi sinkronizazioa</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>Ezabatu karpeta honen konexioa</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Karpeta sortzeak huts egin du</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;Ezin izan da &lt;i&gt;%1&lt;/i&gt; bertako karpeta sortu.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>Baieztatu Karpetaren Konexioaren Ezabatzea</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>Ezabatu Karpeta Honen Konexioa</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Sinkronizazioa martxan da</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>Sinkronizazio martxan da.&lt;br/&gt;Bukatu nahi al duzu?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 erabiltzen</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>Zerbitzariaren bertsioa %1 zaharra eta euskarririk gabekoa da! Zure ardurapean aritu.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>%1ra konektatuta.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>%1 zerbitzaria ez dago orain eskuragarri</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>%1etik saioa itxita.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>Konexiorik ez %1-ekin %2-etan</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Hasi saioa</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Baieztatu Kontuaren Ezabatzea</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Ezabatu konexioa</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Ireki karpeta</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Saioa bukatu</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Berrekin sinkronizazioa</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Gelditu sinkronizazioa</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%2tik %1 erabilita</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Orain ez dago eskuragarri biltegiratze erabileraren informazioa.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>Ez dago %1 konexiorik konfiguratuta.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Saioa bukatuta</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Deskonektatuta</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Konektatuta</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Zerbitzua ez dago eskuragarri</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Sare errorea</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Konfigurazio errorea</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Kontuaren egoera ezezaguna</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Zerbitzariaren Jarduera</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Sinkronizazio protokoloa</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>Sinkronizatu gabekoak</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Arbelera kopiatua</translation>
</message>
@@ -469,47 +488,47 @@
<translation>TestuEtiketa</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Zerbitzariaren Jarduerak</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Kopiatu</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Kopiatu jarduera zerrenda arbelara.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;%1 kontuak ez ditu jarduerak gaituta.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation type="unfinished"/>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Irten</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Jarraitu</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation>Errorea ezarpen fitxategia atzitzean</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation>Errore bat gertatu da ezarpen fitxategia atzitzean %1-etan</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>Irten ownCloud-etik</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>Errorea metadatuak datu-basean idaztean</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>Ez dago ownCloud konturik konfiguratuta</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>Bezero honentzako konfiguratutako zerbitzaria oso zaharra da</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Mesedez eguneratu zerbitzarira eta berrabiarazi bezeroa.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Autentikazio errorea: Erabiltzaile izena edota pasahitza gaizki daude.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>denbora iraungi da</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>Emandako kredentzialak ez dira zuzenak</translation>
</message>
@@ -637,131 +681,158 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Erabiltzaileak bertan behera utzita</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>Bertako %1 karpeta ez da existitzen.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 karpeta bat izan behar zen baina ez da.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 ezin da irakurri.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 ezabatua izan da.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 deskargatu da.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 kargatu da.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 %2-(e)ra berrizendatu da.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 %2-(e)ra mugitu da.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 ezin izan da sinkronizatu akats bat dela eta. Ikusi egunerkoa zehaztapen gehiago izateko.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Sinkronizazio Jarduerak</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>Ezin izan da sistemako baztertutakoen fitxategia irakurri</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -769,46 +840,46 @@ If you decide to delete the files, they will be unavailable to you, unless you a
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Ezabatu Fitxategi Guztiak?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Ezabatu fitxategi guztiak</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Mantendu fitxategiak</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation type="unfinished"/>
</message>
@@ -816,115 +887,105 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>Ezin izan da karpetaren egoera berrezarri</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>Aurkitu da &apos;%1&apos; sinkronizazio erregistro zaharra, baina ezin da ezabatu. Ziurtatu aplikaziorik ez dela erabiltzen ari.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Definitu gabeko egoera.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>Itxoiten sinkronizazioa hasteko.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Sinkronizazioa prestatzen.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>Sinkronizazioa martxan da.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>Azkeneko sinkronizazioa ongi burutu zen.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>Azkenengo sinkronizazioa ongi burutu zen, baina banakako fitxategi batzuetan abisuak egon dira.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>Azkeneko sinkronizazioa ongi burutu zen.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Konfigurazio errorea.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Erabiltzaileak bertan behera utzi.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>Sinkronizazioa pausatuta dago.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Sinkronizazioa pausatuta dago)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>Ez da karpeta egokirik hautatu!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>Hautatutako bidea ez da karpeta bat!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Ez daukazu hautatutako karpetan idazteko baimenik!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -934,7 +995,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Gehitu Karpeta Sinkronizatzeko Konexioa</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation type="unfinished"/>
</message>
@@ -969,7 +1030,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Errorea zerbitzaritik karpeten zerrenda eskuratzean.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Saioa bukatuta</translation>
</message>
@@ -984,115 +1045,133 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>%1 Sinkronizatzen</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>Deskargatu %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>igo %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%4 - %3tik)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>%1. fitxategia %2tik</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>Itxoiten...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>Itxoiten beste karpeta %n...</numerusform><numerusform>Itxoiten beste %n karpeta...</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>Sinkronizatzeko prestatzen...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>Gehitu Karpeta Sinkronizatzeko Konexioa</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>Gehitu Sinkronizazio Konexioa</translation>
</message>
@@ -1100,17 +1179,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Klikatu sinkronizatzeko bertako karpeta bat sinkronizatzeko.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Sartu bertako karpeta berriaren bidea:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Hautatu jatorrizko karpeta</translation>
</message>
@@ -1118,60 +1197,68 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Sortu Urruneko Karpeta</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>Sartu behean sortuko den karpeta berriaren izena &apos;%1&apos;:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>%1-en karpeta ongi sortu da.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>Autentikazioak huts egin du %1en sartzean</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>Huts egin du %1-(e)an karpeta sortzen. Egiaztatu eskuz.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>Karpetaren zerrenda lortzeak huts egin du: Error: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Hautatu hau kontu osoa sinkronizatzeko</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Karpeta hau dagoeneko sinkronizatzen ari da.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Dagoeneko &lt;i&gt;%1&lt;/i&gt; sinkronizatzen ari zara, &lt;i&gt;%2&lt;/i&gt;-ren guraso karpeta dena.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Abisua:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Abisua:&lt;/b&gt;</translation>
</message>
@@ -1179,22 +1266,22 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>Ez da E-Tagik jaso zerbitzaritik, egiaztatu Proxy/Gateway</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>Jarraitzeko E-Tag ezberdina jaso dugu. Hurrengoan saiatuko gara berriz.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>Zerbitzariak eduki-hein desegokia itzuli du</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Konexioa denboraz kanpo</translation>
</message>
@@ -1217,23 +1304,38 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Aurreratua</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation type="unfinished"/>
</message>
@@ -1253,31 +1355,67 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Erabili &amp;Kolore Bakarreko Ikonoak</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
- <source>S&amp;how crash reporter</source>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>Honi buruz</translation>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
+ <source>S&amp;how crash reporter</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
+ <location filename="../src/gui/generalsettings.ui" line="53"/>
<source>Updates</source>
<translation>Eguneraketak</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>Be&amp;rrabiarazi eta Eguneratu</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Ezeztatu</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1345,7 +1483,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Ezabatu</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1354,27 +1492,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
Ezabatzeko baimena duten itemak ezabatuko dira hauek karpeta bat ezabatzea uzten ez badute. Hau meta datuentzat interesgarria da.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Ezin izan da fitxategia ireki</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>Ezin izan dira aldaketa idatzi hemen &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Gehitu Baztertzeko Eredua</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Gehitu baztertzeko eredu berria:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation type="unfinished"/>
</message>
@@ -1404,7 +1542,7 @@ Ezabatzeko baimena duten itemak ezabatuko dira hauek karpeta bat ezabatzea uzten
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Karpeta</translation>
</message>
@@ -1419,35 +1557,45 @@ Ezabatzeko baimena duten itemak ezabatuko dira hauek karpeta bat ezabatzea uzten
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Kopiatu</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Noiz</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Fitxategia</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1473,36 +1621,48 @@ Ezabatzeko baimena duten itemak ezabatuko dira hauek karpeta bat ezabatzea uzten
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Garbitu</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Garbitu egunkari bistaratzea.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>&amp;Gorde</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Gorde egunkari fitxategia fitxategi batean arazteko.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Gorde egunkari fitxategia</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Errorea</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation type="unfinished"/>
</message>
@@ -1510,12 +1670,12 @@ Ezabatzeko baimena duten itemak ezabatuko dira hauek karpeta bat ezabatzea uzten
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Errorea</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;&apos;%1&apos; Fitxategia&lt;br/&gt; ezin da idazteko ireki.&lt;br/&gt;&lt;br/&gt;Egunkariaren irteera &lt;b&gt;ezin&lt;/b&gt; da gorde!&lt;/nobr&gt;</translation>
</message>
@@ -1523,27 +1683,27 @@ Ezabatzeko baimena duten itemak ezabatuko dira hauek karpeta bat ezabatzea uzten
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Bertsio berria eskuragarri</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt; %1 bezeroaren bertsio berri bat eskuragarri dago.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt;deskargatzeko prest dago. Instalatuta dagoen bersioa %3 da.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Ez eguneratu bertsio hau</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Utzi aldi honetan</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Eskuratu eguneraketa</translation>
</message>
@@ -1631,27 +1791,27 @@ Ezabatzeko baimena duten itemak ezabatuko dira hauek karpeta bat ezabatzea uzten
<translation>Automatikoki mugatu</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Proxy zerbitzariaren hostalari izena</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Proxy zerbitzariaren erabiltzaile izena</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Proxy zerbitzarirako pasahitza</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>HTTP(S) proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>SOCKS5 proxy</translation>
</message>
@@ -1659,23 +1819,23 @@ Ezabatzeko baimena duten itemak ezabatuko dira hauek karpeta bat ezabatzea uzten
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>Ixten segundo gutxi barru...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation type="unfinished"/>
@@ -1684,32 +1844,32 @@ Ezabatzeko baimena duten itemak ezabatuko dira hauek karpeta bat ezabatzea uzten
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -1717,58 +1877,58 @@ Ezabatzeko baimena duten itemak ezabatuko dira hauek karpeta bat ezabatzea uzten
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>%1 Bertsioa deskargatzen. Mesedez itxoin...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Ezin da eguneraketarik bilatu.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Eguneraketa zerbitzaria galdetzen...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>Ez dago eguneraketarik eskuragarri. Zure instalazioa azkenengo bertsioa da.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Begiratu bertsio berririk ba ote den</translation>
</message>
@@ -1776,43 +1936,43 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>%1ra konektatu</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Konfiguratu bertako karpeten aukerak</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Konektatu...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>&apos;%1&apos; karpeta sinkronizatu</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Sinkronizazio karpeta lokala</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1871,15 +2031,20 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>%1ra konektatu</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1910,153 +2075,163 @@ Ez da gomendagarria erabltzea.</translation>
<source>&amp;Next &gt;</source>
<translation>&amp;Hurrengoa &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>Baliogabeko URLa</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Konexioa ongi burutu da %1 zerbitzarian: %2 bertsioa %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>Denbora iraungi da %1era %2n konektatzen saiatzean.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>%2 zerbitzarian dagoen %1 konektatzen...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>Baliogabeko URLa</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>Bertako %1 karpeta dagoeneko existitzen da, sinkronizaziorako prestatzen.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>Bertako %1 sinkronizazio karpeta sortzen...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>ados</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>huts egin du.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>Ezin da %1 karpeta lokala sortu</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>Ez da urruneko karpeta zehaztu!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Errorea: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>ownClouden karpeta sortzen: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>Urruneko %1 karpeta ongi sortu da.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>Urruneko %1 karpeta dagoeneko existintzen da. Bertara konetatuko da sinkronizatzeko.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>Karpeta sortzeak HTTP %1 errore kodea igorri du</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>Huts egin du urrutiko karpeta sortzen emandako kredintzialak ez direlako zuzenak!&lt;br/&gt; Egin atzera eta egiaztatu zure kredentzialak.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Urruneko karpeten sortzeak huts egin du ziuraski emandako kredentzialak gaizki daudelako.&lt;/font&gt;&lt;br/&gt;Mesedez atzera joan eta egiaztatu zure kredentzialak.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>Urruneko %1 karpetaren sortzeak huts egin du &lt;tt&gt;%2&lt;/tt&gt; errorearekin.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>Sinkronizazio konexio bat konfiguratu da %1 karpetatik urruneko %2 karpetara.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>%1-era ongi konektatu da!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>%1 konexioa ezin da ezarri. Mesedez egiaztatu berriz.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Karpetaren berrizendatzeak huts egin du</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>Ezin da karpeta ezabatu eta kopia egin, karpeta edo barruko fitxategiren bat beste programa batean irekita dagoelako. Mesedez itxi karpeta edo fitxategia eta sakatu berrekin edo ezeztatu konfigurazioa.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Bertako sinkronizazio %1 karpeta ongi sortu da!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2064,14 +2239,31 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>%1 Konexio Morroia</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Saltatu karpeten ezarpenak</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2095,7 +2287,7 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation type="unfinished"/>
</message>
@@ -2103,7 +2295,7 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>Errorea metadatuak datu-basean idaztean</translation>
</message>
@@ -2111,47 +2303,47 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>Fitxategia zerbitzaritik ezabatua izan da</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>Errorea metadatuak datu-basean idaztean</translation>
</message>
@@ -2159,12 +2351,12 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation type="unfinished"/>
</message>
@@ -2172,22 +2364,22 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>Ezin da %1 karpeta sortu</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>Errorea metadatuak datu-basean idaztean</translation>
</message>
@@ -2195,17 +2387,17 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation type="unfinished"/>
</message>
@@ -2213,13 +2405,13 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>Errorea metadatuak datu-basean idaztean</translation>
</message>
@@ -2227,12 +2419,7 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation type="unfinished"/>
</message>
@@ -2240,12 +2427,12 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>Errorea metadatuak datu-basean idaztean</translation>
</message>
@@ -2253,28 +2440,13 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Karpeta hau ezin da berrizendatu. Bere jatorrizko izenera berrizendatu da.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Karpeta hau ezin da berrizendatu. Mesedez jarri berriz Shared izena.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>Errorea metadatuak datu-basean idaztean</translation>
</message>
@@ -2282,33 +2454,33 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Fitxategia Ezabatua</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>Fitxategi lokala aldatu da sinkronizazioan.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>Errorea metadatuak datu-basean idaztean</translation>
</message>
@@ -2316,27 +2488,27 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>Fitxategi lokala ezabatu da sinkronizazioan.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>Fitxategi lokala aldatu da sinkronizazioan.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation type="unfinished"/>
</message>
@@ -2344,27 +2516,22 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>Fitxategi lokala ezabatu da sinkronizazioan.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>Fitxategi lokala aldatu da sinkronizazioan.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation type="unfinished"/>
</message>
@@ -2382,42 +2549,47 @@ Ez da gomendagarria erabltzea.</translation>
<translation>TestuEtiketa</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Ireki nabigatzailean</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Noiz</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Fitxategia</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Karpeta</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Ekintza</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Tamaina</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>Bertako sinkronizazio protokolo</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Kopiatu</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Kopiatu jarduera zerrenda arbelara.</translation>
</message>
@@ -2458,7 +2630,7 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Hautatu zer sinkronizatu</translation>
</message>
@@ -2466,33 +2638,33 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Kargatzen...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Izena</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Tamaina</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>Ez dago azpikarpetarik zerbitzarian.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation type="unfinished"/>
</message>
@@ -2502,7 +2674,7 @@ Ez da gomendagarria erabltzea.</translation>
<message>
<location filename="../src/gui/servernotificationhandler.cpp" line="103"/>
<source>Dismiss</source>
- <translation type="unfinished"/>
+ <translation>Baztertu</translation>
</message>
</context>
<context>
@@ -2513,22 +2685,22 @@ Ez da gomendagarria erabltzea.</translation>
<translation>Ezarpenak</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Jarduera</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Orokorra</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Sarea</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Kontua</translation>
</message>
@@ -2536,28 +2708,28 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Jarduera</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Orokorra</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Sarea</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Kontua</translation>
</message>
@@ -2585,42 +2757,42 @@ Ez da gomendagarria erabltzea.</translation>
<translation>ownCloud-en bidea:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Karpeta: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation type="unfinished"/>
</message>
@@ -2633,7 +2805,17 @@ Ez da gomendagarria erabltzea.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>TestuEtiketa</translation>
</message>
@@ -2663,19 +2845,24 @@ Ez da gomendagarria erabltzea.</translation>
<translation>Ezarri pasahitza</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation type="unfinished"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation>Jaitsi / Ikusi</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Baimendu editatzea</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation>Deskargatu / Ikusi / Kargatu</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2683,95 +2870,95 @@ Ez da gomendagarria erabltzea.</translation>
<translation>Esteka duen edonork atzitu dezake fitxategi/karpeta</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Ezabatu</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Bidali lotura posta bidez</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Ezeztatu</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Mesedez Ezarri Pasahitza</translation>
</message>
@@ -2794,32 +2981,32 @@ Ez da gomendagarria erabltzea.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Bidali lotura posta bidez</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
@@ -2832,37 +3019,38 @@ Ez da gomendagarria erabltzea.</translation>
<translation>Formularioa</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>TestuEtiketa</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>editatu dezake</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>partekatu dezake</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>sortu</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>aldatu</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>ezabatu</translation>
</message>
@@ -2906,142 +3094,175 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Ireki nabigatzailean</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;&gt;Ziurtagiriaren Zehaztapenak&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Izen Arrunta (IA):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Erakundea (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Erakunde Atala (OU):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Estatua/Erkidegoa:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>Herrialdea:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Jaulkitzailea:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Jaulkitze-data:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Iraungitze-data:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Hatz-markak&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Ziurtagiriaren informazioa:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation type="unfinished"/>
@@ -3128,305 +3349,270 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Arrakasta.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;csyncen %1 plugina ezin da kargatu.&lt;br/&gt;Mesedez egiaztatu instalazioa!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>CSync parametro larri errorea.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>CSync prozesatzearen eguneratu urratsak huts egin du.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>CSync prozesatzearen berdinkatze urratsak huts egin du.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSyncek ezin izan du proxya autentikatu.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSyncek huts egin du zerbitzaria edo proxia bilatzean.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSyncek huts egin du %1 zerbitzarian autentikatzean.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSyncek sarera konektatzean huts egin du.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>HTTP transmisio errore bat gertatu da.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>Errore bat egon da karpeta bat irekitzearkoan</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: Ez dago lekurik %1 zerbitzarian.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>CSyncen zehaztugabeko errorea.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Erabiltzaileak bertan behera utzita</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>Esteka sinbolikoak ezin dira sinkronizatu.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>Fitxategia baztertutakoen zerrendan dago.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>Ezin da sinkronizazio egunerokoa ireki</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>Fitxategi izenak behintzat baliogabeko karaktere bat du</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>Ezabatzeko baimenik gabe, berrezartzen</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>Mugitzea ez dago baimenduta, elementua berrezarri da</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>Mugitzea ez dago baimenduta %1 irakurtzeko bakarrik delako</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>helburua</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>jatorria</translation>
</message>
@@ -3450,17 +3636,17 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;%1 Bertsioa. Informazio gehiago eskuratzeko ikusi &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -3491,81 +3677,81 @@ Ez da gomendagarria erabltzea.</translation>
<translation>Mesedez saioa hasi</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Ez dago sinkronizazio karpetarik definituta.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Ireki nabigatzailean</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Saioa hasi...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Saioa bukatu</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Azkenengo Aldaketak</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Kudeatutako karpetak:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Ireki &apos;%1&apos; karpeta</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Ireki %1 arakatzailean</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Egoera ezezaguna</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Ezarpenak...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Xehetasunak...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Laguntza</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>%1etik Irten</translation>
</message>
@@ -3580,11 +3766,6 @@ Ez da gomendagarria erabltzea.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Deskonektatuta</translation>
@@ -3616,116 +3797,129 @@ Ez da gomendagarria erabltzea.</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Saioa bukatu kontu guztietan</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Saioa hasi kontu guztietan...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>%1 buruz</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Ez da azken aldian ezer sinkronizatu</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Sinkronizatzen %1 %2tik (%3 faltan)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Sinkronizatzen %1 (%2faltan)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>%1 Sinkronizatzen</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Eguneratua</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation type="unfinished"/>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3737,9 +3931,9 @@ Ez da gomendagarria erabltzea.</translation>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>TestuEtiketa</translation>
</message>
@@ -3775,11 +3969,22 @@ Ez da gomendagarria erabltzea.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Hautatu zer sinkronizatu</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>Karpeta &amp;lokala</translation>
@@ -3796,11 +4001,16 @@ Ez da gomendagarria erabltzea.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>&amp;Sinkronizatu zerbitzarian dagoen guztia</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Egoera mezua</translation>
</message>
@@ -3837,7 +4047,7 @@ Ez da gomendagarria erabltzea.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
+ <source>An error occurred while connecting. Please try again.</source>
<translation type="unfinished"/>
</message>
<message>
@@ -4017,7 +4227,7 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;Giteko &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt;. errebisiotik konpilatuta %3-an, %4etan Qt %5, %6 erabiliz&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4115,52 +4325,52 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Definitu gabeko egoera</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Itxoiten sinkronizazioaren hasiera</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>Sinkronizazioa martxan da</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Sinkronizazioa ongi burutu da</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Sinkronizazioa ongi burutu da, fitxategi batzuk baztertu dira.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Sinkronizazio Errorea</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Konfigurazio Errorea</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Sinkronizazioa prestatzen</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Bertan-behera uzten</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>Sinkronizazioa pausatuta dago</translation>
</message>
@@ -4168,22 +4378,22 @@ Ez da gomendagarria erabltzea.</translation>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation type="unfinished"/>
</message>
diff --git a/translations/client_fa.ts b/translations/client_fa.ts
index 8c9d53594..133736117 100644
--- a/translations/client_fa.ts
+++ b/translations/client_fa.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="fa" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,17 +95,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>زمان ارتباط تمام شد</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation>خطای ناشناخته: پاسخ شبکه پاک شد</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation>سرور &quot;1% 2%&quot; به &quot;3% 4%&quot; پاسخ داد</translation>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>منصرف شدن</translation>
</message>
@@ -166,184 +185,184 @@
<translation>حساب کاربری</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>انتخاب موارد همگام‌سازی</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>راه اندازی مجدد همگام سازی</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>حذف اتصال همگام سازی پوشه </translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>ساخت پوشه ناموفق</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;ناتوانی در ساخت پوشه محلی &lt;i&gt;1%&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>تأیید حذف اتصال همگام سازی پوشه</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>حذف اتصال همگام سازی پوشه</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>همگام سازی در حال اجراست</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>عملیات همگام سازی در حال اجراست.&lt;br/&gt;آیا دوست دارید آن را متوقف کنید؟</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>1% در استفاده</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>1% به عنوان &lt;i&gt;2%&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>نسخه سرور 1% قدیمی است و پشتیبانی نشده است! مسئولیت با خود شماست.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>متصل به %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>سرور %1 بصورت موقت خارج از دسترس است.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation>سرور 1% اکنون در حالت تعمیر است.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>از 1% خارج شد.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation>دریافت مجوز از مرورگر. &lt;a href=&apos;%1&apos;&gt;اینجا کلیک کنید&lt;/a&gt; تا مرورگر دوباره باز شود.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation>اتصال به %1...</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>اتصال به 1% در 2% وجود ندارد.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>ورود</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>پوشه‌هایی وجود دارند که همگام سازی نشده اند زیرا آن ها بسیار بزرگ هستند:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>پوشه‌هایی وجود دارند که همگام سازی نشده اند زیرا آن ها مخازن خارجی هستند:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation>پوشه‌هایی وجود دارند که همگام سازی نشده اند زیرا آن ها بسیار بزرگ یا مخازن خارجی هستند:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>تائید حذف حساب‌کاربری</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;آیا شما واقعا می خواهید اتصال به حساب &lt;i&gt;1%&lt;/i&gt;را حذف کنید؟&lt;/p&gt; &lt;p&gt;&lt;b&gt;توجه:&lt;/b&gt; این هیچ فایلی را حذف نخواهد کرد.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>حذف ارتباط</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>بازکردن پوشه</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>خروج</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>از سر‎گیری همگام‌سازی</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>توقف به‌هنگام‌سازی </translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;آیا شما واقعا می خواهید همگام سازی پوشه &lt;i&gt;1%&lt;/i&gt; را متوقف نمایید؟&lt;/p&gt;&lt;p&gt;&lt;b&gt;توجه:&lt;/b&gt;این هیچ فایلی را حذف &lt;b&gt;نخواهد&lt;/b&gt; کرد. &lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>1% (%3%) از 2% در استفاده. برخی پوشه‌ها، شامل شبکه نصب شده یا پوشه های مشترک، ممکن است محدودیت های متفاوت داشته باشند.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>1% از 2% در استفاده</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>در حال حاضر هیچ اطلاعات کاربرد ذخیره سازی در دسترس نیست.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>بدون %1 اتصال پیکربندی شده.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>خارج شد</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>قطع شده</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>متصل</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>سرویس خارج از دسترس</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation>حالت تعمیر</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>خطای شبکه</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>خطای پیکربندی</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation>درخواست مجوزها</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>وضعیت حساب ناشناخته</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>فعالیت سرور</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>پروتکل همگام سازی</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>همگام سازی نشده</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>همگام سازی نشده (1%)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>لیست فعالیت سرور در کلیپ بورد کپی شده است.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>لیست فعالیت همگام سازی در کلیپ بورد کپی شده است.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>لیست موارد همگام سازی نشده در کلیپ بورد کپی شده است.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>کپی به کلیپ بورد</translation>
</message>
@@ -469,47 +488,47 @@
<translation>برچسب متنی</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>فعالیت‌های سرور</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>کپی کردن</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>لیست فعالیت را در کلیپ بورد کپی کنید.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>عمل لازم: اطلاعیه ها</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;فعالیت های حساب 1% فعال نیست.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
- <translation><numerusform>شما n% هشدار جدید از 2% دریافت کردید.</numerusform></translation>
+ <translation><numerusform>شما n% هشدار جدید از 2% دریافت کردید.</numerusform><numerusform>شما n% هشدار جدید از 2% دریافت کردید.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
- <translation><numerusform>شما n% هشدار جدید از 1% و 2% دریافت کردید.</numerusform></translation>
+ <translation><numerusform>شما n% هشدار جدید از 1% و 2% دریافت کردید.</numerusform><numerusform>شما n% هشدار جدید از 1% و 2% دریافت کردید.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>شما هشدارهای جدیدی از 1%، 2% و سایر حساب ها دریافت کردید.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>1% هشدارها - عمل لازم</translation>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>خروج</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>ادامه</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation>خطای دسترسی به پرونده پیکربندی</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation>خطایی هنگام دسترسی به پرونده پیکربندی در 1% وحود دارد.</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>خروج از ownCloud</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>خطا در نوشتن متادیتا در پایگاه داده</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>هیچ حساب ownCloud پیکربندی نشده است</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>پیکربندی سرور برای این مشتری بسیار قدیمی است.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>لطفا به آخرین سرور به روز رسانی کنید و مشتری را مجددا راه اندازی نمایید.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>خطای تأیید: نام کاربری یا رمز عبور اشتباه است.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>وقفه</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>مدارک ارائه شده صحیح نیستند</translation>
</message>
@@ -637,133 +681,160 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>متوقف شده توسط کاربر</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>پوشه محلی %1 موجود نیست.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>1% باید یک پوشه باشد اما نیست.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 قابل خواندن نیست.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 حذف شده است.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 بارگزاری شد.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 بروز رسانی شده است.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 به %2 تغییر نام داده شده است.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 به %2 انتقال داده شده است.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
- <translation><numerusform>1% و n% پرونده های دیگر حذف شده اند.</numerusform></translation>
+ <translation><numerusform>1% و n% پرونده های دیگر حذف شده اند.</numerusform><numerusform>1% و n% پرونده های دیگر حذف شده اند.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
- <translation><numerusform>1% و n% پرونده های دیگر دانلود شده اند.</numerusform></translation>
+ <translation><numerusform>1% و n% پرونده های دیگر دانلود شده اند.</numerusform><numerusform>1% و n% پرونده های دیگر دانلود شده اند.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
- <translation><numerusform> 1% و n% پرونده های دیگر به روز رسانی شده اند.</numerusform></translation>
+ <translation><numerusform> 1% و n% پرونده های دیگر به روز رسانی شده اند.</numerusform><numerusform> 1% و n% پرونده های دیگر به روز رسانی شده اند.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
- <translation><numerusform>1% به 2% تغییر نام داده شده و n% پرونده های دیگر تغییر نام داده شده اند.</numerusform></translation>
+ <translation><numerusform>1% به 2% تغییر نام داده شده و n% پرونده های دیگر تغییر نام داده شده اند.</numerusform><numerusform>1% به 2% تغییر نام داده شده و n% پرونده های دیگر تغییر نام داده شده اند.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
- <translation><numerusform>1% به 2% منتقل شده و n% پرونده های دیگر منتقل شده اند.</numerusform></translation>
+ <translation><numerusform>1% به 2% منتقل شده و n% پرونده های دیگر منتقل شده اند.</numerusform><numerusform>1% به 2% منتقل شده و n% پرونده های دیگر منتقل شده اند.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
- <translation><numerusform>1% و n% سایر پرونده ها ناسازگاری همگام سازی دارند.</numerusform></translation>
+ <translation><numerusform>1% و n% سایر پرونده ها ناسازگاری همگام سازی دارند.</numerusform><numerusform>1% و n% سایر پرونده ها ناسازگاری همگام سازی دارند.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation>1% داراری ناسازگاری همگام سازی است. لطفا پرونده ناسازگار را بررسی نمایید.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
- <translation><numerusform>1% و n% سایر پرونده ها به دلیل خطاها نمی توانند همگام سازی شوند. برای جزییات log را مشاهده کنید.</numerusform></translation>
+ <translation><numerusform>1% و n% سایر پرونده ها به دلیل خطاها نمی توانند همگام سازی شوند. برای جزییات log را مشاهده کنید.</numerusform><numerusform>1% و n% سایر پرونده ها به دلیل خطاها نمی توانند همگام سازی شوند. برای جزییات log را مشاهده کنید.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>1% به دلیل خطاها نمی تواند همگام سازی شود. برای جزییات log را مشاهده کنید.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>فعالیت همگام سازی</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>نمی توان پرونده خارجی سیستم را خواند.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation>یک پوشه جدید بزرگتر از 1% MB اضافه شده است: 2%.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation>یک پوشه از یک مخزن خارجی اضافه شده است.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation>اگر می خواهید این را دانلود کنید لطفا به تنظیمات بروید تا آن را انتخاب کنید.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -774,7 +845,7 @@ If you decide to delete the files, they will be unavailable to you, unless you a
اگر شما تصمیم بگیرید پرونده ها را حذف کنید، آن ها در دسترس شما نخواهند بود، مگر اینکه مالک باشید.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
@@ -783,22 +854,22 @@ If this was an accident and you decide to keep your files, they will be re-synce
اگر این یک اتفاق بوده و شما تصمیم دارید پرونده هایتان را نگه دارید، آن ها از سرور مجددا همگام سازی خواهند شد.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>حذف تمام فایل ها؟</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>حذف تمام فایل ها</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>نگه داشتن فایل ها</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
@@ -807,17 +878,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
ادامه همگام سازی به طور معمول سبب خواهد شد که تمام پرونده های شما توسط یک فایل قدیمی تر در یک وضعیت جدیدتر بازنویسی شوند. آیا شما می خواهید پرونده های اخیر محلیتان را به عنوان پرونده های ناسازگار نگهداری کنید؟</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>پشتیبان شناسایی شد</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>همگام سازی معمول</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>پرونده های محلی را به عنوان ناسازگار نگه دارید</translation>
</message>
@@ -825,115 +896,105 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>نمی تواند حالت پوشه را تنظیم مجدد کند</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>یک مجله همگام قدیمی &apos;1%&apos; پیدا شد، اما حذف نمی شود. لطفا مطمئن شوید که هیچ برنامه ای در حال حاضر از آن استفاده نمی کند.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation> (backup)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation> (پشتیبان %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>موقعیت تعریف نشده</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>انتظار برای شروع همگام‌سازی</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>آماده سازی برای همگام سازی کردن.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>همگام سازی در حال اجراست</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>آخرین همگام سازی موفقیت آمیز بود</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>اخرین همگام سازی موفق بود، اما با هشدارهایی در پرونده های مجزا همراه بود.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>آخرین همگام سازی موفقیت آمیز بود</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>خطا در پیکر بندی.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>خارج کردن کاربر.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>همگام سازی فعلا متوقف شده است</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (همگام‌سازی موقتا متوقف شده است)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>هیچ پوشه‌ی معتبری انتخاب نشده است!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>مسیر انتخاب شده یک پوشه نیست!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>شما اجازه نوشتن در پوشه های انتخاب شده را ندارید!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation>پوشه محلی 1% شامل یک پیوند نمادین می باشد. پیوند مقصد در حال حاضر شامل پوشه ای همگام سازی شده است، لطفا یکی دیگر را انتخاب کنید!</translation>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation>در حال حاضر یک همگام سازی از سرور به این پوشه محلی وجود دارد. لطفا یک پوشه محلی دیگر را انتخاب کنید!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>پوشه محلی 1% از قبل شامل یک پوشه استفاده شده در یک اتصال همگام سازی پوشه است. لطفا یکی دیگر را انتخاب کنید!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>پوشه محلی 1% از قبل یک پوشه استفاده شده در یک اتصال همگام سازی پوشه دارد. لطفا یکی دیگر را انتخاب کنید!</translation>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation>پوشه محلی 1% شامل یک پیوند نمادین می باشد. پیوند مقصد در حال حاضر در یک پوشه استفاده شده در اتصال همگام پوشه موجود است. لطفا یکی دیگر را انتخاب کنید!</translation>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -943,7 +1004,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>افزودن اتصال همگام سازی پوشه</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>همگام‌سازی با پوشه محلی</translation>
</message>
@@ -978,7 +1039,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>خطای هنگام بارگذاری لیست پوشه‌ها از سرور.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>خارج شد</translation>
</message>
@@ -993,115 +1054,133 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>ناسازگاری های حل نشده ای وجود دارد. برای جزییات کلیک نمایید.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>بررسی تغییرات در &apos;1%&apos;</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation>تطبیق تغییرات</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>، &apos;1%&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>همگام‌سازی %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>رشته های ترجمه نشده</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>دانلود %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>آپلود %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 از %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>5% باقی ماند، 1% از 2%، پرونده 3% از 4%</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>1% از 2%، پرونده 3% از 4%</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>فایل %1 از %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>درحال انتظار...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
- <translation><numerusform>در انتظار برای %n پوشه‌‎ی دیگر ...</numerusform></translation>
+ <translation><numerusform>در انتظار برای %n پوشه‌‎ی دیگر ...</numerusform><numerusform>در انتظار برای %n پوشه‌‎ی دیگر ...</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>آماده‌سازی همگام‌سازی ...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>اضافه کردن اتصال همگام سازی پوشه</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>افزودن اتصال همگام سازی</translation>
</message>
@@ -1109,17 +1188,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>کلیک کنید تا یک پوشه را برای همگام سازی انتخاب نمایید.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>مسیر را به پوشه محلی وارد کنید.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>پوشه ی اصلی را انتخاب کنید</translation>
</message>
@@ -1127,60 +1206,68 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>ایجاد پوشه از راه دور</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>نام پوشه جدید را برای ایجاد شدن در زیر &apos;1%&apos; وارد نمایید:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>پوشه با موفقیت ایجاد شده است %1.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>تأیید اعتبار دسترسی به 1% شکست خورد</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>شکست در ساخت پوشه در 1%. لطفا به صورت دستی بررسی کنید.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>شکست در فهرست کردن یک پوشه. خطا: 1%</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>این را برای همگام سازی کل حساب انتخاب کنید</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>این پوشه همگام‌سازی شده است.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>شما از قبل &lt;i&gt;1%&lt;/i&gt; را همگام سازی کرده اید، که یک پوشه والد از &lt;i&gt;2%&lt;/i&gt; است.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;اخطار:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;اخطار:&lt;/b&gt;</translation>
</message>
@@ -1188,22 +1275,22 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>E-Tag از سرور دریافت نشده است، لطفا پروکسی/دروازه را بررسی نمایید</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>ما برای بازخوانی E-Tag متفاوتی دریافت کردیم. بار بعدی دوباره امتحان کنید.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>سرور محدوده محتوای اشتباهی برگرداند.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>تایم اوت اتصال</translation>
</message>
@@ -1226,23 +1313,38 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>پیشرفته</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation>درخواست تایید قبل از همگام سازی پوشه های بزرگتر</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation>درخواست تایید قبل از همگام سازی مخازن خارجی</translation>
</message>
@@ -1262,31 +1364,67 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>استفاده از آیکون های تک رنگ</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>ویرایش پرونده های رد شده</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>نمایش گزارشگر برخورد</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>درباره</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>به روز رسانی ها</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>راه اندازی مجدد و به روز رسانی</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>لغو</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1354,7 +1492,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>حذف</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1362,27 +1500,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
مواردی که در آن حذف کردن مجاز است، اگر از حذف یک پوشه جلوگیری کنند حذف خواهند شد. این برای فرا داده ها مفید است.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>امکان باز کردن فایل وجود ندارد</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>نمی‌توان تغییرات را در &apos;%1&apos; نوشت.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>افزودن الگوی رد کردن</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>افزودن یک الگوی رد کردن جدید:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>این ورودی توسط سیستم در &apos;1%&apos; ارائه شده است و در این دیدگاه قابل تغییر نیست.</translation>
</message>
@@ -1412,7 +1550,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>پوشه</translation>
</message>
@@ -1427,35 +1565,45 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation>نمایش پرونده های رد شده</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation>کپی کردن فهرست موضوعات در کلیپ بورد.</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>کپی کردن</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>زمان</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>فایل</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation>موضوع</translation>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1481,36 +1629,48 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>معلوم</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>صفحه نمایش log را پاک کنید.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>&amp;ذخیره سازی</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>پرونده log را برای رفع اشکال در یک پرونده از دیسک ذخیره کنید.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>ذخیره فایل لاگ</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>خطا</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>نمی توان در فایل لاگ 1% نوشت</translation>
</message>
@@ -1518,12 +1678,12 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>خطا</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;پرونده &apos;1%&apos; &lt;br/&gt; را نمی توان برای نوشتن باز کرد. &lt;br/&gt;&lt;br/&gt;خروجی log &lt;b&gt;نمی تواند&lt;/b&gt; ذخیره شود!&lt;/nobr&gt;</translation>
</message>
@@ -1531,27 +1691,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>نسخه جدید در دسترس است</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;یک نسخه جدید از مشتری 1% در دسترس است.&lt;/p&gt; &lt;p&gt;&lt;b&gt;2% &lt;/b&gt; برای دانلود در دسترس است. نسخه نصب شده 3% است. &lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>نادیده گرفتن این نسخه</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>نادیده گرفتن این زمان</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>به دست آوردن به روز رسانی</translation>
</message>
@@ -1639,27 +1799,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation>محدودسازی خودکار</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>نام میزبان سرور پروکسی</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>نام کاربری سرور پروکسی</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>رمزعبور برای سرور پروکسی</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>پروکسی HTTP(S)</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>پروکسی SOCKS5</translation>
</message>
@@ -1667,23 +1827,23 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>ایجاد شده در %1</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>بستن در چند ثانیه...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation>درخواست 1% در 2% شکست خورد</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation>&apos;1%&apos; در 2% انتخاب شد</translation>
@@ -1692,32 +1852,32 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation>خطای بازگشت از سرور: &lt;em&gt;1%&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation>خطایی در دسترسی به نقطه پایانی &apos;token&apos; وجود داشت: &lt;br&gt;&lt;em&gt;1%&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation>JSON بازگشتی از سرور قابل تجزیه نیست: &lt;br&gt;&lt;em&gt;1%&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation>پاسخ سرور شامل تمامی زمینه های مورد انتظار نبود</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation>&lt;h1&gt;خطای ورود&lt;/h1&gt;&lt;p&gt;1%&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation>&lt;h1&gt;کاربر نادرست&lt;/h1&gt;&lt;p&gt; شما با کاربر&lt;em&gt;1%&lt;/em&gt; وارد شدید، اما باید با کاربر &lt;em&gt;2%&lt;/em&gt; وارد می شدید. &lt;br&gt; لطفا در برگه دیگری از 3% خارج شده، سپس &lt;a href=&apos;%4&apos;&gt;اینجا را کلیک کنید&lt;/a&gt; و به عنوان کاربر 2% وارد شوید&lt;/p&gt;</translation>
</message>
@@ -1725,58 +1885,58 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>به روز رسانی جدید 1% آماده است</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>یک به روز رسانی جدید برای 1% در حال نصب است. به روز رسان ممکن است امتیازات اضافی در طول پردازش درخواست کند.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>دانلود نسخه 1%. لطفا منتظر بمانید...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>نمی توان به روز رسانی را دانلود کرد. لطفا &lt;a href=&apos;%1&apos;&gt;اینجا&lt;/a&gt; را بررس کنید تا به روز رسانی را به صورت دستی دانلود نمایید.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>نمی توان به روز رسانی های جدید را بررسی کرد.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>1% نسخه 2% موجود است. برنامه را مجددا راه اندازی کنید تا به روز رسانی شروع شود.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>1% جدید نسخه 2% موجود است. لطفا از ابزار به روز رسانی سیستم استفاده کنید تا آن را نصب نمایید.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>بررسی سرور به روز رسانی...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>وضعیت به روز رسانی نامشخص است: به روز رسانی های جدید را بررسی نکردید.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>به روز رسانی موجود نیست. نصب شما آخرین نسخه است.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>بررسی بروز‌ رسانی</translation>
</message>
@@ -1784,43 +1944,43 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>متصل به %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>راه اندازی گزینه های پوشه محلی</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>اتصال...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1 پوشه &apos;%2&apos; با پوشه محلی همگام شده است &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>همگام‌سازی پوشه‌ی &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;هشدار:&lt;/strong&gt; پوشه محلی خالی نیست. یک دقت انتخاب کنید!&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>پوشه همگام سازی محلی</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1879,15 +2039,20 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>متصل به %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation>در مرورگر خود وارد شوید</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation>لینک را در کلیپ بورد کپی کنید</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1918,153 +2083,163 @@ It is not advisable to use it.</source>
<source>&amp;Next &gt;</source>
<translation>&amp;بعدی&gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>آدرس نامعتبر</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt; با موفقیت متصل شده است به %1: %2 نسخه %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>ارتباط ناموفق با %1 در %2:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>هنگام تلاش برای اتصال به 1% در 2% زمان به پایان رسید.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>تلاش برای اتصال %1 به %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>درخواست تایید شده به سرور &apos;1%&apos; هدایت شد. آدرس بد است، سرور اشتباه پیکربندی شده است.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>یک پاسخ نادرست به درخواست webdov تایید شده وجود داشت</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>دسترسی توسط سرور ممنوع شد. برای تأیید اینکه شما دسترسی مناسب دارید، &lt;a href=&quot;%1&quot;&gt;اینجا را کلیک کنید &lt;/a&gt; تا با مرورگر خود به سرویس دسترسی پیدا کنید.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>آدرس نامعتبر</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation>سرور خطای زیر را گزارش کرد:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>پوشه همگام سازی محلی %1 در حال حاضر موجود است، تنظیم آن برای همگام سازی. &lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>ساخت پوشه همگام سازی محلی 1%...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>خوب</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>ناموفق.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>نمی تواند پوشه محلی ایجاد کند %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>هیچ پوشه از راه دوری مشخص نشده است!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>خطا: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>ایجاد کردن پوشه بر روی ownCloud: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>پوشه از راه دور %1 با موفقیت ایجاد شده است.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>در حال حاضر پوشه از راه دور %1 موجود است. برای همگام سازی به آن متصل شوید.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>ایجاد پوشه به خطای HTTP کد 1% منجر شد</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>ایجاد پوشه از راه دور ناموفق بود به علت اینکه اعتبارهای ارائه شده اشتباه هستند!&lt;br/&gt;لطفا اعتبارهای خودتان را بررسی کنید.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt; ایجاد پوشه از راه دور ناموفق بود، شاید به علت اعتبارهایی که ارئه شده اند، اشتباه هستند.&lt;/font&gt;&lt;br/&gt; لطفا باز گردید و اعتبار خود را بررسی کنید.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>ایجاد پوشه از راه دور %1 ناموفق بود با خطا &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>یک اتصال همگام سازی از %1 تا %2 پوشه از راه دور راه اندازی شد.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>با موفقیت به %1 اتصال یافت!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>اتصال به %1 نمی تواند مقرر باشد. لطفا دوباره بررسی کنید.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>تغییر نام پوشه ناموفق بود</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>نمی توانید پوشه را حذف کنید یا پشتیبان بگیرید زیرا پوشه یا یک پرونده در آن در برنامه دیگری باز است. لطفا پوشه یا پرونده را ببندید و مجددا تلاش کنید یا تنظیم را لغو کنید.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt; پوشه همگام سازی محلی %1 با موفقیت ساخته شده است!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2072,14 +2247,31 @@ It is not advisable to use it.</source>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>از پیکربندی پوشه‌ها بگذرید</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2103,7 +2295,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>پاسخ JSON نامعتبر از آدرس نظرسنجی</translation>
</message>
@@ -2111,7 +2303,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>خطا در نوشتن متادیتا در پایگاه داده</translation>
</message>
@@ -2119,47 +2311,47 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>پرونده 1% بخاطر یک پرونده محلی به نام برخورد دانلود نمی شود!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation>دانلود فضای دیسک محلی آزاد تحت محدودیت را کاهش می دهد</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>فضای خالی دیسک کمتر از %1 است</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>فایل از روی سرور حذف شد</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>فایل به طور کامل قابل دانلود نیست.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation>پرونده دانلود شده خالی است با وجود اینکه سرور اعلام کرده است این باید 1% باشد.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>پرونده 1% بخاطر یک پرونده محلی به نام برخورد ذخیره نمی شود!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>پرونده از زمان کشف تغییر کرده است.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>خطا در نوشتن متادیتا در پایگاه داده</translation>
</message>
@@ -2167,12 +2359,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>؛ بازگردانی شکست خورد: 1%</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation>یک پرونده یا پوشه از یک اشتراک فقط خواندنی حذف شد، اما بازگردانی شکست خورد: 1%</translation>
</message>
@@ -2180,22 +2372,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>نمی توان پرونده 1% را حذف کرد: خطای 2%</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>امکان ایجاد پوشه %1 وجود ندارد</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>خطا در نوشتن متادیتا در پایگاه داده</translation>
</message>
@@ -2203,17 +2395,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>خطا در حذف &apos;%1&apos;: %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>پوشه &apos;1%&apos; حذف نمی شود</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>1% بخاطر یک پرونده محلی به نام برخورد حذف نمی شود</translation>
</message>
@@ -2221,13 +2413,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>پرونده 1% بخاطر یک پرونده محلی به نام برخورد نتغییر نام داده نمی شود</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>خطا در نوشتن متادیتا در پایگاه داده</translation>
</message>
@@ -2235,12 +2427,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>پرونده از یک استراک فقط خواندنی حذف شد. این بازگردانی شد.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>کد HTTP اشتباه توسط سرور برگردانده شد. 204 انتظار می رفت، اما &quot;1% 2%&quot; دریافت شد.</translation>
</message>
@@ -2248,12 +2435,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>کد HTTP اشتباه توسط سرور برگردانده شد. 201 انتظار می رفت، اما &quot;1% 2%&quot; دریافت شد.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>خطا در نوشتن متادیتا در پایگاه داده</translation>
</message>
@@ -2261,28 +2448,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>این پوشه نباید تغییر نام داده شود. نام آن به نام اصلی خود تغییر داده شده است.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>این پوشه نباید تغییر نام داده شود. لطفا نام آن را اشتراک برگردانید.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>این پرونده تغییر نام داده شده است اما بخشی از یک اشتراک فقط خواندنی است. پرونده اصلی برگردانده شده است.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>کد HTTP اشتباه توسط سرور برگردانده شد. 201 انتظار می رفت، اما &quot;1% 2%&quot; دریافت شد.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>خطا در نوشتن متادیتا در پایگاه داده</translation>
</message>
@@ -2290,33 +2462,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation>پرونده 1% بارگذاری نمی شود زیرا پرونده دیگری با نام مشابه، که تنها در وضعیت متفاوت است، وجود دارد</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>فایل حذف شد</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>پرونده محلی در طول همگام سازی تغییر کرد. این ادامه خواهد یافت.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>فایل محلی در حین همگام‌سازی تغییر کرده است.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation>بارگذاری از 1% بیش از سهمیه برای پوشه است</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>خطا در نوشتن متادیتا در پایگاه داده</translation>
</message>
@@ -2324,27 +2496,27 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>فایل محلی در حین همگام‌سازی حذف شده است.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>فایل محلی در حین همگام‌سازی تغییر کرده است.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation>کد بازگشت غیر منتظره از سرور (1%)</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation>فاقد شناسه پرونده از سرور</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation>فاقد ETag از سرور</translation>
</message>
@@ -2352,27 +2524,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>پرونده به طور محلی ویرایش شده اما بخشی از یک اشتراک فقط خواندنی است. این بازسازی شده و ویرایش شما در پرونده ناسازگاری است.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>فاقد آدرس نظرسنجی</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>فایل محلی در حین همگام‌سازی حذف شده است.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>فایل محلی در حین همگام‌سازی تغییر کرده است.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation>سرور آخرین تکه را تایید نکرد. (برچسب الکترونیکی وجود نداشت)</translation>
</message>
@@ -2390,42 +2557,47 @@ It is not advisable to use it.</source>
<translation>برچسب متنی</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>باز کردن در مرورگر</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>زمان</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>فایل</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>پوشه</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>فعالیت</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>اندازه</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>پروتکل همگام سازی محلی</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>کپی کردن</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>فهرست فعالیت را در کلیپ بورد کپی کنید.</translation>
</message>
@@ -2466,7 +2638,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>انتخاب موارد همگام‌سازی</translation>
</message>
@@ -2474,33 +2646,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>درحال بارگذاری...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation>پوشه‌های از راه دور را که نمی خواهید همگام سازی کنید، انتخاب نکنید.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>نام</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>اندازه</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>هیچ زیر پوشه ای در حال حاضر در سرور وجود ندارد.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation>هنگام بارگذاری فهرست زیر پوشه ها خطایی روی داد.</translation>
</message>
@@ -2521,22 +2693,22 @@ It is not advisable to use it.</source>
<translation>تنظیمات</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>فعالیت</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>عمومی</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>شبکه</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>حساب کاربری</translation>
</message>
@@ -2544,28 +2716,28 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>فعالیت</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>عمومی</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>شبکه</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>حساب کاربری</translation>
</message>
@@ -2593,42 +2765,42 @@ It is not advisable to use it.</source>
<translation>مسیر ownCloud:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>%1 اشتراک‌گذاری</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>پوشه: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>سرور اجازه به اشتراک گذاشتن نمی دهد</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation>گرفتن مجوز بیشترین اشتراک ممکن از سرور...</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>پرونده نمی تواند به اشتراک گذاشته شود زیرا بدون مجوز به اشتراک گذاشته شده است.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>کاربران و گروه ها</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>پیوندهای عمومی</translation>
</message>
@@ -2641,7 +2813,17 @@ It is not advisable to use it.</source>
<translation>اشتراک NewDocument.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation>فقط بارگذاری (حذف پرونده)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation>پرونده ها را بدون آشکار شدن محتوای پوشه از سایرین دریافت کنید.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>برچسب متنی</translation>
</message>
@@ -2671,19 +2853,24 @@ It is not advisable to use it.</source>
<translation>تعیین رمزعبور</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
- <translation>خواص پیوند:</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>نمایش فهرست نویسی پرونده</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>اجازه‌ی ویرایش</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2691,95 +2878,95 @@ It is not advisable to use it.</source>
<translation>هر کسی با پیوند به پرونده/پوشه دسترسی دارد</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>رمز عبور محافظت می شود</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>محافظت شده توسط رمزعبور</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>پرونده نمی تواند به اشتراک گذاشته شود زیرا بدون مجوز به اشتراک گذاشته شده است.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation>اشتراک های پیوند غیر فعال شده اند</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation>اشتراک لینک عمومی بسازید</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>حذف</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation>لینک را در مرورگر باز کنید</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation>لینک را در کلیپ بورد کپی کنید</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation>لینک را در کلیپ بورد کپی کنید (دانلود مستقیم)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>لینک را توسط ایمیل بفرست.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation>لینک را با پست الکترونیکی ارسال کنید (دانلود مستقیم)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation>حذف اشتراک گذاری لینک را تایید کنید</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation>&lt;p&gt;آیا شما واقعا می خواهید اشتراک لینک عمومی را حذف کنید&lt;i&gt;1%&lt;/i&gt;؟&lt;/p&gt;&lt;p&gt; توجه: این عمل نمی تواند انجام نشود.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>لغو</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation>پیوند عمومی</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation>حذف پیوند اشتراک</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>اشتراک عمومی نیازمند رمز عبور است</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>لطفا رمزعبور را تعیین کنید</translation>
</message>
@@ -2802,32 +2989,32 @@ It is not advisable to use it.</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;شما می تونید مردم را &lt;a href=&quot;private link menu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt; با دادن لینک خصوصی به آن ها&lt;/span&gt;&lt;/a&gt; به این پرونده یا پوشه مشترک هدایت کنید. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation>این مورد با هیچ کاربر یا گروهی به اشتراک گذاشته نشده است</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation>لینک را در مرورگر باز کنید</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation>لینک را در کلیپ بورد کپی کنید</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>لینک را توسط ایمیل بفرست.</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>هیچ نتیجه ای برای &apos;1%&apos; وجود ندارد</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation>من چیزی را با شما به اشتراک گذاشتم</translation>
</message>
@@ -2840,37 +3027,38 @@ It is not advisable to use it.</source>
<translation>فرم</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>برچسب متنی</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>می توان ویرایش کرد</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>قابل به اشتراک گذاری</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>ایجاد</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>تغییر</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>حذف</translation>
</message>
@@ -2914,142 +3102,175 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>اشتراک‌گذاری با %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation>من چیزی را با شما به اشتراک گذاشتم</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation>اشتراک گذاری...</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation>لینک خصوصی را در کلیپ بورد کپی کنید</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation>لینک خصوصی را پست الکترونیکی ارسال کنید...</translation>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>باز کردن در مرورگر</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;جزئیات گواهینامه s&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>نام مشترک (CN):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>نام های جایگزین موضوع:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>سازمان (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>واحد سازمان (OU):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>استان:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>کشور:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>سریال:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;صادر کننده&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>صادرکننده:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>صدور در:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>منقضی شده در:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;اثر انگشت&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;توجه: &lt;/b&gt;این گواهی‌نامه به طور دستی تایید شده است&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (self-signed)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>این اتصال با استفاده از 1% بیت 2% رمزگذاری شده است.</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation>پشتیبانی برای جلسه SSL برچسب ها/شناسه ها وجود ندارد</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>اطلاعات گواهینامه:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>این اتصال امن نیست زیرا رمزگذاری نشده است.
@@ -3137,305 +3358,270 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>موفقیت</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>CSync در بارگذاری پرونده مجله شکست خورد. پرونده مجله از بین رفته است.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;ماژول %1 برای csync نمی تواند بارگذاری شود.&lt;br/&gt;لطفا نصب را بررسی کنید!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>خطای پارامتری وخیم CSync.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>مرحله به روز روسانی پردازش CSync ناموفق بود.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>مرحله تطبیق پردازش CSync ناموفق بود.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync نمی تواند پروکسی را تصدیق کند.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>عدم موفقیت CSync برای مراجعه به پروکسی یا سرور.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>عدم موفقیت CSync برای اعتبار دادن در %1 سرور.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>عدم موفقیت CSync برای اتصال به شبکه.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>وقفه اتصال شبکه روی داده است.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>خطا در انتقال HTTP اتفاق افتاده است.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation>پوشه نصب شده به طور موقت در سرور موجود نیست</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>یک خطا در هنگام باز کردن یک پوشه رخ داده‌ است</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>خطا در هنگام خواندن پوشه</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation>1% (به علت خطای قبلی از بین رفته است، دوباره در 2% امتحان کنید)</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>پرونده/پوشه رد شد زیرا مخفی است.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation>سلسله مراتب پوشه خیلی عمیق است</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation>ناسازگاری: نسخه سرور دانلود شد، کپی محلی تغییر نام داده شده و بارگذاری نشده است.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation>تنها 1% موجود است، حداقل 2% برای شروع مورد نیاز است</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation>پایگاه داده محلی باز یا ساخته نمی شود. اطمینان حاصل کنید که دسترسی به نوشتن در پوشه همگام سازی دارید.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation>مجاز نیستید زیرا شما اجازه افزودن به پوشه والد را ندارید</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation>مجاز نیستید زیرا شما اجازه افزودن پرونده به آن پوشه را ندارید</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation>فضای دیسک کم است: دانلودهایی که فضای آزاد را به کمتر از 1% کاهش می دهند رد می شوند.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation>برای بعضی از بارگذاری ها در سرور فضای کافی موجود نیست.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: فضا در %1 سرور در دسترس نیست.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>خطای نامشخص CSync </translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>متوقف شده توسط کاربر</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>CSync برای دسترسی شکست خورد</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
- <translation>CSync در بارگذاری یا ساخت پرونده مجله شکست خورد. اطمینان حااصل کنید که شما اجازه خواندن و نوشتن در پوشه همگام سازی محلی را دارید.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
- <translation>CSync به علت رد شدن مجوز نادرست شکست خورد.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
- <translation>CSync سعی کرد پوشه ای بسازد که از قبل موجود بود.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>سرویس بصورت موقت خارج از دسترس است</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>دسترسی ممنوع است</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>یک خطای داخلی با شماره خطای %1 رخ داده است.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>پیوندهای نمادین در همگام سازی پشتیبانی نمی شوند.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>پرونده در فهرست رد شده ها موجود است.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation>نام پرونده هایی که با دوره ای پایان می یابند در این سیستم پرونده پشتیبانی نشده اند.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation>نام پرونده هایی که شامل کاراکتر &apos;1%&apos; هستند در این سیستم پرونده پشتیبانی نشده اند.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation>نام پرونده یک نام رزرو شده در این سیستم پرونده است.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation>نام پرونده شامل دنباله فضای خالی است.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>نام فایل خیلی طولانی است.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation>نام پرونده در سیستم پرونده شما رمزگذاری نمی شود.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation>ناسازگاری حل نشده.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>وضعیت ناموفق</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>رمزگذاری نام فایل معتبر نیست</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>کاراکتر نامعتبر، لطفا &quot;%1&quot; را تغییر نام دهید</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation>نمی توان لیست سیاه را از پایگاه داده محلی خواند</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation>نمی توان از مجله همگام ساز خواند.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>نمی توان مجله همگام ساز را باز کرد</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>نام فایل دارای حداقل یک کاراکتر نامعتبر است</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>به علت لیست سیاه &quot;انتخاب کنید چه چیزی همگام سازی شود&quot; رد شد</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation>با توجه به عدم اجازه‌ی شما به ایجاد زیرپوشه به پوشه مجاز نیست</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>آپلود این فایل با توجه به فقط-خواندنی بودن آن در سرور مجاز نیست، در حال بازگرداندن</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>حذف مجاز نیست، در حال بازگردادن</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>فایل‌های محلی و پوشه‌ی اشتراک حذف شد.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>انتقال مجاز نیست، مورد بازگردانده شد</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>انتقال مجاز نیست زیرا 1% فقط خواندنی است</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>مقصد</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>مبدا</translation>
</message>
@@ -3459,17 +3645,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;نسخه %1. برای اطلاعات بیشتر لطفا اینجا را مشاهده کنید t &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt; توسط 1% توزیع شده و تحت مجوز GNU مجوز عمومی سراسری (GPL) نسخه 2.0 است. &lt;br/&gt; 2% و لوگوی 2% علائم تجاری 1% در ایالات متحده، سایر کشورها، یا هر دو را ثبت نام کرده اند. &lt;/p&gt;</translation>
</message>
@@ -3500,81 +3686,81 @@ It is not advisable to use it.</source>
<translation>لطفا وارد شوید</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>پوشه %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>هیچ پوشه‌ای برای همگام‌سازی تنظیم نشده است.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>باز کردن در مرورگر</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>ورود...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>خروج</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>تغییرات اخیر</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>بررسی تغییرات در &apos;1%&apos;</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>پوشه های مدیریت شده:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>بازکردن پوشه‌ی &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>1% را در مرورگر باز کنید</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>وضعیت نامعلوم</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>تنظیمات...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>جزئیات...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>راه‌نما</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>خروج %1</translation>
</message>
@@ -3589,11 +3775,6 @@ It is not advisable to use it.</source>
<translation>نسخه سرور پشتیبانی نشده </translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation>سرور روی حساب 1% یک نسخه قدیمی و پشتیبانی نشده 2% را اجرا کرده است. استفاده از این مشتری با نسخه های سرور پشتیبانی نشده بررسی نشده و خطرناک است. مسئولیت با خود شماست.</translation>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>قطع شده</translation>
@@ -3625,116 +3806,129 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation>همگام سازی متوقف شده است</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation>خطا حین همگام سازی</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation>هیچ پوشه‌ همگام سازی پیکربندی شده</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation>شروع مجدد تمام پوشه‌ها</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>توقف تمام پوشه‌ها</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>شروع مجدد تمام همگام سازی ها</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>شروع مجدد همگام سازی</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>توقف تمام همگام سازی ها</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>توقف همگام سازی</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>خروج از تمام حساب ها</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>ورود به تمام حساب ها...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>حساب جدید...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>درباره %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>هیچ موردی به تازگی همگام‌سازی نشده است</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>همگام‌سازی %1 از%2 (%3 باقیمانده)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation>همگام سازی 1% از 2%</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>همگام‌سازی %1 (%2 باقیمانده)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>همگام‌سازی %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>تا تاریخ</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation>&lt;p&gt;نسخه 2%. برای اطلاعات بیشتر https://%4 را مشاهده کنید.&lt;/p&gt; &lt;p&gt;برای موضوعات آشنا و کمک، لطفا &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt; را مشاهده کنید.&lt;/p&gt;&lt;p&gt;&lt;small&gt;توسط Klaas Freitag و Daniel Molkentin و Olivier Goffart و Markus Götz و Jan-Christoph Borchardt و دیگران. &lt;/small&gt;&lt;/p&gt;&lt;p&gt; Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;تحت مجوز GNU مجوز عمومی سراسری (GPL) نسخه 2.0 &lt;br/&gt; ownCloud و لوگوی ownCloud علائم تجاری ownCloud GmbH در ایالت متحده، سایر کشورها، یا هر دو را ثبت کرده اند. &lt;/p&gt;</translation>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3746,9 +3940,9 @@ It is not advisable to use it.</source>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>برچسب متنی</translation>
</message>
@@ -3784,11 +3978,22 @@ It is not advisable to use it.</source>
<translation>درخواست تایید پیش از همگام سازی مخازن خارجی</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>انتخاب موارد همگام‌سازی</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>&amp;پوشه محلی</translation>
@@ -3805,11 +4010,16 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>همگام سازی همه چیز از سرور</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>پیغام وضعیت</translation>
</message>
@@ -3846,8 +4056,8 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
- <translation>هنگام اتصال خطایی روی داد. لطفا دوباره امتحان کنید.</translation>
+ <source>An error occurred while connecting. Please try again.</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="56"/>
@@ -3918,12 +4128,12 @@ It is not advisable to use it.</source>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="438"/>
<source>%n day(s) ago</source>
- <translation><numerusform>n% روز پیش</numerusform></translation>
+ <translation><numerusform>n% روز پیش</numerusform><numerusform>n% روز پیش</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="446"/>
<source>%n hour(s) ago</source>
- <translation><numerusform>n% ساعت پیش</numerusform></translation>
+ <translation><numerusform>n% ساعت پیش</numerusform><numerusform>n% ساعت پیش</numerusform></translation>
</message>
<message>
<location filename="../src/common/utility.cpp" line="451"/>
@@ -3938,7 +4148,7 @@ It is not advisable to use it.</source>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="456"/>
<source>%n minute(s) ago</source>
- <translation><numerusform>n% دقیقه پیش</numerusform></translation>
+ <translation><numerusform>n% دقیقه پیش</numerusform><numerusform>n% دقیقه پیش</numerusform></translation>
</message>
<message>
<location filename="../src/common/utility.cpp" line="459"/>
@@ -3977,32 +4187,32 @@ It is not advisable to use it.</source>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="310"/>
<source>%n year(s)</source>
- <translation><numerusform>n% سال</numerusform></translation>
+ <translation><numerusform>n% سال</numerusform><numerusform>n% سال</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="311"/>
<source>%n month(s)</source>
- <translation><numerusform>n% ماه</numerusform></translation>
+ <translation><numerusform>n% ماه</numerusform><numerusform>n% ماه</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="312"/>
<source>%n day(s)</source>
- <translation><numerusform>n% روز</numerusform></translation>
+ <translation><numerusform>n% روز</numerusform><numerusform>n% روز</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="313"/>
<source>%n hour(s)</source>
- <translation><numerusform>n% ساعت</numerusform></translation>
+ <translation><numerusform>n% ساعت</numerusform><numerusform>n% ساعت</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="314"/>
<source>%n minute(s)</source>
- <translation><numerusform>n% دقیقه</numerusform></translation>
+ <translation><numerusform>n% دقیقه</numerusform><numerusform>n% دقیقه</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="315"/>
<source>%n second(s)</source>
- <translation><numerusform>n% ثانیه</numerusform></translation>
+ <translation><numerusform>n% ثانیه</numerusform><numerusform>n% ثانیه</numerusform></translation>
</message>
<message>
<location filename="../src/common/utility.cpp" line="339"/>
@@ -4026,7 +4236,7 @@ It is not advisable to use it.</source>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;ساخته شده از اصلاح &lt;a href=&quot;%1&quot;&gt;2%&lt;/a&gt; Git روی 3%، 4% با استفاده از Qt 5%، 6% &lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4124,52 +4334,52 @@ It is not advisable to use it.</source>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>وضعیت نامشخص است</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>در حال انتظار برای شروع همگام‌سازی</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>همگام سازی در حال اجراست</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>همگام‌سازی با موفقیت انجام شد</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>همگام‌سازی موفق، تعداد از فایل‌ها نادیده گرفته شده‌اند.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>خطای همگام‌سازی</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>خطای نصب</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>آماده‌سازی همگام‌سازی</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>همگام‌سازیی فعلا متوقف شده است</translation>
</message>
@@ -4177,22 +4387,22 @@ It is not advisable to use it.</source>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation>مرورگر باز نمی شود</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation>در راه اندازی مرورگر برای رفتن به آدرس 1% خطایی وجود دارد. شاید مرورگر پیش فرض پیکربندی نشده است؟</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation>پست الکترونیکی مشتری باز نمی شود</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation>در راه اندازی پست الکترونیکی مشتری برای ساخت یک پیام جدید خطایی وجود دارد. شاید پست الکترونیکی مشتری پیش فرض پیکربندی نشده است؟</translation>
</message>
diff --git a/translations/client_fi.ts b/translations/client_fi.ts
index e05f18be5..02914ce0b 100644
--- a/translations/client_fi.ts
+++ b/translations/client_fi.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="fi_FI" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation>Ei voitu luoda kansioita roskakoriin</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation>Ei voitu siirtää &apos;%1&apos; kohteeseen &apos;%2&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,17 +95,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Yhteys aikakatkaistiin</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
- <translation type="unfinished"/>
+ <translation>Tuntematon virhe: verkkovastaus poistettiin</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation type="unfinished"/>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Peruuta</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Tili</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Valitse synkronoitavat tiedot</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Pakota synkronointi nyt</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>Käynnistä synkronointi uudelleen</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>Poista kansion synkronointiyhteys</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Kansion luominen epäonnistui</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;Paikallisen kansion &lt;i&gt;%1&lt;/i&gt; luominen epäonnistui.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>Vahvista kansion synkronointiyhteyden poisto</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>Poista kansion synkronointiyhteys</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Synkronointi meneillään</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>Synkronointioperaatio on meneillään.&lt;br/&gt;Haluatko keskeyttää sen?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 käytössä</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 käyttäjänä &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>Palvelimen versio %1 on vanha ja sen tuki on loppunut! Jatka omalla vastuulla.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Yhteys muodostettu kohteeseen %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>Palvelin %1 ei ole juuri nyt saatavilla.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
- <translation type="unfinished"/>
+ <translation>Palvelin %1 on juuri nyt huoltotilassa.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>Kirjauduttu ulos kohteesta %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>Ei yhteyttä kohteeseen %1 osoitteessa %2.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Kirjaudu sisään</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Vahvista tilin poistaminen</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Haluatko varmasti poistaa tilin &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Huomio:&lt;/b&gt; Tämä toimenpide &lt;b&gt;ei&lt;/b&gt; poista mitään tiedostoja.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Poista yhteys</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Avaa kansio</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Kirjaudu ulos</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Palauta synkronointi</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Keskeytä synkronointi</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Haluatko varmasti lopettaa kansion &lt;i&gt;%1&lt;/i&gt; synkronoinnin?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Huomio:&lt;/b&gt; Tämä toimenpide &lt;b&gt;ei&lt;/b&gt; poista mitään tiedostoja.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1/%2 (%3 %) käytössä. Jotkin kansiot, mukaan lukien verkkojaot ja jaetut kansiot, voivat sisältää eri rajoitukset.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%1/%2 käytössä</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Tallennustilan käyttötietoja ei ole juuri nyt saatavilla.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>%1-yhteyttä ei ole määritelty.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Kirjauduttu ulos</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Yhteys katkaistu</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Yhdistetty</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Palvelu ei ole käytettävissä</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
- <translation type="unfinished"/>
+ <translation>Huoltotila</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Verkkovirhe</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Asetusvirhe</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Tuntematon tilin tila</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Palvelimen toimet</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Synkronointiprotokolla</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>Ei synkronoitu</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>Ei synkronoitu (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Kopioitu leikepöydälle</translation>
</message>
@@ -469,47 +488,47 @@
<translation>TekstiLeima</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Palvelimen toimet</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Kopioi</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Kopioi toimilista leikepöydälle.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Toimenpiteitä vaaditaan: ilmoitukset</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;Tilillä %1 ei ole toimia käytössä.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation type="unfinished"/>
</message>
@@ -555,19 +574,44 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Lopeta</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Jatka</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
- <translation type="unfinished"/>
+ <translation>Lopeta ownCloud</translation>
</message>
</context>
<context>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>Virhe kirjoittaessa metadataa tietokantaan</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>ownCloud-tiliä ei ole määritelty</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>Määritelty palvelin on ohjelmistoversioltaan liian vanha tälle asiakasohjelmistolle</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Päivitä uusimpaan palvelinversioon ja käynnistä asiakasohjelmisto uudelleen.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Tunnistautumisvirhe: käyttäjätunnus tai salasana on väärin.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>aikakatkaisu</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>Annetut tilitiedot eivät ole oikein</translation>
</message>
@@ -637,131 +681,160 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Keskeytetty käyttäjän toimesta</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>Paikallista kansiota %1 ei ole olemassa.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>Kohteen %1 pitäisi olla kansio, mutta se ei kuitenkaan ole kansio.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 ei ole luettavissa.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 on poistettu.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 on ladattu.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 on päivitetty.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 on nimetty uudeelleen muotoon %2.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 on siirretty kohteeseen %2.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>Kohdetta %1 ei voi synkronoida virheen vuoksi. Katso tarkemmat tiedot lokista.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Synkronointiaktiviteetti</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
- <translation type="unfinished"/>
+ <translation>Uusi kansio, joka on suurempi kuin %1 Mt, on lisätty: %2.
+</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
- <translation type="unfinished"/>
+ <translation>Kansio erillisestä tallennustilasta on lisätty.
+</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -769,46 +842,46 @@ If you decide to delete the files, they will be unavailable to you, unless you a
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Poistetaanko kaikki tiedostot?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Poista kaikki tiedostot</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Säilytä tiedostot</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>Varmuuskopio poistettu</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>Normaali synkronointi</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation type="unfinished"/>
</message>
@@ -816,115 +889,105 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>Kansion tilaa ei voitu alustaa</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation> (varmuuskopio)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation> (varmuuskopio %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Määrittelemätön tila.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>Odotetaan synkronoinnin aloitusta.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Valmistellaan synkronointia.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>Synkronointi on meneillään.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>Viimeisin synkronointi suoritettiin onnistuneesti.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>Viimeisin synkronointi onnistui, mutta yksittäisten tiedostojen kanssa ilmeni varoituksia.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>Viimeisin synkronointi suoritettiin onnistuneesti.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Asetusvirhe.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>Synkronointi on keskeytetty.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Synkronointi on keskeytetty)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>Kelvollista kansiota ei ole valittu!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>Valittu polku ei ole kansio!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Sinulla ei ole kirjoitusoikeutta valittuun kansioon!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Paikallinen kansio %1 sisältää kansion, jota käytetään kansion synkronointiyhteydessä. Valitse toinen kansio!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -934,7 +997,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Lisää kansion synkronointiyhteys</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>Synkronoidaan paikallisen kansion kanssa</translation>
</message>
@@ -969,7 +1032,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Virhe ladatessa kansiolistausta palvelimelta.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Kirjauduttu ulos</translation>
</message>
@@ -981,118 +1044,136 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<message>
<location filename="../src/gui/folderstatusmodel.cpp" line="209"/>
<source>There are unresolved conflicts. Click for details.</source>
+ <translation>Selvittämättömiä ristiriitoja. Napsauta saadaksesi lisätietoja.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>Synkronoidaan %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3/%4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%5 jäljellä, %1/%2, tiedosto %3/%4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1/%2, tiedosto %3/%4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>tiedosto %1/%2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>Odotetaan...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>Odotetaan %n muuta kansiota...</numerusform><numerusform>Odotetaan %n muuta kansiota...</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>Valmistaudutaan synkronointiin...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>Lisää kansion synkronointiyhteys</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>Lisää synkronointiyhteys</translation>
</message>
@@ -1100,17 +1181,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Napsauta valitaksesi synkronoitavan paikalliskansion.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Anna paikallisen kansion polku</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Valitse lähdekansio</translation>
</message>
@@ -1118,60 +1199,68 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Luo etäkansio</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>Kansion listaaminen epäonnistui. Virhe: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Valitse tämä synkronoidaksesi koko tilin</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Tätä kansiota synkronoidaan jo.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Synkronoit jo kansiota &lt;i&gt;%1&lt;/i&gt;, ja se on kansion &lt;i&gt;%2&lt;/i&gt; yläkansio.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Varoitus:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Varoitus:&lt;/b&gt;</translation>
</message>
@@ -1179,22 +1268,22 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Yhteys aikakatkaistiin</translation>
</message>
@@ -1217,23 +1306,38 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Ilmoitusalueelle</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Lisäasetukset</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>Mt</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation type="unfinished"/>
</message>
@@ -1253,31 +1357,67 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Käytä &amp;mustavalkoisia kuvakkeita</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>Muokkaa &amp;ohitettavia tiedostoja</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>N&amp;äytä kaatumisraportoija</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>Tietoja</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>Päivitykset</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>&amp;Käynnistä uudelleen &amp;&amp; päivitä</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Peruuta</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1345,7 +1485,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Poista</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1354,27 +1494,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
Kohteet, joiden poisto on sallittu, poistetaan, jos ne estävät kansion poistamisen. Tämä on hyödyllistä metatietojen osalta.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Tiedoston avaaminen ei onnistunut</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>Muutoksien kirjoittaminen kohteeseen &apos;%1&apos; epäonnistui.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Lisää ohituskaava</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Lisää uusi ohituskaava:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation type="unfinished"/>
</message>
@@ -1389,7 +1529,7 @@ Kohteet, joiden poisto on sallittu, poistetaan, jos ne estävät kansion poistam
<message>
<location filename="../src/gui/issueswidget.ui" line="20"/>
<source>List of issues</source>
- <translation type="unfinished"/>
+ <translation>Lista ongelmista</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="34"/>
@@ -1400,52 +1540,62 @@ Kohteet, joiden poisto on sallittu, poistetaan, jos ne estävät kansion poistam
<location filename="../src/gui/issueswidget.ui" line="42"/>
<location filename="../src/gui/issueswidget.ui" line="61"/>
<source>&lt;no filter&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;no filter&gt;</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Kansio</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="73"/>
<source>Show warnings</source>
- <translation type="unfinished"/>
+ <translation>Näytä varoitukset</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="83"/>
<source>Show ignored files</source>
- <translation type="unfinished"/>
+ <translation>Näytä ohitetut tiedostot</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
+ <translation>Liian monta virhettä. Kaikki eivät ole näkyvissä tässä.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
- <translation type="unfinished"/>
+ <translation>Kopioi ongelmalista leikepöydälle.</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Kopioi</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Aika</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Tiedosto</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
+ <translation>Ongelma</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1469,40 +1619,52 @@ Kohteet, joiden poisto on sallittu, poistetaan, jos ne estävät kansion poistam
<message>
<location filename="../src/gui/logbrowser.cpp" line="89"/>
<source>&amp;Capture debug messages</source>
- <translation type="unfinished"/>
+ <translation>&amp;Kaappaa vianjäljitysviestit</translation>
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Tyhjennä</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Tyhjennä lokinäyttö.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>&amp;Tallenna</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Tallenna loki tiedostoon virheenetsintää varten.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Tallenna lokitiedosto</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Virhe</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>Lokitiedostoon %1 kirjoittaminen epäonnistui</translation>
</message>
@@ -1510,12 +1672,12 @@ Kohteet, joiden poisto on sallittu, poistetaan, jos ne estävät kansion poistam
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Virhe</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;Tiedostoa &apos;%1&apos;&lt;br/&gt;ei voida avata kirjoittamista varten.&lt;br/&gt;&lt;br/&gt;Lokitulostusta&lt;b&gt;ei&lt;/b&gt;pystytä tallentamaan!&lt;/nobr&gt;</translation>
</message>
@@ -1523,27 +1685,27 @@ Kohteet, joiden poisto on sallittu, poistetaan, jos ne estävät kansion poistam
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Uusi versio saatavilla</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;Uusi versio %1-asiakasohjelmistosta on saatavilla.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; on ladattavissa. Asennettu versio on %3.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Ohita tämä versio</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Ohita tämän kerran</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Päivitä</translation>
</message>
@@ -1631,27 +1793,27 @@ Kohteet, joiden poisto on sallittu, poistetaan, jos ne estävät kansion poistam
<translation>Rajoita automaattisesti</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Välityspalvelinkoneen nimi</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Välityspalvelimen käyttäjätunnus</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Välityspalvelimen salasana</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>HTTP(S)-välityspalvelin</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>SOCKS5-välityspalvelin</translation>
</message>
@@ -1659,23 +1821,23 @@ Kohteet, joiden poisto on sallittu, poistetaan, jos ne estävät kansion poistam
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>Luotu %1</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>Suljetaan muutamassa sekunnissa...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation>&apos;%1&apos; valittu %2</translation>
@@ -1684,32 +1846,32 @@ Kohteet, joiden poisto on sallittu, poistetaan, jos ne estävät kansion poistam
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
- <translation type="unfinished"/>
+ <translation>Palvelimelta palautettu virhe: &lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;h1&gt;Kirjautumisvirhe&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -1717,58 +1879,58 @@ Kohteet, joiden poisto on sallittu, poistetaan, jos ne estävät kansion poistam
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Uusi %1-päivitys valmiina</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>Uusi %1-päivitys on valmiina asennettavaksi. Päivitysohjelma saattaa pyytää lisäoikeuksia päivityksen aikana.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>Ladataan versiota %1. Odota hetki...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>Päivityksen lataaminen epäonnistui. Napsauta &lt;a href=&apos;%1&apos;&gt;tästä&lt;/a&gt; ladataksesi päivityksen manuaalisesti.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Päivitysten tarkistus epäonnistui.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>%1-versio %2 saatavilla. Käynnistä sovellus uudelleen aloittaaksesi päivityksen.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>Uusi %1-versio %2 on saatavilla. Käytä järjestelmän päivitystyökalua asentaaksesi sen.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Tarkistetaan päivityspalvelinta...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>Päivityksen tila on tuntematon: uusia päivityksiä ei tarkistettu.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>Päivityksiä ei ole saatavilla. Käytössäsi on uusin versio.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Päivitystarkistus</translation>
</message>
@@ -1776,43 +1938,43 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Muodosta yhteys - %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Aseta paikallisen kansion valinnat</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Yhdistä...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1-kansio &apos;%2&apos; on synkronoitu paikalliseen kansioon &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>Synkronoi kansio &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Varoitus:&lt;/strong&gt; Paikallinen kansio ei ole tyhjä. Valitse jatkotoimenpide!&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Paikallinen synkronointikansio</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1871,14 +2033,19 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Muodosta yhteys - %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
- <translation type="unfinished"/>
+ <translation>Kirjaudu selaimeesi</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation>Kopioi linkki leikepöydälle</translation>
</message>
</context>
<context>
@@ -1910,153 +2077,163 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<source>&amp;Next &gt;</source>
<translation>&amp;Seuraava &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>Virheellinen verkko-osoite</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Muodostettu yhteys onnistuneesti kohteeseen %1: %2 versio %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Yhteys %1iin osoitteessa %2 epäonnistui:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>Aikakatkaisu yrittäessä yhteyttä kohteeseen %1 osoitteessa %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Yritetään yhdistetää palvelimeen %1 portissa %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>Todennettuun webdav-pyyntöön saatiin virheellinen vastaus</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>Palvelin esti käyttämisen. Vahvista käyttöoikeutesi palvelimeen &lt;a href=&quot;%1&quot;&gt;napsauttamalla tästä&lt;/a&gt; ja kirjaudu palveluun selaimella.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>Virheellinen verkko-osoite</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
- <translation type="unfinished"/>
+ <translation>Palvelin ilmoitti seuraavan virheen:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>Paikallinen kansio %1 on jo olemassa, asetetaan se synkronoitavaksi.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>Luodaan paikallista synkronointikansiota %1...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>ok</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>epäonnistui.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>Paikalliskansion %1 luonti epäonnistui</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>Etäkansiota ei määritelty!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Virhe: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>luodaan kansio ownCloudiin: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>Etäkansio %1 luotiin onnistuneesti.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>Etäkansio %1 on jo olemassa. Otetaan siihen yhteyttä tiedostojen täsmäystä varten.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>Kansion luonti aiheutti HTTP-virhekoodin %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>Etäkansion luominen epäonnistui koska antamasi tunnus/salasana ei täsmää!&lt;br/&gt;Ole hyvä ja palaa tarkistamaan tunnus/salasana&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Pilvipalvelun etäkansion luominen ei onnistunut , koska tunnistautumistietosi ovat todennäköisesti väärin.&lt;/font&gt;&lt;br/&gt;Palaa takaisin ja tarkista käyttäjätunnus ja salasana.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>Etäkansion %1 luonti epäonnistui, virhe &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>Täsmäysyhteys kansiosta %1 etäkansioon %2 on asetettu.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Yhteys kohteeseen %1 muodostettiin onnistuneesti!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>Yhteyttä osoitteeseen %1 ei voitu muodostaa. Ole hyvä ja tarkista uudelleen.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Kansion nimen muuttaminen epäonnistui</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Paikallinen synkronointikansio %1 luotu onnistuneesti!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2064,14 +2241,31 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>%1-yhteysavustaja</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Ohita kansioiden määritykset</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2095,7 +2289,7 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation type="unfinished"/>
</message>
@@ -2103,7 +2297,7 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>Virhe kirjoittaessa metadataa tietokantaan</translation>
</message>
@@ -2111,47 +2305,47 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>Levyllä on vapaata tilaa vähemmän kuin %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>Tiedosto poistettiin palvelimelta</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>Tiedostoa ei voitu ladata täysin.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>Tiedosto on muuttunut löytymisen jälkeen</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>Virhe kirjoittaessa metadataa tietokantaan</translation>
</message>
@@ -2159,12 +2353,12 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation type="unfinished"/>
</message>
@@ -2172,22 +2366,22 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>kansiota %1 ei voitu luoda</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>Virhe kirjoittaessa metadataa tietokantaan</translation>
</message>
@@ -2195,17 +2389,17 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>Virhe poistaessa &apos;%1&apos;: %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>Ei voitu poistaa kansiota &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation type="unfinished"/>
</message>
@@ -2213,13 +2407,13 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>Virhe kirjoittaessa metadataa tietokantaan</translation>
</message>
@@ -2227,12 +2421,7 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>HTTP-palvelin palautti väärän koodin. Odotettiin koodia 204, vastaanotettiin &quot;%1 %2&quot;.</translation>
</message>
@@ -2240,12 +2429,12 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>HTTP-palvelin palautti väärän koodin. Odotettiin koodia 201, vastaanotettiin &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>Virhe kirjoittaessa metadataa tietokantaan</translation>
</message>
@@ -2253,28 +2442,13 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Tätä kansiota ei ole tule nimetä uudelleen. Muutetaan takaisin alkuperäinen nimi.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>Tiedosto nimettiin uudelleen, mutta se on osa &quot;vain luku&quot;-jakoa. Alkuperäinen tiedosto palautettiin.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>HTTP-palvelin palautti väärän koodin. Odotettiin koodia 201, vastaanotettiin &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>Virhe kirjoittaessa metadataa tietokantaan</translation>
</message>
@@ -2282,33 +2456,33 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Tiedosto poistettu</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>Paikallinen tiedosto muuttui synkronoinnin aikana.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>Virhe kirjoittaessa metadataa tietokantaan</translation>
</message>
@@ -2316,27 +2490,27 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>Paikallinen tiedosto poistettiin synkronoinnin aikana.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>Paikallinen tiedosto muuttui synkronoinnin aikana.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation>Odottamaton paluukoodi palvelimelta (%1)</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation type="unfinished"/>
</message>
@@ -2344,27 +2518,22 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>Paikallinen tiedosto poistettiin synkronoinnin aikana.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>Paikallinen tiedosto muuttui synkronoinnin aikana.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation type="unfinished"/>
</message>
@@ -2382,42 +2551,47 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<translation>TekstiLeima</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Avaa selaimessa</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Aika</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Tiedosto</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Kansio</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Toiminto</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Koko</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>Paikallinen synkronointiprotokolla</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Kopioi</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Kopioi toimilista leikepöydälle.</translation>
</message>
@@ -2458,7 +2632,7 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Valitse synkronoitavat tiedot</translation>
</message>
@@ -2466,33 +2640,33 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Ladataan...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Nimi</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Koko</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>Palvelimella ei ole alihakemistoja juuri nyt.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation>Alikansioluetteloa ladatessa tapahtui virhe.</translation>
</message>
@@ -2513,22 +2687,22 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<translation>Asetukset</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Toimet</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Yleiset</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Verkko</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Tili</translation>
</message>
@@ -2536,28 +2710,28 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Toimet</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Yleiset</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Verkko</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Tili</translation>
</message>
@@ -2585,42 +2759,42 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<translation>ownCloud-polku:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>%1 - Jakaminen</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Kansio: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>Palvelin ei salli jakamista</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>Käyttäjät ja ryhmät</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>Julkiset linkit</translation>
</message>
@@ -2633,7 +2807,17 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<translation>Jaa UusiAsiakirja.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>TekstiLeima</translation>
</message>
@@ -2645,12 +2829,12 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="35"/>
<source>Enter a name to create a new public link...</source>
- <translation type="unfinished"/>
+ <translation>Anna nimi luodaksesi uuden julkisen linkin...</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="42"/>
<source>&amp;Create new</source>
- <translation type="unfinished"/>
+ <translation>&amp;Luo uusi</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="105"/>
@@ -2663,115 +2847,120 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<translation>Aseta salasana</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
- <translation type="unfinished"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
+ <translation>Vastaanottaja voi katsoa tai ladata sisältöä.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>Näytä tiedostolistaus</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation>Lataa / Näytä</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Salli muokkaus</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation>Lataa / Näytä / Lähetä</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation>Vastaanottaja voi katsoa, ladata, muokata, poistaa ja lähettää sisältöä.</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
<source>Anyone with the link has access to the file/folder</source>
- <translation type="unfinished"/>
+ <translation>Kenellä tahansa linkin omaavalla on pääsy tiedostoon/kansioon</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>&amp;Suojaa salasanalla</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Salasanasuojattu</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
- <translation type="unfinished"/>
+ <translation>Linkkijaot on poistettu käytöstä</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
- <translation type="unfinished"/>
+ <translation>Luo julkinen linkkijako</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Poista</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
- <translation type="unfinished"/>
+ <translation>Avaa linkki selaimessa</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
- <translation type="unfinished"/>
+ <translation>Kopioi linkki leikepöydälle</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Lähetä linkki sähköpostitse</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Peruuta</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
- <translation type="unfinished"/>
+ <translation>Julkinen linkki</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
- <translation type="unfinished"/>
+ <translation>Poista linkkijako</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>&amp;Julkinen jakaminen vaatii salasanan</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Aseta salasana</translation>
</message>
@@ -2794,34 +2983,34 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
- <translation type="unfinished"/>
+ <translation>Avaa linkki selaimessa</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
- <translation type="unfinished"/>
+ <translation>Kopioi linkki leikepöydälle</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Lähetä linkki sähköpostitse</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>Ei tuloksia haulla &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
- <translation type="unfinished"/>
+ <translation>Jaoin jotain kanssasi</translation>
</message>
</context>
<context>
@@ -2832,37 +3021,38 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<translation>Lomake</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>TekstiLeima</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>voi muokata</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>jaa</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>luo</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>muuta</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>poista</translation>
</message>
@@ -2906,143 +3096,176 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
- <source>I shared something with you</source>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
+ <source>I shared something with you</source>
+ <translation>Jaoin jotain kanssasi</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
- <translation type="unfinished"/>
+ <translation>Jaa...</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
- <translation type="unfinished"/>
+ <translation>Kopioi yksityinen linkki leikepöydälle</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
+ <translation>Lähetä yksityinen linkki sähköpostitse...</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Avaa selaimessa</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Varmenteen tiedot&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Yleinen nimi (CN):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Organisaatio (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Organisaatioyksikkö (OU):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Lääni/maakunta/provinssi:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>Maa:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Sarjanumero:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Myöntäjä&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Myöntäjä:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Myönnetty:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Vanhenee:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Sormenjäljet&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;Huomio:&lt;/b&gt; Tämä varmenne hyväksyttiin käsin&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (allekirjoitettu itse)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>Yhteys on salattu, käytössä %1-bittinen %2.
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Varmenteen tiedot:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>Yhteys EI OLE turvallinen, koska sitä ei ole salattu.
@@ -3130,305 +3353,270 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Onnistui.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;%1-liitännäistä csyncia varten ei voitu ladata.&lt;br/&gt;Varmista asennuksen toimivuus!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync ei onnistunut yhdistämään verkkoon.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>Tapahtui verkon aikakatkaisu.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>Tapahtui HTTP-välitysvirhe.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation>Liitetty kansio on väliaikaisesti pois käytöstä tällä palvelimella</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>Kansiota avatessa tapahtui virhe</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>Kansiota lukiessa tapahtui virhe</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>Tiedosto/kansi ohitetaan, koska se on piilotettu.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation>Vain %1 on käytettävissä, käynnistymiseen tarvitaan %2</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation>Ei sallittu, koska käyttöoikeutesi eivät riitä ylätason kansion lisäämiseen</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation>Ei sallittu, koska käyttöoikeutesi eivät riitä tiedostojen lisäämiseen kyseiseen kansioon</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: %1-palvelimella ei ole tilaa vapaana.</translation>
+ <translation>Palvelimella ei ole riittävästi tallennustilaa joidenkin lähetysten osalta.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>CSync - määrittämätön virhe.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Keskeytetty käyttäjän toimesta</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>Palvelu ei ole juuri nyt käytettävissä</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>Pääsy estetty</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>Sisäinen virhe, numero %1.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>Symboliset linkit eivät ole tuettuja synkronoinnissa.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>Tiedosto on ohituslistalla.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>Tiedoston nimi on liian pitkä.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
- <translation type="unfinished"/>
+ <translation>Selvittämätön ristiriita.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>Stat epäonnistui.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>Tiedostonimen merkistökoodaus ei ole kelvollista</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>Virheellisiä merkkejä, anna uusi nimi kohteelle &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>Tiedoston nimi sisältää ainakin yhden virheellisen merkin</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation>Ei sallittu, koska oikeutesi eivät riitä alikansioiden lisäämiseen kyseiseen kansioon</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>Poistaminen ei ole sallittua, palautetaan</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>Paikalliset tiedostot ja jakokansio poistettu.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>Siirtäminen ei ole sallittua, kohde palautettu</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>Siirto ei ole sallittu, koska %1 on &quot;vain luku&quot;-tilassa</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>kohde</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>lähde</translation>
</message>
@@ -3452,17 +3640,17 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Versio %1. Lisätietoja osoitteessa &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation>&lt;p&gt;Tekijänoikeus ownCloud GmbH&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -3493,81 +3681,81 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<translation>Kirjaudu sisään</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Kansio %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Synkronointikansioita ei ole määritelty.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Avaa selaimessa</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Kirjaudu sisään...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Kirjaudu ulos</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Viimeisimmät muutokset</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Hallitut kansiot:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Avaa kansio &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Avaa %1 selaimeen</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Tuntematon tila</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Asetukset...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Tiedot...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Ohje</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>Lopeta %1</translation>
</message>
@@ -3582,11 +3770,6 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<translation>Palvelimen versio ei ole tuettu</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Yhteys katkaistu</translation>
@@ -3618,116 +3801,129 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
+ <translation>Synkronointi on keskeytetty</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
- <translation type="unfinished"/>
+ <translation>Virhe synkronoinnin aikana</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
- <translation type="unfinished"/>
+ <translation>Synkronointikansioita ei ole määritetty</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>Keskeytä kaikki kansiot</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>Palauta kaikki synkronointi</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>Palauta synkronointi</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>Keskeytä kaikki synkronointi</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>Keskeytä synkronointi</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Kirjaudu ulos kaikista tileistä</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Kirjaudu kaikille tileille...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>Uusi tili...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>Tietoja - %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Kohteita ei ole synkronoitu äskettäin</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Synkronoidaan %1/%2 (%3 jäljellä)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation>Synkronoidaan %1/%2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Synkronoidaan %1 (%2 jäljellä)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>Synkronoidaan %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Ajan tasalla</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation type="unfinished"/>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3739,9 +3935,9 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>TekstiLeima</translation>
</message>
@@ -3777,11 +3973,22 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Valitse synkronoitavat tiedot</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>&amp;Paikallinen kansio</translation>
@@ -3798,11 +4005,16 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>S&amp;ynkronoi kaikki palvelimelta</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Tilaviesti</translation>
</message>
@@ -3835,17 +4047,17 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="36"/>
<source>Please switch to your browser to proceed.</source>
- <translation type="unfinished"/>
+ <translation>Siirry selaimeen jatkaaksesi.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
+ <source>An error occurred while connecting. Please try again.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="56"/>
<source>Re-open Browser</source>
- <translation type="unfinished"/>
+ <translation>Avaa selain uudelleen</translation>
</message>
</context>
<context>
@@ -3864,7 +4076,7 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<message>
<location filename="../src/gui/wizard/owncloudsetupnocredspage.ui" line="86"/>
<source>Ser&amp;ver Address</source>
- <translation type="unfinished"/>
+ <translation>&amp;Palvelinosoite</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudsetupnocredspage.ui" line="102"/>
@@ -4019,7 +4231,7 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;Koostettu Git-revisiosta &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; %3, %4 käyttäen Qt:n versiota %5, %6&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4117,52 +4329,52 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Tila on määrittelemätön.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Odotetaan synkronoinnin käynnistymistä</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>Synkronointi meneillään</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Synkronointi valmistui</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Synkronointi onnistui, jotkin tiedostot ohitettiin.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Synkronointivirhe</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Asetusvirhe.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Valmistaudutaan synkronointiin</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Keskeytetään...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>Synkronointi on keskeytetty</translation>
</message>
@@ -4170,22 +4382,22 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
- <translation type="unfinished"/>
+ <translation>Selainta ei voitu avata</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation>Sähköpostisovelluksen avaaminen epäonnistui</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation type="unfinished"/>
</message>
diff --git a/translations/client_fr.ts b/translations/client_fr.ts
index 09b80e47a..35c99f529 100644
--- a/translations/client_fr.ts
+++ b/translations/client_fr.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="fr" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation>Impossible de créer des dossiers dans la corbeille</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation>Impossible de déplacer &apos;%1&apos; vers &apos;%2&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation>Le déplacement dans la corbeille n&apos;est pas implémenté sur cette plateforme</translation>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -14,7 +33,7 @@
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="44"/>
<source>&amp;Choose...</source>
- <translation>&amp;Choisir</translation>
+ <translation>&amp;Choisir...</translation>
</message>
</context>
<context>
@@ -76,17 +95,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Délai de connexion dépassé</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
- <translation>Erreur inconnue : La réponse du réseau a été supprimé</translation>
+ <translation>Erreur inconnue : La réponse du réseau a été supprimée</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation>Le serveur a répondu &quot;%1 %2&quot; à &quot;%3 %4&quot;</translation>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Annuler</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Compte</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Sélectionner le contenu à synchroniser</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Forcer la synchronisation maintenant</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>Redémarrer la synchronisation</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>Supprimer la synchronisation du dossier</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Échec de création du dossier</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;Impossible de créer le dossier local &lt;i&gt;%1&lt;/i&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>Confirmer une suppression de synchronisation de dossier</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>Supprimer la synchronisation de ce dossier</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Synchronisation en cours</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>La synchronisation est en cours.&lt;br/&gt;Voulez-vous l&apos;arrêter ?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 utilisés</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 avec le compte &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>La version %1 du serveur est ancienne et n&apos;est pas prise en charge. Continuez à vos risques et périls.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Connecté au serveur %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>Le serveur %1 est temporairement indisponible.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation>Le serveur %1 est en cours de maintenance.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>Session sur %1 fermée.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation>En attente d&apos;autorisation du navigateur. &lt;a href=&apos;%1&apos;&gt;Cliquer ici&lt;/a&gt; pour recharger le navigateur.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation>Connexion à %1</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>Aucune connexion au serveur %1 à l&apos;adresse %2.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Se connecter</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>Certains dossiers n&apos;ont pas été synchronisés parce qu&apos;ils sont de taille trop importante :</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>Certains dossiers n&apos;ont pas été synchronisés parce qu&apos;ils sont localisés sur un stockage externe :</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
- <translation>Certains dossiers n&apos;ont pas été synchronisés par qu&apos;ils sont localisés sur un stockage externe ou qu&apos;ils sont de taille trop importante :</translation>
+ <translation>Certains dossiers n&apos;ont pas été synchronisés parce qu&apos;ils sont localisés sur un stockage externe ou qu&apos;ils sont de taille trop importante :</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Confirmation de retrait du compte</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Êtes-vous certain de vouloir retirer &lt;i&gt;%1&lt;/i&gt; des comptes synchronisés avec le serveur ?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Remarque :&lt;/b&gt; cela ne supprimera pas votre compte sur le serveur et aucun fichier ne sera supprimé ni localement ni en ligne.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Êtes-vous certain de vouloir retirer &lt;i&gt;%1&lt;/i&gt; des comptes synchronisés avec le serveur ?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Remarque :&lt;/b&gt; cela ne supprimera pas votre compte sur le serveur, et aucun fichier ne sera supprimé ni localement ni en ligne.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Retirer le compte</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Ouvrir le dossier local</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Se déconnecter</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Reprendre la synchronisation</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Mettre en pause</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Voulez-vous vraiment arrêter de synchroniser le dossier &lt;i&gt;%1&lt;/i&gt; ?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note :&lt;/b&gt; Aucun fichier ne sera supprimé.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1 (%3%) utilisés sur %2. Certains dossiers, montés depuis le réseau ou partagés, peuvent avoir des limites différentes.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%1 utilisés sur %2</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Actuellement aucune information d&apos;utilisation de stockage n&apos;est disponible.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>Aucune connexion à %1 configurée</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Session fermée</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Déconnecté</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Connecté</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Service indisponible</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
- <translation>mode maintenance</translation>
+ <translation>Mode maintenance</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Erreur réseau</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Erreur de configuration</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation>informations d&apos;identification demandées</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Etat du compte inconnu</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Activité serveur</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Activité de synchronisation</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>Fichiers non synchronisés</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>Non Synchronisé (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>L&apos;historique des opérations sur le serveur a été copié dans le presse-papier.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>L&apos;historique des opérations locales a été copié dans le presse-papier.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>La liste des éléments non synchronisés a été copiée dans le presse-papier.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Copié dans le presse-papier</translation>
</message>
@@ -469,47 +488,47 @@
<translation>TextLabel</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Historique des opérations sur le serveur</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Copier</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Copier la liste d&apos;activités dans le presse-papier</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Action exigée : Notifications</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;Le compte %1 n&apos;a aucune activité activée.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation><numerusform>Vous avez reçu %n nouvelle notification de %2.</numerusform><numerusform>Vous avez reçu %n nouvelles notifications de %2.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation><numerusform>Vous avez reçu 1 nouvelle notification de %1 et %2.</numerusform><numerusform>Vous avez reçu %n nouvelles notifications de %1 et %2.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>Vous avez reçu de nouvelles notifications de %1, %2 et d&apos;autres comptes.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>%1 Notifications - Action Requise</translation>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation>En continuant vous allez &lt;b&gt;effacer ces paramètres&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation>En continuant vous allez &lt;b&gt;ignorer ces paramètres&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation>Certains paramètres ont été configurés dans des versions plus récentes de ce logiciel client et utilisent des fonctionnalités non disponibles dans cette version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Le fichier de configuration actuel a été d&apos;ores et déjà sauvegardé en tant que &lt;i&gt;%2&lt;/i&gt;. </translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Quitter</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Continuer</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation>Erreur lors de l&apos;accès au fichier de configuration</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation>Une erreur s&apos;est produite lors de l&apos;accès au fichier de configuration situé dans %1.</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>Quitter ownCloud</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>Erreur à l&apos;écriture des métadonnées dans la base de données</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>Aucun compte ownCloud configuré</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>Le serveur configuré pour ce client est trop vieux</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Veuillez mettre à jour le serveur vers la dernière version et redémarrer le client.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Erreur d&apos;authentification: nom d&apos;utilisateur et/ou mot de passe incorrect(s).</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>délai d&apos;attente</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>Les informations d&apos;identification fournies ne sont pas correctes</translation>
</message>
@@ -637,121 +681,129 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Interrompu par l&apos;utilisateur</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>Le dossier local %1 n&apos;existe pas.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 devrait être un dossier mais ne l&apos;est pas.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 ne peut pas être lu.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 a été supprimé.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 a été téléchargé.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 a été mis à jour.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 a été renommé en %2.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 a été déplacé vers %2.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation><numerusform>%1 a été supprimé.</numerusform><numerusform>%1 et %n autres fichiers ont été supprimés.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation><numerusform>%1 a été téléchargé.</numerusform><numerusform>%1 et %n autres fichiers ont été téléchargés.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation><numerusform>%1 a été mis à jour.</numerusform><numerusform>%1 et %n autres fichiers ont été mis à jour.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation><numerusform>%1 a été renommé en %2.</numerusform><numerusform>%1 a été renommé en %2 et %n autres fichiers ont été renommés.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation><numerusform>%1 a été déplacé vers %2.</numerusform><numerusform>%1 a été déplacé vers %2 et %n autres fichiers ont été déplacés.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation><numerusform>%1 a un conflit de synchronisation.</numerusform><numerusform>%1 et %n autres fichiers ont des problèmes de synchronisation.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation>%1 a un problème de synchronisation. Merci de vérifier le fichier conflit !</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation><numerusform>%1 ne peut pas être synchronisé en raison d&apos;erreurs. Consultez les logs pour les détails.</numerusform><numerusform>%1 et %n autres fichiers n&apos;ont pas pu être synchronisés en raison d&apos;erreurs. Consultez les logs pour les détails.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 n&apos;a pu être synchronisé pour cause d&apos;erreur. Consultez les logs pour les détails.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Activité de synchronisation</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>Impossible de lire le fichier d&apos;exclusion du système</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation>Un nouveau dossier de taille supérieure à %1 Mo a été ajouté : %2.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation>Un nouveau dossier localisé sur un stockage externe a été ajouté.
@@ -759,12 +811,35 @@
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation>Merci d&apos;aller dans les Paramètres pour indiquer si vous souhaitez le télécharger.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation>Le dossier %1 a été créé mais avait été exclu de la synchronisation auparavant. Les données à l&apos;intérieur ne seront pas synchronisées.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation>Le fichier %1 a été créé mais avait été exclu de la synchronisation auparavant. Il ne sera pas synchronisé.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation>Les changements dans les dossiers synchronisés ne peuvent être suivis de façon fiable.
+
+Cela veut dire que le client de synchronisation ne peut pas téléverser les changements locaux dans l&apos;immédiat et qu&apos;à la place il recherchera les changements locaux et les téléversera occasionnellement (toutes les deux heures par défaut).
+
+%1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -772,34 +847,34 @@ If you decide to delete the files, they will be unavailable to you, unless you a
<translation>Tous les fichiers contenus dans le dossier synchronisé &apos;%1&apos; ont été supprimés du serveur.
Ces suppressions seront synchronisées sur vos dossiers locaux synchronisés, rendant ces fichiers inaccessibles, à moins que vous n&apos;ayez le droit de les restaurer.
Si vous décidez de conserver ces fichiers, ils seront synchronisés à nouveau avec le serveur si vous en avez le droit.
-Si vous décidez de supprimer ces fichiers, ils vous seront inaccessibles, sauf si vous en êtes le propriétaire.</translation>
+Si vous décidez de supprimer ces fichiers, ils vous seront inaccessibles, sauf si vous en êtes le/la propriétaire.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
- <translation>Tous les fichiers contenus dans le dossier synchronisé &apos;%1&apos; ont été supprimés. Ces suppressions seront synchronisées avec votre serveur, rendant ces fichiers inaccessibles sauf s&apos;ils sont restaures.
-Êtes-vous sûr de vouloir synchroniser ces actions avec le serveur ?
+ <translation>Tous les fichiers contenus dans le dossier synchronisé &apos;%1&apos; ont été supprimés. Ces suppressions seront synchronisées avec votre serveur, rendant ces fichiers inaccessibles sauf s&apos;ils sont restaurés.
+Êtes-vous sûr·e de vouloir synchroniser ces actions avec le serveur ?
S&apos;il s&apos;agissait d&apos;un accident et que vous choisissiez de conserver vos fichiers, ils seront synchronisés à nouveau depuis le serveur.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Supprimer tous les fichiers ?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Supprimer tous les fichiers</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Conserver les fichiers</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
@@ -808,17 +883,17 @@ Cela peut être dû à une copie de sauvegarde restaurée sur le serveur.
Continuer la synchronisation comme d&apos;habitude fera en sorte que tous les fichiers soient remplacés par des fichiers plus vieux d&apos;un état précédent. Voulez-vous conserver les versions les plus récentes de vos fichiers en tant que fichiers conflictuels ?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>Sauvegarde détectée</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>Synchronisation normale</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>Conserver les fichiers locaux comme Conflits</translation>
</message>
@@ -826,115 +901,105 @@ Continuer la synchronisation comme d&apos;habitude fera en sorte que tous les fi
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>Impossible de réinitialiser l&apos;état du dossier</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>Un ancien fichier journal &apos;%1&apos; a été trouvé, mais ne peut être supprimé. Veuillez vous assurer qu’aucune application ne l&apos;utilise en ce moment.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation>(sauvegarde)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation>(sauvegarde %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Statut indéfini.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>En attente de synchronisation.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Préparation de la synchronisation.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>Synchronisation en cours</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>Synchronisation terminée avec succès</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation>Synchronisation réussie, conflits non résolus.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>Synchronisation terminée avec des avertissements pour certains fichiers</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>Synchronisation terminée avec succès</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Erreur d&apos;installation.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Abandon par l&apos;utilisateur.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>La synchronisation est en pause.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Synchronisation en pause)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>Aucun dossier valable sélectionné !</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>Le chemin sélectionné n&apos;est pas un dossier !</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Vous n&apos;avez pas la permission d&apos;écrire dans le dossier sélectionné !</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation>Le dossier local %1 contient un lien symbolique. La cible du lien contient un dossier déjà synchronisé. Veuillez en choisir un autre !</translation>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation>Il y a déjà une synchronisation depuis le serveur vers ce dossier local. Merci de choisir un autre dossier local !</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Le dossier local %1 contient un dossier déjà utilisé pour une synchronisation de dossiers. Veuillez en choisir un autre !</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Le dossier local %1 se trouve dans un dossier déjà configuré pour une synchronisation de dossier. Veuillez en choisir un autre !</translation>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation>Le dossier local %1 est un lien symbolique. Le dossier vers lequel le lien pointe est inclus dans un dossier déjà configuré pour une synchronisation de dossier. Veuillez en choisir un autre !</translation>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -944,7 +1009,7 @@ Continuer la synchronisation comme d&apos;habitude fera en sorte que tous les fi
<translation>Ajouter une synchronisation de dossier</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>Sélectionnez les sous-dossiers à synchroniser à partir du dossier local</translation>
</message>
@@ -979,7 +1044,7 @@ Continuer la synchronisation comme d&apos;habitude fera en sorte que tous les fi
<translation>Une erreur est survenue lors du chargement de la liste des dossiers depuis le serveur.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Session fermée</translation>
</message>
@@ -994,115 +1059,133 @@ Continuer la synchronisation comme d&apos;habitude fera en sorte que tous les fi
<translation>Il y a des conflits non résolus. Cliquez pour plus de détails.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Recherche de modifications dans &apos;%1&apos;</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation>Les nouveaux fichiers vont être créés en tant que fichiers virtuels.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation>Vérification des changements distants &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation>Vérification des changements locaux &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation>Rapprochement des modifications</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>Synchronisation de %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>réception %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>envoi %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 sur %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%5 restantes, %1 sur %2, fichier %3 sur %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 sur %2, fichier %3 sur %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>fichier %1 sur %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>En attente ...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>En attente de %n autre(s) dossier(s)</numerusform><numerusform>En attente de %n autre(s) dossier(s)</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>Préparation à la synchronisation</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation>Ce problème survient généralement lorsque les contrôleurs inotify sont saturés. Consulter la FAQ pour plus de détails.</translation>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>Ajouter une synchronisation de dossier</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>Ajouter une Synchronisation</translation>
</message>
@@ -1110,17 +1193,17 @@ Continuer la synchronisation comme d&apos;habitude fera en sorte que tous les fi
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Cliquez pour choisir un dossier local à synchroniser.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Entrez le chemin du dossier local.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Sélectionnez le dossier source</translation>
</message>
@@ -1128,60 +1211,68 @@ Continuer la synchronisation comme d&apos;habitude fera en sorte que tous les fi
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Créer un dossier distant</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>Entrez le nom du nouveau dossier à créer dans &apos;%1&apos; :</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>Le dossier a été créé sur %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>Erreur d&apos;authentification lors de l&apos;accès à %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>Échec à la création du dossier sur %1. Veuillez vérifier manuellement.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>Impossible de lister un dossier. Erreur : %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Sélectionnez ceci pour synchroniser l&apos;ensemble du compte</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Ce dossier est déjà en cours de synchronisation.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Vous synchronisez déja &lt;i&gt;%1&lt;/i&gt;, qui est un dossier parent de &lt;i&gt;%2&lt;/i&gt;.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation>Utiliser des fichiers virtuels au lieu de télécharger le contenu immédiatement (expérimental)</translation>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Avertissement :&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Avertissement :&lt;/b&gt;</translation>
</message>
@@ -1189,22 +1280,22 @@ Continuer la synchronisation comme d&apos;habitude fera en sorte que tous les fi
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>Aucun E-Tag reçu du serveur, vérifiez le proxy / la passerelle</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>Nous avons reçu un E-Tag différent pour reprendre le téléchargement. Nouvel essai la prochaine fois.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>Le serveur a retourné une gamme de contenu erronée</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Délai d&apos;attente de connexion dépassé</translation>
</message>
@@ -1227,23 +1318,38 @@ Continuer la synchronisation comme d&apos;habitude fera en sorte que tous les fi
<translation>Pour la zone de notification</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation>&amp;Canal</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation>stable</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation>bêta</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Avancé</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation>Demander confirmation avant de synchroniser les dossiers de taille supérieure à </translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>Mo</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation>Demander confirmation avant de synchroniser des stockages externes </translation>
</message>
@@ -1263,31 +1369,71 @@ Continuer la synchronisation comme d&apos;habitude fera en sorte que tous les fi
<translation>Utiliser les icônes &amp;monochromes</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>Modifier les fichiers exclus</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation>Montrer les répertoires synchronisés dans le panneau de navigation de l&apos;&amp;Explorateur de fichiers</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>Affic&amp;her le rapport d&apos;incident</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>À propos</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>Mises à jour</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>&amp;Redémarrer &amp;&amp; Mettre à jour</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation>Changer le canal de mise à jour ?</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation>Le canal de mise à jour détermine quelles mises à jour du client seront proposées pour être installées. Le canal « stable » contient uniquement des mises à niveau considérées comme étant fiables, tandis que les versions dans le canal « bêta » peuvent contenir de nouvelles fonctionnalités et des corrections de bugs, mais qui n&apos;ont pas encore été testées suffisamment.
+
+Veuillez noter que cela sélectionne seulement la zone de mises à jour, et qu&apos;il n&apos;y a pas de retour à des versions antérieures : par conséquent retourner du canal bêta au canal stable ne peut s&apos;effectuer de façon instantanée et nécessite d&apos;attendre une version stable plus récente que la version bêta installée.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation>Changer le canal de mise à jour</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation>Erreur de partage</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation>Impossible de récupérer ou de créer le lien de partage public. Erreur :
+
+%1</translation>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1355,7 +1501,7 @@ Continuer la synchronisation comme d&apos;habitude fera en sorte que tous les fi
<translation>Supprimer</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1364,27 +1510,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
L&apos;option &quot;Autoriser suppression&quot; permet de ne pas bloquer la suppression d&apos;un dossier. C&apos;est utile pour les fichiers de méta-données.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Impossible d&apos;ouvrir le fichier</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>Impossible d&apos;écrire les modifications sur &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Ajouter un motif d&apos;exclusion</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Ajoutez un nouveau motif d&apos;exclusion :</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Cette entrée est fournie par le système dans &apos;%1&apos; et ne peut être modifiée dans cette vue.</translation>
</message>
@@ -1414,7 +1560,7 @@ L&apos;option &quot;Autoriser suppression&quot; permet de ne pas bloquer la supp
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Dossier</translation>
</message>
@@ -1429,35 +1575,45 @@ L&apos;option &quot;Autoriser suppression&quot; permet de ne pas bloquer la supp
<translation>Voir les fichiers ignorés</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
- <translation>De trop nombreuses questions se posent. Toutes n&apos;apparaissent pas ici.</translation>
+ <translation>Il y a eu trop de problèmes. Tous n&apos;apparaissent pas ici.</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation>Des conflits ont été détectés. Consultez la documentation pour savoir comment les résoudre.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation>Copier la liste des anomalies dans le presse-papier.</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Copier</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Heure</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Fichier</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation>Incident</translation>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation>Il y a eu des conflits. &lt;a href=&quot;%1&quot;&gt;Consultez la documentation pour pouvoir les résoudre.&lt;/a&gt;</translation>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1483,36 +1639,50 @@ L&apos;option &quot;Autoriser suppression&quot; permet de ne pas bloquer la supp
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation>Enregistrer les fichiers de log de façon permanente</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation>Lorsque cette option est activée et qu&apos;aucun autre système de log est configuré, les fichiers de logs sont écrits dans un dossier temporaire qui expire après quelques heures. Ce paramètre persiste après redémarrage du client.
+
+Les fichiers de log seront écrits dans %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Effacer</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Effacer la fenêtre de logs.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>S&amp;auvegarder</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Enregistrer le fichier de log sur le disque à des fins de débogage.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Enregistrer le fichier de log</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Erreur</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>Impossible d&apos;écrire dans le fichier de log %1</translation>
</message>
@@ -1520,12 +1690,12 @@ L&apos;option &quot;Autoriser suppression&quot; permet de ne pas bloquer la supp
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Erreur</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;Le fichier &apos;%1&apos;&lt;br/&gt;ne peut être ouvert en écriture.&lt;br/&gt;&lt;br/&gt;Le fichier de journalisation &lt;b&gt;ne peut pas&lt;/b&gt; être enregistré !&lt;/nobr&gt;</translation>
</message>
@@ -1533,27 +1703,27 @@ L&apos;option &quot;Autoriser suppression&quot; permet de ne pas bloquer la supp
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Nouvelle version disponible</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;Une nouvelle version du client %1 est disponible.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; est disponible au téléchargement. La version actuellement installée est %3.&lt;p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Ignorer cette version</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Ignorer pour cette fois</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Obtenir la mise à jour</translation>
</message>
@@ -1641,27 +1811,27 @@ L&apos;option &quot;Autoriser suppression&quot; permet de ne pas bloquer la supp
<translation>Limiter automatiquement</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Nom d&apos;hôte du serveur proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Nom d&apos;utilisateur pour le serveur proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Mot de passe pour le serveur proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>Proxy HTTP(S)</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>Proxy SOCKS5</translation>
</message>
@@ -1669,23 +1839,23 @@ L&apos;option &quot;Autoriser suppression&quot; permet de ne pas bloquer la supp
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>Créé à %1</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>Fermeture dans quelques secondes...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation>La requête %1 a échoué à %2</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation>&apos;%1&apos; sélectionné à %2</translation>
@@ -1694,32 +1864,32 @@ L&apos;option &quot;Autoriser suppression&quot; permet de ne pas bloquer la supp
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation>Erreur retournée par le serveur: &lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation>Il y a eu une erreur durant l&apos;accès au jeton de destination: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation>Impossible d&apos;analyser le fichier JSON récupéré sur le serveur : &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation>La réponse provenant du serveur ne contienne pas tous les champs attendus</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation>&lt;h1&gt;Erreur de connexion&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation>&lt;h1&gt;Mauvais utilisateur&lt;/h1&gt;&lt;p&gt;Vous êtes connecté avec l&apos;utilisateur &lt;em&gt;%1&lt;/em&gt;, mais vous devez vous connecter avec l&apos;utilisateur&lt;em&gt;%2&lt;/em&gt;. Veuillez vous déconnecter de %3 l&apos;autre onglet, puis &lt;a href=&apos;%4&apos;&gt; cliquez ici&lt;/a&gt; et connectez-vous en tant que l&apos;utilisateur &lt;/p&gt;%2</translation>
</message>
@@ -1727,59 +1897,59 @@ L&apos;option &quot;Autoriser suppression&quot; permet de ne pas bloquer la supp
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Une nouvelle mise à jour de %1 est disponible</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>Une mise à jour de %1 est sur le point d&apos;être installée.
L&apos;assistant de mise à jour peut vous demandez des autorisations supplémentaires afin de procéder à l&apos;installation.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>Téléchargement de la version %1. Merci de patienter...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>Impossible de télécharger la mise à jour. Veuillez la &lt;a href=&apos;%1&apos;&gt;télécharger manuellement&lt;/a&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Impossible de vérifier la présence de nouvelles mises à jour.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>%1 version %2 disponible. Redémarrez l&apos;application pour commencer la mise à jour.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>Une nouvelle version (%2) de %1 est disponible. Pour l&apos;installer, veuillez utiliser l&apos;outil de mise à jour du système.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Interrogation du serveur de mises à jour...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>L&apos;état du processus de mise à jour est inconnu. Impossible de vérifier la présence de mises à jour.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>Aucune mise à jour disponible. Votre installation est à jour.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Recherche de mise à jour</translation>
</message>
@@ -1787,43 +1957,43 @@ L&apos;assistant de mise à jour peut vous demandez des autorisations supplémen
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Connexion à %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Configurez les options de dossier local</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Connexion…</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>le dossier %1 &apos;%2&apos; est synchronisé avec le dossier local &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>Synchroniser le dossier &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Attention :&lt;/strong&gt; Le dossier local n&apos;est pas vide. Que voulez-vous faire ?&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Dossier de synchronisation local</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1882,15 +2052,20 @@ L&apos;assistant de mise à jour peut vous demandez des autorisations supplémen
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Connexion à %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation>Connectez vous sur votre navigateur</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation>Copier le lien vers le presse-papier</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1921,153 +2096,163 @@ Il est déconseillé de l&apos;utiliser.</translation>
<source>&amp;Next &gt;</source>
<translation>&amp;Suivant &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>URL invalide</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation>Impossible de charger le certificat. Peut-être un mauvais mot de passe ?</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Connecté avec succès à %1 : %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Échec de la connexion à %1 sur %2 :&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>Délai d&apos;attente dépassé lors de la connexion à %1 sur %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Tentative de connexion à %1 sur %2 ...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>La requête d&apos;authentification vers le serveur a été redirigée vers &apos;%1&apos;. L&apos;URL est erronée, le serveur est mal configuré.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>Une réponse non valide a été reçue suite à une requête WebDav authentifiée.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>Accès impossibe. Afin de vérifier l&apos;accès au serveur, &lt;a href=&quot;%1&quot;&gt;cliquez ici&lt;/a&gt; et connectez-vous au service avec votre navigateur web.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>URL invalide</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation>Le serveur a renvoyé l&apos;erreur suivante:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>Le dossier de synchronisation local %1 existe déjà, configuration de la synchronisation.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>Création du dossier local de synchronisation %1... </translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>ok</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>échoué.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>Impossible de créer le dossier local %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>Aucun dossier distant spécifié !</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Erreur : %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>création d&apos;un dossier sur ownCloud : %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>Le dossier distant %1 a été créé avec succès.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>Le dossier distant %1 existe déjà. Connexion.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>La création du dossier a généré le code d&apos;erreur HTTP %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>La création du dossier distant a échoué car les identifiants de connexion sont erronés !&lt;br/&gt;Veuillez revenir en arrière et vérifier ces derniers.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;La création du dossier distant a échoué, probablement parce que les informations d&apos;identification fournies sont fausses.&lt;/font&gt;&lt;br/&gt;Veuillez revenir en arrière et les vérifier.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>La création du dossier distant &quot;%1&quot; a échouée avec l&apos;erreur &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>Une synchronisation entre le dossier local %1 et le dossier distant %2 a été configurée.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Connecté avec succès à %1 !</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>La connexion à %1 n&apos;a pu être établie. Veuillez réessayer.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Echec du renommage du dossier</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>Impossible de supprimer et de sauvegarder le dossier parce que ce dossier ou un de ses fichiers est ouvert dans un autre programme. Veuillez fermer le dossier ou le fichier et ré-essayer, ou annuler l&apos;installation.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Dossier de synchronisation local %1 créé avec succès !&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2075,14 +2260,33 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>Assistant de Connexion %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Passer outre la configuration des dossiers</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation>Activer les fonctionnalités expérimentales ?</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation>Lorsque le mode « fichiers virtuels » est activé, aucun fichier ne sera téléchargé par défaut. À la place, un petit fichier « %1 » sera créé pour chaque fichier qui existe sur le serveur. Le contenu peut être téléchargé en exécutant ces fichiers ou en utilisant le menu contextuel.
+
+Il s&apos;agit d&apos;un nouveau mode expérimental. Si vous décidez de l&apos;utiliser, merci de bien vouloir remonter toute erreur qui surviendrait.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation>Activer le mode expérimental</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation>Rester sauf</translation>
</message>
</context>
<context>
@@ -2106,7 +2310,7 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>L&apos;URL interrogéé a renvoyé une réponse json non valide</translation>
</message>
@@ -2114,7 +2318,7 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>Erreur à l&apos;écriture des métadonnées dans la base de données</translation>
</message>
@@ -2122,47 +2326,47 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>Le fichier %1 ne peut pas être téléchargé en raison d&apos;un conflit sur le nom de fichier local. </translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation>Le téléchargement réduira l&apos;espace disque libre en dessous de la limite</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>Il y a moins de %1 d&apos;espace libre sur le disque</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>Le fichier a été supprimé du serveur</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>Le fichier n&apos;a pas pu être téléchargé intégralement.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation>Le fichier téléchargé est vide bien que le serveur indique que sa taille devrait être de %1.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>Le fichier %1 n&apos;a pas pu être sauvegardé en raison d&apos;un conflit sur le nom du fichier local !</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>Le fichier a changé depuis sa découverte</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>Erreur à l&apos;écriture des métadonnées dans la base de données</translation>
</message>
@@ -2170,12 +2374,12 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; Échec de la restauration : %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation>Un fichier ou un dossier a été supprimé d&apos;un partage en lecture seule, mais la restauration a échoué : %1</translation>
</message>
@@ -2183,22 +2387,22 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>impossible de supprimer le fichier %1. Erreur : %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>Attention, collision possible avec %1 à cause de la casse</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>Impossible de créer le dossier %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>Erreur à l&apos;écriture des métadonnées dans la base de données</translation>
</message>
@@ -2206,17 +2410,17 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>Erreur lors de la suppression de &apos;%1&apos; : %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>Impossible de supprimer le dossier &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>Impossible de supprimer %1 à cause d&apos;un conflit local de nom de fichier</translation>
</message>
@@ -2224,13 +2428,13 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>Le fichier %1 ne peut pas être renommé en %2 à cause d&apos;un conflit local de nom de fichier</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>Erreur à l&apos;écriture des métadonnées dans la base de données</translation>
</message>
@@ -2238,12 +2442,7 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>Le fichier a été supprimé d&apos;un partage en lecture seule. Il a été restauré.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>Le code HTTP retourné par le serveur n&apos;est pas valide. La valeur attendue est 204 mais la valeur reçue est &quot;%1 %2&quot;.</translation>
</message>
@@ -2251,12 +2450,12 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Le code HTTP retourné par le serveur n&apos;est pas valide. La valeur attendue est 201 mais la valeur reçue est &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>Erreur à l&apos;écriture des métadonnées dans la base de données</translation>
</message>
@@ -2264,28 +2463,13 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Ce dossier ne doit pas être renommé. Il sera renommé avec son nom original.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Le nom de ce dossier ne doit pas être changé. Veuillez le renommer en Shared.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>Le fichier a été renommé mais appartient à un partage en lecture seule. Le fichier original a été restauré.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Le code HTTP retourné par le serveur n&apos;est pas valide. La valeur attendue est 201 mais la valeur reçue est &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>Erreur à l&apos;écriture des métadonnées dans la base de données</translation>
</message>
@@ -2293,33 +2477,33 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation>Impossible d&apos;envoyer le fichier %1 car un autre fichier de même nom existe, différant seulement par la casse.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Fichier supprimé</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>Fichier local modifié pendant la synchronisation. Elle va reprendre. </translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>Fichier local modifié pendant la synchronisation.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation>Le téléversement de %1 amène un dépassement de quota pour le dossier</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>Erreur à l&apos;écriture des métadonnées dans la base de données</translation>
</message>
@@ -2327,27 +2511,27 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>Fichier local supprimé pendant la synchronisation.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>Fichier local modifié pendant la synchronisation.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation>Le serveur a retourné un code inattendu (%1)</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation>L&apos;identifiant de fichier est manquant sur le serveur</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation>L&apos;information Etag de modification de fichier est manquante sur le serveur</translation>
</message>
@@ -2355,27 +2539,22 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>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 conflit.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>URL de sondage manquante</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>Fichier local supprimé pendant la synchronisation.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>Fichier local modifié pendant la synchronisation.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation>Le serveur n&apos;a pas confirmé la réception du dernier morceau. (Aucun e-tag n&apos;était présent).</translation>
</message>
@@ -2393,42 +2572,47 @@ Il est déconseillé de l&apos;utiliser.</translation>
<translation>TextLabel</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Ouvrir dans le navigateur web</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Heure</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Fichier</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Dossier</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Action</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Taille</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>Historique des opérations de synchronisation locale</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Copier</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Copier la liste d&apos;activités dans le presse-papier</translation>
</message>
@@ -2469,7 +2653,7 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Sélectionner le contenu à synchroniser</translation>
</message>
@@ -2477,33 +2661,33 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Chargement…</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation>Désélectionnez les sous-dossiers distants que vous ne souhaitez pas synchroniser.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Nom</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Taille</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>Aucun sous-dossier sur le serveur.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation>Une erreur est survenue lors du chargement de la liste des sous-dossiers.</translation>
</message>
@@ -2524,22 +2708,22 @@ Il est déconseillé de l&apos;utiliser.</translation>
<translation>Paramètres</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Activité</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Paramètres</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Réseau</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Compte</translation>
</message>
@@ -2547,28 +2731,28 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Activité</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Paramètres</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Réseau</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Compte</translation>
</message>
@@ -2596,42 +2780,42 @@ Il est déconseillé de l&apos;utiliser.</translation>
<translation>Chemin ownCloud :</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>Partage %1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Dossier: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>Le serveur ne prend pas en charge le partage</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation>Récupération des permissions de partage maximales possibles depuis le serveur...</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Le fichier ne peut pas être partagé car il a été partagé sans permission de repartage.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>Utilisateurs et Groupes</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>Liens publics</translation>
</message>
@@ -2644,7 +2828,17 @@ Il est déconseillé de l&apos;utiliser.</translation>
<translation>Partager NewDocument.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation>Téléversement seulement (Glisser le Fichier)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation>Recevoir les fichiers des autres sans révéler le contenu du dossier.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>TextLabel</translation>
</message>
@@ -2674,19 +2868,24 @@ Il est déconseillé de l&apos;utiliser.</translation>
<translation>Définir le mot de passe</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
- <translation>Propriétés du lien :</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
+ <translation>Les bénéficiaires peuvent voir ou télécharger le contenu.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>Montrer la liste des fichiers</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation>Télécharger / Voir</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Permettre la modification</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation>Télécharger / Voir / Téléverser</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation>Les bénéficiaires peuvent voir, télécharger, modifier, supprimer et téléverser le contenu.</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2694,96 +2893,96 @@ Il est déconseillé de l&apos;utiliser.</translation>
<translation>Quiconque dispose du lien a accès aux fichiers/dossiers</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>Protéger par mot de p&amp;asse</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Protégé par mot de passe</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Le fichier ne peut pas être partagé car il a été partagé sans permission de repartage.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation>Les partages par lien ont été désactivés</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation>Créer une lien de partage public</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Supprimer</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation>Ouvrir le lien dans le navigateur</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation>Copier le lien vers le presse-papier</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation>Copier le lien vers le presse-papier (téléchargement direct)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Envoyer le lien par email</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation>Envoyer le lien par courriel (téléchargement direct)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation>J&apos;ai partagé %1 avec vous</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation>Confirmer la suppression du partage par lien</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation>&lt;p&gt;Voulez-vous vraiment supprimer le partage par lien public&lt;i&gt;%1&lt;/i&gt;?
&lt;p&gt;Note: Cette action ne peut être annulée.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Anuler</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation>Lien public</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation>Supprimer le partage par lien</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>Le p&amp;artage public nécessite un mot de passe</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Veuillez choisir un mot de passe</translation>
</message>
@@ -2806,32 +3005,32 @@ Il est déconseillé de l&apos;utiliser.</translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Vous pouvez diriger quelqu&apos;un vers ce fichier ou dossier partagé &lt;a href=&quot;private link menu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;en lui adressant un lien privé&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation>Cet élément n&apos;est partagé avec aucun utilisateur ou groupe</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation>Ouvrir le lien dans le navigateur</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation>Copier le lien vers le presse-papier</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Envoyer le lien par email</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>Aucun résultat pour &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation>J&apos;ai partagé quelque chose avec vous</translation>
</message>
@@ -2844,37 +3043,38 @@ Il est déconseillé de l&apos;utiliser.</translation>
<translation>Form</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>TextLabel</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>peut modifier</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>peut partager</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>création</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>modification</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>suppression</translation>
</message>
@@ -2918,143 +3118,176 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>Partager avec %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation>J&apos;ai partagé quelque chose avec vous</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation>partager</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation>Copier le lien privé vers le presse-papier</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation>Envoyer le lien privé par courriel...</translation>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation>Le repartage de ce fichier n&apos;est pas permis</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation>Copier le lien public dans le presse-papier</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Ouvrir dans le navigateur web</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Détails du certificat&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Nom commun (CN) :</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>Noms alternatifs du sujet :</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Organisation (O) :</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Unité d&apos;organisation (OU) :</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>État/Région :</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>Pays :</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Numéro de série :</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Émetteur&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Émetteur :</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Émis le :</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Expire le :</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Empreintes numériques&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256 :</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1 :</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;Note :&lt;/b&gt; Ce certificat a été approuvé manuellement&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (auto-signé)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>Cette connexion est chiffrée en utilisant %1 bit %2.
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation>Identifiants/tickets de sessions SSL non pris en charge</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Informations du certificat :</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>Cette connexion n&apos;est PAS sécurisée car elle n&apos;est pas chiffrée.
@@ -3142,305 +3375,270 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Succès.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>CSync a échoué à charger du fichier journal. Le fichier journal est corrompu.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;Le module additionnel %1 pour csync n&apos;a pas pu être chargé.&lt;br/&gt;Merci de vérifier votre installation !&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>Erreur fatale CSync : mauvais paramètre.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>Erreur CSync lors de l&apos;opération de mise à jour</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>Erreur CSync lors de l&apos;opération de réconciliation</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync n&apos;a pu s&apos;authentifier auprès du proxy.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSync n&apos;a pu trouver le proxy ou serveur auquel se connecter.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync n&apos;a pu s&apos;authentifier auprès du serveur %1.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync n&apos;a pu établir une connexion au réseau.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>Le délai d&apos;attente de la connexion réseau a été dépassé.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>Une erreur de transmission HTTP s&apos;est produite.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation>Le dossier monté est temporairement indisponible sur le serveur</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>Une erreur est survenue lors de l&apos;ouverture d&apos;un dossier</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>Erreur lors de la lecture du dossier.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation>%1 (ignoré à cause d&apos;une précédente erreur, nouvel essai dans %2)</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>Le fichier ou dossier a été ignoré car il est masqué.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation>La hiérarchie du dossier est trop profonde</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation>Conflit : La version du serveur a été téléchargée, la version locale renommée et non téléversée.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation>Seulement %1 disponibles, il faut au moins %2 pour démarrer</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation>Impossible d&apos;accéder ou de créer une base de données locale de synchronisation. Assurez vous de disposer des droits d&apos;écriture dans le dossier de synchronisation.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation>Non autorisé car vous n&apos;avez pas la permission d&apos;ajouter un dossier parent</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation>Non autorisé car vous n&apos;avez pas la permission d&apos;ajouter des fichiers dans ce dossier</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation>L&apos;espace disque est faible : les téléchargements qui amèneraient à réduire l&apos;espace libre en dessous de %1 ont été ignorés.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation>Il n&apos;y a pas suffisamment d’espace disponible sur le serveur pour certains téléversements.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync : Aucun espace disponible sur le serveur %1.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>Erreur CSync inconnue.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Interrompu par l&apos;utilisateur</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>CSync n&apos;a pas pu accéder à</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
- <translation>CSync n’a pu charger ou créer le fichier de journalisation. Veuillez vérifier que vous possédez les droits en lecture/écriture dans le dossier de synchronisation local.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation>Autorisation refusée.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
- <translation>CSync a échoué en raison d&apos;un refus de permission non pris en charge.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
+ <translation>Fichier ou dossier non trouvé :</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
- <translation>CSync a tenté de créer un dossier déjà présent.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>Le service est temporairement indisponible.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>L&apos;accès est interdit</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>Une erreur interne numéro %1 est survenue.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>Les liens symboliques ne sont pas pris en charge par la synchronisation.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>Le fichier est présent dans la liste des fichiers à exclure.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation>Les noms de fichier se terminant par un point ne sont pas pris en charge sur votre système.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation>Les noms de fichier contenant le caractère &apos;%1&apos; ne sont pas pris en charge sur votre système.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation>Le nom du fichier est réservé sur votre système.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation>Le nom du fichier se fini par des espaces.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>Le nom de fichier est trop long.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation>Le nom de fichier ne peut pas être encodé sur votre système.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation>conflit non résolu.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>Stat échoué.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>L&apos;encodage du nom de fichier n&apos;est pas valide</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>Caractères non valides. Veuillez renommer &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation>Impossible de lire la liste noire de la base de données locale</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation>Impossible de lire le journal de synchronisation.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>Impossible d&apos;ouvrir le journal de synchronisation</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>Le nom de fichier contient au moins un caractère non valable</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>Ignoré en raison de la liste noire &quot;Sélectionner le contenu à synchroniser&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation>Non autorisé car vous n&apos;avez pas la permission d&apos;ajouter des sous-dossiers dans ce dossier</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>Non autorisé à envoyer ce fichier car il est en lecture seule sur le serveur. Restauration</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>Non autorisé à supprimer. Restauration</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>Fichiers locaux et dossier partagé supprimés.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>Déplacement non autorisé, élément restauré</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>Déplacement non autorisé car %1 est en mode lecture seule</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>la destination</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>la source</translation>
</message>
@@ -3464,17 +3662,17 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Version %1. Pour plus d&apos;information, visitez &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation>&lt;p&gt;Copyright ownCloud, Inc.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;Distribué par %1 et sous licence GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 et le logo %2 sont des marques enregistrées de %1 aux Etats-Unis, dans d&apos;autres pays, ou les deux.&lt;/p&gt;</translation>
</message>
@@ -3505,81 +3703,81 @@ Il est déconseillé de l&apos;utiliser.</translation>
<translation>Veuillez vous connecter</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Dossier %1 : %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Aucun dossier à synchroniser n&apos;est configuré</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Ouvrir dans le navigateur web</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Connexion...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Se déconnecter</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Modifications récentes</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Recherche de modifications dans &apos;%1&apos;</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Dossiers configurés</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Ouvrir le dossier local &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Ouvrir %1 dans le navigateur</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Statut inconnu</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Paramètres...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Toutes les modifications...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Aide...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>Quitter %1</translation>
</message>
@@ -3594,11 +3792,6 @@ Il est déconseillé de l&apos;utiliser.</translation>
<translation>Version du Serveur non prise en charge</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation>Le serveur sur le compte %1 fonctionne avec une version ancienne et non-supportée %2. Utiliser ce client avec des versions non-supportées du serveur n&apos;est pas testé et est potentiellement dangereux. Procédez à vos risques et périls.</translation>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Déconnecté</translation>
@@ -3630,116 +3823,129 @@ Il est déconseillé de l&apos;utiliser.</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation>La synchronisation est en pause</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation>Conflits non résolus</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation>Erreur durant la synchronisation</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation>Aucun dossier de synchronisation configuré</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation>Relancer tous les dossiers </translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>Mettre en pause tous les dossiers</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>Relancer toutes les synchronisations</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>Relancer la synchronisation</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>Mettre en pause toutes les synchronisations</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>Mettre en pause la synchronisation </translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Se déconnecter de tous les comptes</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Se connecter à tous les comptes...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>Nouveau compte…</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>À propos de %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>Plantage maintenant</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Aucun élément synchronisé récemment</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation>Vérification des changements distants &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation>Vérification des changements locaux &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Synchronisation de %1 sur %2 (%3 restantes)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation>Synchronisation %1 sur %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Synchronisation de %1 (%2 restantes)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>Synchronisation de %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>À jour</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Version %2. Pour plus d&apos;informations, rendez-vous &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Pour les incidents connus et de l&apos;aide, cliquez ici: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, et les autres.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Edité sous la licence GNU General Public (GPL) Version 2.0&lt;br/&gt;ownCloud et le logo ownCloud sont enregistrés sous la marque d&apos;ownClouD GmbH aux Etats-Unis, autres pays ou les deux.&lt;/p&gt;</translation>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3751,9 +3957,9 @@ Il est déconseillé de l&apos;utiliser.</translation>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>TextLabel</translation>
</message>
@@ -3789,11 +3995,22 @@ Il est déconseillé de l&apos;utiliser.</translation>
<translation>Demander confirmation avant de synchroniser des stockages externes </translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Sélectionner le contenu à synchroniser</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>&amp;Dossier local</translation>
@@ -3810,11 +4027,16 @@ Il est déconseillé de l&apos;utiliser.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>S&amp;ynchroniser tout le contenu depuis le serveur</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Message d&apos;état</translation>
</message>
@@ -3851,8 +4073,8 @@ Il est déconseillé de l&apos;utiliser.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
- <translation>Une erreur s&apos;est produite durant la connexion. Veuillez réessayer plus tard.</translation>
+ <source>An error occurred while connecting. Please try again.</source>
+ <translation>Une erreur s&apos;est produite pendant la connexion. Veuillez réessayer.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="56"/>
@@ -4031,7 +4253,7 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;Construit à partir de la révision Git &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; du %3, %4 en utilisant Qt %5, %6.&lt;/small&gt;&lt;p&gt;</translation>
</message>
@@ -4129,52 +4351,52 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Statut indéfini</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Synchronisation en attente</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>Synchronisation en cours</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Synchronisation réussie</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Synchronisation terminée avec succès, certains fichiers ont été ignorés.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Erreur de synchronisation</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Erreur de configuration</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Préparation à la synchronisation</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Annulation...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>La synchronisation est en pause</translation>
</message>
@@ -4182,22 +4404,22 @@ Il est déconseillé de l&apos;utiliser.</translation>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation>Impossible de démarrer le navigateur</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation>Une erreur est survenue au lancement du navigateur pour visiter l&apos;adresse %1. Il est possible qu&apos;aucun navigateur par défaut ne soit configuré.</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation>Impossible d&apos;ouvrir le client de messagerie</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation>Il y a eu une erreur lors du lancement du client de messagerie pour créer un nouveau message. Peut-être qu&apos;aucun client de messagerie n&apos;est configuré ?</translation>
</message>
diff --git a/translations/client_gl.ts b/translations/client_gl.ts
index 0315e96a1..ea39c9825 100644
--- a/translations/client_gl.ts
+++ b/translations/client_gl.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="gl" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,17 +95,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Esgotouse o tempo de conexión</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation type="unfinished"/>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Cancelar</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Conta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Escolla que sincronizar</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Forzar a sincronización</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>Reiniciar a sincronización</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>Retirar a conexión da sincronización do cartafol</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Non foi posíbel crear o cartafol</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;Non foi posíbel crear o cartafol local &lt;i&gt;%1&lt;/i&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>Confirmar a retirada da conexión da sincronización do cartafol</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>Retirar a conexión da sincronización do cartafol</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Sincronización en proceso</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>Estase a realizar a sincronización.&lt;br/&gt;Quere interrompela e rematala?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 en uso</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 como &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>Este servidor da versión %1 é vello e non ten soporte! Vostede verá o que fai.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Conectado a %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>O servidor %1 non está dispoñíbel temporalmente.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>Desconectado de %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>Non hai conexión con %1 en %2.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Acceder</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>Hai cartafoles que non se sincronizaron por ser demasiado grandes:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>Hai cartafoles que non se sincronizaron porque son almacenamentos externos:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation>Hai cartafoles que non se sincronizaron porque son demasiado grandes ou almacenamentos externos:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Confirme a retirada da conta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;De verdade quere retirar a conexión a conta &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Aviso:&lt;/b&gt; Esto &lt;b&gt;non&lt;/b&gt; eliminará ningún ficheiro.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Retirar conexión</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Abrir o cartafol</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Desconectar</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Continuar coa sincronización</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Por en pausa a sincronización</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Quere realmente deixar de sincronizar o cartafol &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Aviso:&lt;/b&gt; Esto &lt;b&gt;non&lt;/b&gt; eliminará ningún ficheiro.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1 (%3%) de %2 en uso. Algúns cartafoles, incluíndo os compartidos e os montados en rede, poderían ter diferentes límites.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%1 de %2 en uso</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Actualmente non hai dispoñíbel ningunha información sobre o uso do almacenamento.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>Non se configurou a conexión %1.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Desconectado</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Desconectado</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Conectado</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Servizo non dispoñíbel</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Produciuse un erro de rede</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Produciuse un erro de configuración</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Estado da conta descoñecido</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Actividade do servidor</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Protocolo de sincronización</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>Non sincronizado</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>Non sincronizado (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>A lista de actividade do servidor copiouse no portapapeis.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>A lista de actividade de sincronización foi copiada ao portapapeis.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>A lista de elementos non sincronizados foi copiada ao portapapeis.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Copiado no portapapeis.</translation>
</message>
@@ -469,47 +488,47 @@
<translation>Etiqueta de texto</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Actividades do servidor</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Copiar</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Copiar a lista da actividade no portapapeis.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Acción requerida: Notificacións</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;A conta %1 non ten as actividades habilitadas.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation type="unfinished"/>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Saír</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Continuar</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation type="unfinished"/>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>Non hai configurada ningunha conta ownCloud </translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>O servidor configurado para este cliente é moi antigo</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Actualice ao último servidor e reinicie o cliente.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Produciuse un erro de autenticación: Ou o nome de usuario ou o contrasinal poderían ser erróneos</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>caducidade</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>As credenciais fornecidas non son correctas</translation>
</message>
@@ -637,131 +681,158 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Interrompido polo usuario</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>O cartafol local %1 non existe.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 non é lexíbel.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 foi retirado satisfactoriamente.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 foi descargado satisfactoriamente.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 foi enviado satisfactoriamente.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 foi renomeado satisfactoriamente a %2</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 foi movido satisfactoriamente a %2</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 non puido sincronizarse por mor dun erro. Vexa os detalles no rexistro.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Actividade de sincronización</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>Non foi posíbel ler o ficheiro de exclusión do sistema</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -769,46 +840,46 @@ If you decide to delete the files, they will be unavailable to you, unless you a
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Retirar todos os ficheiros?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Retirar todos os ficheiros</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Manter os ficheiros</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation type="unfinished"/>
</message>
@@ -816,115 +887,105 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>Non foi posíbel restabelecer o estado do cartafol</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>Atopouse un rexistro de sincronización antigo en «%1» máis non pode ser retirado. Asegúrese de que non o está a usar ningunha aplicación.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation>(copia de seguranza)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation>(copia de seguranza %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Estado sen definir.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Preparando para sincronizar.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>Estase sincronizando.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>A última sincronización fíxose correctamente.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>A última sincronización fíxose correctamente, mais con algún aviso en ficheiros individuais.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>A última sincronización fíxose correctamente.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Erro de configuración.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Interrompido polo usuario.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>Sincronización en pausa.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (sincronización en pausa)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>Non seleccionou ningún cartafol correcto!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Vostede non ten permiso para escribir neste cartafol!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -934,7 +995,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation type="unfinished"/>
</message>
@@ -969,7 +1030,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Desconectado</translation>
</message>
@@ -984,115 +1045,133 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>Sincronizando %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>descargar %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>enviar %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 de %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 de %2, ficheiro %3 de %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>ficheiro %1 de %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation type="unfinished"/>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation type="unfinished"/>
</message>
@@ -1100,17 +1179,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Prema para escoller un cartafol local para sincronizar.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Escriba a ruta ao cartafol local.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Escolla o cartafol de orixe</translation>
</message>
@@ -1118,60 +1197,68 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Crear un cartafol remoto</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>Introduza o nome do novo cartafol que se creará a seguir «%1»:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>Creouse correctamente o cartafol en %1.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>Non foi posíbel facer a autenticación accedendo a %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>Non foi posíbel crear o cartafol en %1. Compróbeo manualmente.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Escolla isto para sincronizar toda a conta</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Este cartafol xa está sincronizado.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Xa está a sincronizar &lt;i&gt;%1&lt;/i&gt;, é o cartafol pai de &lt;i&gt;%2&lt;/i&gt;.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Aviso:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Aviso:&lt;/b&gt; </translation>
</message>
@@ -1179,22 +1266,22 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>Non se recibiu a «E-Tag» do servidor, comprobe o proxy e/ou a pasarela</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>Recibiuse unha «E-Tag» diferente para continuar. Tentándoo outra vez.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>O servidor devolveu un intervalo de contidos estragado</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Esgotouse o tempo de conexión</translation>
</message>
@@ -1217,23 +1304,38 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Para a área de notificación</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Avanzado</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation type="unfinished"/>
</message>
@@ -1253,31 +1355,67 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
- <source>S&amp;how crash reporter</source>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>Sobre</translation>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
+ <source>S&amp;how crash reporter</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
+ <location filename="../src/gui/generalsettings.ui" line="53"/>
<source>Updates</source>
<translation>Actualizacións</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>&amp;Reiniciar e actualizar</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1345,34 +1483,34 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Retirar</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Non foi posíbel abrir o ficheiro</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>Non é posíbel escribir os cambios en «%1».</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Engadir o patrón a ignorar</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Engadir un novo patrón a ignorar:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Esta entrada é fornecida polo sistema en «%1» e non pode ser modificado nesta vista.</translation>
</message>
@@ -1402,7 +1540,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Cartafol</translation>
</message>
@@ -1417,35 +1555,45 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Copiar</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Hora</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Ficheiro</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1471,36 +1619,48 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Limpar</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Limpar a saída de rexistro.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>&amp;Gardar</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Gardar o ficheiro de rexistro a un ficheiro no disco para depuración.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Gardar o ficheiro de rexistro</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Erro</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>Non se puido escribir no ficheiro de rexistro %1</translation>
</message>
@@ -1508,12 +1668,12 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Erro</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;O ficheiro «%1»&lt;br/&gt; non se pode abrir para escritura.&lt;br/&gt;&lt;br/&gt;A saída do rexistro &lt;b&gt;non&lt;/n&gt; se pode gardar!&lt;/nobr&gt;</translation>
</message>
@@ -1521,27 +1681,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Hai dispoñíbel unha nova versión</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;Hai dispoñíbel unha nova versión do cliente %1.&lt;/p&gt;&lt;p&gt;Pode descargar a versión &lt;b&gt;%2&lt;/b&gt;. A versión instalada é a %3&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Omitir esta versión</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Omitir polo de agora</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Obter a actualización</translation>
</message>
@@ -1629,27 +1789,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation>Limitar automáticamente</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Nome de host para o servidor proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Nome de usuario para o servidor proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Contrasinal para o servidor proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>Proxy HTTP(S)</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>Proxy SOCKS5</translation>
</message>
@@ -1657,23 +1817,23 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation type="unfinished"/>
@@ -1682,32 +1842,32 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -1715,59 +1875,59 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Preparada a nova actualización %1</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>Está a piques de instalarse unha nova actualización para %1. O proceso de
actualización pode pedir privilexios adicionais durante o procedemento.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>Descargando a versión %1. Agarde...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>Non foi posíbel descargar a actualización. Prema &lt;a href=&apos;%1&apos;&gt;aquí&lt;/a&gt; para descargar manualmente a actualización.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Non foi posíbel comprobar se hai novas actualizacións.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Comprobando o servidor de actualizacións...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>O estado da actualización é descoñecido: non se comprobaron as actualizacións.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>Non hai actualizacións dispoñíbeis. A instalación xa está na versión máis recente</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Comprobar actualizacións</translation>
</message>
@@ -1775,43 +1935,43 @@ actualización pode pedir privilexios adicionais durante o procedemento.</transl
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Conectar con %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Estabelecer as opcións do cartafol local</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Conectar...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>O cartafol %1 «%2» está sincronizado co cartafol local «%3»</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Sincronización do cartafol local</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1870,15 +2030,20 @@ actualización pode pedir privilexios adicionais durante o procedemento.</transl
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Conectar con %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1909,153 +2074,163 @@ Recomendámoslle que non o use.</translation>
<source>&amp;Next &gt;</source>
<translation>&amp;Seguinte &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Conectouse correctamente a %1: %2 versión %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Non foi posíbel conectar con %1 en %2:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>Esgotouse o tempo tentando conectarse a %1 en %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Tentando conectarse a %1 en %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>A solicitude autenticada no servidor foi redirixida a «%1», O URL é incorrecto, o servidor está mal configurado.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>Deuse unha resposta incorrecta a unha solicitude de WebDAV autenticada</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>Acceso prohibido polo servidor. Para comprobar que dispón do acceso axeitado, &lt;a href=&quot;%1&quot;&gt;prema aquí&lt;/a&gt; para acceder ao servizo co seu navegador.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>O cartafol de sincronización local %1 xa existe. Configurándoo para a sincronización.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>Creando un cartafol local de sincronización %1...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>aceptar</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>fallou.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>Non foi posíbel crear o cartafol local %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>Non foi especificado o cartafol remoto!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Erro: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>creando o cartafol en ownCloud: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>O cartafol remoto %1 creouse correctamente.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>O cartafol remoto %1 xa existe. Conectándoo para a sincronización.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>A creación do cartafol resultou nun código de erro HTTP %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>A creación do cartafol remoto fracasou por por de seren incorrectas as credenciais!&lt;br/&gt;Volva atrás e comprobe as súas credenciais.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;A creación do cartafol remoto fallou probabelmente debido a que as credenciais que se deron non foran as correctas.&lt;/font&gt;&lt;br/&gt;Volva atrás e comprobe as súas credenciais.&lt;/p&gt; </translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>Produciuse un fallo ao crear o cartafol remoto %1 e dou o erro &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>Estabeleceuse a conexión de sincronización de %1 ao directorio remoto %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Conectou satisfactoriamente con %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>Non foi posíbel estabelecer a conexión con %1. Compróbeo de novo.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Non foi posíbel renomear o cartafol</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>Non é posíbel retirar e facer unha copia de seguranza do cartafol, xa que o cartafol ou un ficheiro está aberto noutro programa Peche o cartafol ou o ficheiro e ténteo de novo, ou cancele a acción.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;O cartafol local de sincronización %1 creouse correctamente!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2063,14 +2238,31 @@ Recomendámoslle que non o use.</translation>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>Asistente de conexión %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Omitir a configuración dos cartafoles</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2094,7 +2286,7 @@ Recomendámoslle que non o use.</translation>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>O URL requirido devolveu unha resposta JSON incorrecta</translation>
</message>
@@ -2102,7 +2294,7 @@ Recomendámoslle que non o use.</translation>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2110,47 +2302,47 @@ Recomendámoslle que non o use.</translation>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>Non é posíbel descargar o ficheiro %1 por mor dunha colisión co nome dun ficheiro local!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>O ficheiro vai seren eliminado do servidor</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>Non foi posíbel descargar completamente o ficheiro.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>Non foi posíbel gardar o ficheiro %1 por mor dunha colisión co nome dun ficheiro local!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>O ficheiro cambiou após seren atopado</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2158,12 +2350,12 @@ Recomendámoslle que non o use.</translation>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; Fallou a restauración: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation type="unfinished"/>
</message>
@@ -2171,22 +2363,22 @@ Recomendámoslle que non o use.</translation>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>Atención, posíbel colisión entre maiúsculas e minúsculas con %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2194,17 +2386,17 @@ Recomendámoslle que non o use.</translation>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>Produciuse un erro ao retirar «%1»: %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>Non é posíbel retirar %1 por mor dunha colisión co nome dun ficheiro local</translation>
</message>
@@ -2212,13 +2404,13 @@ Recomendámoslle que non o use.</translation>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>Non é posíbel renomear o ficheiro %1 como %2 por mor dunha colisión co nome dun ficheiro local</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2226,12 +2418,7 @@ Recomendámoslle que non o use.</translation>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>Foi retirado un ficheiro desde unha compartición de só lectura. Foi restaurado.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>O servidor devolveu código HTTP incorrecto. Agardábase 204, mais recibiuse «%1 %2».</translation>
</message>
@@ -2239,12 +2426,12 @@ Recomendámoslle que non o use.</translation>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>O servidor devolveu código HTTP incorrecto. Agardábase 201, mais recibiuse «%1 %2».</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2252,28 +2439,13 @@ Recomendámoslle que non o use.</translation>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Non é posíbel renomear este cartafol. Non se lle cambiou o nome, mantense o orixinal.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Non é posíbel renomear este cartafol. Devólvalle o nome ao compartido.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>O ficheiro foi renomeado mais é parte dunha compartición de só lectura. O ficheiro orixinal foi restaurado.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>O servidor devolveu código HTTP incorrecto. Agardábase 201, mais recibiuse «%1 %2».</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2281,33 +2453,33 @@ Recomendámoslle que non o use.</translation>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Ficheiro retirado</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>O ficheiro local cambiou durante a sincronización. Retomase.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>O ficheiro local cambiou durante a sincronización.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2315,27 +2487,27 @@ Recomendámoslle que non o use.</translation>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>O ficheiro local retirarase durante a sincronización.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>O ficheiro local cambiou durante a sincronización.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation type="unfinished"/>
</message>
@@ -2343,27 +2515,22 @@ Recomendámoslle que non o use.</translation>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>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.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>Non se atopa o URL requirido</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>O ficheiro local retirarase durante a sincronización.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>O ficheiro local cambiou durante a sincronización.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation type="unfinished"/>
</message>
@@ -2381,42 +2548,47 @@ Recomendámoslle que non o use.</translation>
<translation>Etiqueta de texto</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Abrir no navegador</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Hora</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Ficheiro</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Cartafol</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Acción</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Tamaño</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Copiar</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Copiar a lista da actividade no portapapeis.</translation>
</message>
@@ -2457,7 +2629,7 @@ Recomendámoslle que non o use.</translation>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Escolla que sincronizar</translation>
</message>
@@ -2465,33 +2637,33 @@ Recomendámoslle que non o use.</translation>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Cargando ...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Nome</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Tamaño</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>Actualmente non hai subcartafoles no servidor.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation type="unfinished"/>
</message>
@@ -2512,22 +2684,22 @@ Recomendámoslle que non o use.</translation>
<translation>Axustes</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Actividade</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Xeral</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Rede</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Conta</translation>
</message>
@@ -2535,28 +2707,28 @@ Recomendámoslle que non o use.</translation>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Actividade</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Xeral</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Rede</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Conta</translation>
</message>
@@ -2584,42 +2756,42 @@ Recomendámoslle que non o use.</translation>
<translation>Ruta ao ownCloud:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>Compartindo %1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Cartafol: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Non é posíbel compartir o ficheiro, xa que foi compartido sen permisis para compartir.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>Usuarios e grupos</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation type="unfinished"/>
</message>
@@ -2632,7 +2804,17 @@ Recomendámoslle que non o use.</translation>
<translation>Compartir NovoDocumento.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>Etiqueta de texto</translation>
</message>
@@ -2662,19 +2844,24 @@ Recomendámoslle que non o use.</translation>
<translation>Estabelecer o contrasinal</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Permitir a edición</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2682,95 +2869,95 @@ Recomendámoslle que non o use.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>Contr&amp;asinal de protección</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Protexido con contrasinal</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Non é posíbel compartir o ficheiro, xa que foi compartido sen permisis para compartir.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Eliminar</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Enviar a ligazón por correo</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Cancelar</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>A comp&amp;artición pública precisa de contrasinal </translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Estabeleza o contrasinal</translation>
</message>
@@ -2793,32 +2980,32 @@ Recomendámoslle que non o use.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Enviar a ligazón por correo</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
@@ -2831,37 +3018,38 @@ Recomendámoslle que non o use.</translation>
<translation>Formulario</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>Etiqueta de texto</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>pode editar</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>pode compartir</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>crear</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>cambio</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>eliminar</translation>
</message>
@@ -2905,143 +3093,176 @@ Recomendámoslle que non o use.</translation>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>Compartir con %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Abrir no navegador</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Detalles do certificado&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Nome común (CN):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>Nomes alternativos do titular:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Organización (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Unidade organizativa (OU):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Estado/provincia:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>País</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Serie:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Emisor&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Emisor:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Emitido o:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Caduca o:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Pegadas dixitais&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;Nota:&lt;/b&gt; Este certificado foi aprobado manualmente&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (autoasinada)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>Esta conexión está cifrada empregando %1 a %2 bits.
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Información do certificado:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>Esta conexión non é segura e non está cifrada.
@@ -3129,305 +3350,270 @@ Recomendámoslle que non o use.</translation>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Correcto.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>Produciuse un fallo en CSync ao cargar o ficheiro de rexistro. O ficheiro de rexistro está estragado.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;Non foi posíbel cargar o engadido %1 para CSync.&lt;br/&gt;Verifique a instalación!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>Produciuse un erro fatal de parámetro CSync.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>Produciuse un fallo ao procesar o paso de actualización de CSync.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>Produciuse un fallo ao procesar o paso de reconciliación de CSync.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync non puido autenticarse no proxy.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSYNC no puido atopar o servidor proxy.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync non puido autenticarse no servidor %1.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSYNC no puido conectarse á rede.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>Excedeuse do tempo de espera para a conexión á rede.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>Produciuse un erro na transmisión HTTP.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: Non hai espazo dispoñíbel no servidor %1.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>Produciuse un erro non especificado de CSync</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Interrompido polo usuario</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>Produciuse un fallo ao reservar memoria para CSync.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>O servizo está temporalmente inaccesíbel.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>Produciuse un erro interno número %1.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>As ligazóns simbolicas non son admitidas nas sincronizacións</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>O ficheiro está na lista de ignorados.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>O nome de ficheiro é longo de máis.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>Fallou a obtención de estatísticas.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>O nome de ficheiro codificado non é correcto</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>Caracteres incorrectos, déalle outro nome a «%1»</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>Non foi posíbel abrir o rexistro de sincronización</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>O nome de ficheiro contén algún carácter incorrecto</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>Ignorado por mor da lista negra de «escolla que sincronizar»</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>Non está permitido o envío xa que o ficheiro é só de lectura no servidor, restaurando</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>Non está permitido retiralo, restaurando</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>Retirados os ficheiros locais e o cartafol compartido.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>Nos está permitido movelo, elemento restaurado</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>Bon está permitido movelo xa que %1 é só de lectura</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>o destino</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>a orixe</translation>
</message>
@@ -3451,17 +3637,17 @@ Recomendámoslle que non o use.</translation>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Versión %1. Para obter máis información visite &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;Distribuído por %1 e licenciado baixo a Licenza Pública Xeral (GPL) GNU Versión 2.0.&lt;br/&gt;Os logotipos %2 e %2 son marcas rexistradas de %1 nos Estados Unidos de Norte América e/ou outros países.&lt;/p&gt;</translation>
</message>
@@ -3492,81 +3678,81 @@ Recomendámoslle que non o use.</translation>
<translation>Ten que rexistrarse</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Cartafol %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Non existen cartafoles de sincronización configurados.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Abrir no navegador</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Desconectar</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Cambios recentes</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Cartafoles xestionados:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Abrir o cartafol «%1»</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Abrir %1 nun navegador</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Estado descoñecido</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Axustes...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Detalles...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Axuda</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>Saír de %1</translation>
</message>
@@ -3581,11 +3767,6 @@ Recomendámoslle que non o use.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Desconectado</translation>
@@ -3617,116 +3798,129 @@ Recomendámoslle que non o use.</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>Sobre %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>Quebrou agora</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Non hai elementos sincronizados recentemente</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Sincronizando %1 of %2 (restan %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Sincronizando %1 (restan %2)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>Sincronizando %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Actualizado</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation type="unfinished"/>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3738,9 +3932,9 @@ Recomendámoslle que non o use.</translation>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>Etiqueta de texto</translation>
</message>
@@ -3776,11 +3970,22 @@ Recomendámoslle que non o use.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Escolla que sincronizar</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>Cartafol &amp;local</translation>
@@ -3797,11 +4002,16 @@ Recomendámoslle que non o use.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>Sincronizar &amp;todo o contido do servidor</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Mensaxe de estado</translation>
</message>
@@ -3838,7 +4048,7 @@ Recomendámoslle que non o use.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
+ <source>An error occurred while connecting. Please try again.</source>
<translation type="unfinished"/>
</message>
<message>
@@ -4018,7 +4228,7 @@ Recomendámoslle que non o use.</translation>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;Construído a partir de la revisión Git &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; en %3, %4 usando Qt %5, %6&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4116,52 +4326,52 @@ Recomendámoslle que non o use.</translation>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Estado sen definir</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Agardando o comezo da sincronización</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>Sincronización en proceso</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Sincronización realizada</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>A sincronización foi correcta, algúns ficheiros foron ignorados.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Produciuse un erro de sincronización</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Erro de configuración</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Preparando para sincronizar</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Cancelando...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>Sincronización en pausa</translation>
</message>
@@ -4169,22 +4379,22 @@ Recomendámoslle que non o use.</translation>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation type="unfinished"/>
</message>
diff --git a/translations/client_hu.ts b/translations/client_hu.ts
index 30e0428f8..c5515c188 100644
--- a/translations/client_hu.ts
+++ b/translations/client_hu.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="hu_HU" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation>A kukában nem hozható létre alkönyvtár</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation>Nem mozgatható &apos;%1&apos; &apos;%2&apos;-ba</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation>A kukába mozgatás ezen a platformon nem lehetséges</translation>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -47,7 +66,7 @@
<message>
<location filename="../src/gui/folderwizardtargetpage.ui" line="110"/>
<source>TextLabel</source>
- <translation>TextLabel</translation>
+ <translation>Szövegcímke</translation>
</message>
</context>
<context>
@@ -70,23 +89,23 @@
<message>
<location filename="../src/gui/notificationwidget.ui" line="89"/>
<source>TextLabel</source>
- <translation>TextLabel</translation>
+ <translation>Szövegcímke</translation>
</message>
</context>
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>A kapcsolat időtúllépés miatt megszakadt</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation>Ismeretlen hiba: hálózati válasz törölve</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation>Szerver válasza &quot;%1 %2&quot; &quot;%3 %4&quot;-re</translation>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Mégsem</translation>
</message>
@@ -148,7 +167,7 @@
<message>
<location filename="../src/gui/accountsettings.cpp" line="182"/>
<source>No account configured.</source>
- <translation>Nincs beállított kapcsolat.</translation>
+ <translation>Nincs beállított fiók.</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="195"/>
@@ -166,184 +185,184 @@
<translation>Fiók</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Szinkronizálandó elemek kiválasztása</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Kényszerített szinkronizálás</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>Szinkronizálás újraindítása</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>Könyvtár szinkronizációs kapcsolat törlése</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Könyvtár létrehozása nem sikerült</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;Nem lehet helyi könyvtárat létrehozni: &lt;i&gt;%1&lt;/i&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>Könyvtár szinkronizációs kapcsolat törlésének megerősítése</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>Könyvtár szinkronizációs kapcsolat törlése</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Szinkronizálás fut</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>A szinkronizálás folyamatban van. &lt;br/&gt;Szakítsuk meg?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 használatban</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1, mint &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>%1 szerver verzió régi és már nem támogatott! Folytatás saját felelősségre.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Csatlakozva: %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>%1 szerver jelenleg nem elérhető.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation>A(z) %1 szerver jelenleg karbantartási módban van.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>Kijelentkezve innen: %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation>Engedély kérése a böngészőtől. &lt;a href=&apos;%1&apos;&gt;Kattintson ide&lt;/a&gt; a böngésző újranyitásához.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation>Csatlakozás ehhez: %1</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>Nincs kapcsolat ehhez: %1 ekkor: %2.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Bejelentkezés</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
- <translation type="unfinished"/>
+ <translation>Vannak mappák, amelyek nem szinkronizáltak, mert túl nagyok:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
- <translation type="unfinished"/>
+ <translation>Vannak mappák, amelyek nem szinkronizáltak, mert külső tárolók:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
- <translation type="unfinished"/>
+ <translation>Vannak olyan mappák, amelyek nem szinkronizáltak, mert túl nagyok vagy külső tárolók:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Fiók törlésének megerősítése</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Tényleg törölni szeretné a kapcsolatot &lt;i&gt;%1&lt;/i&gt; fiókkal?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Megjegyzés:&lt;/b&gt; Ez &lt;b&gt;nem&lt;/b&gt; töröl fájlokat.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Kapcsolat törlése</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Könyvtár megnyitása</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Kilépés</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Szinkronizálás folytatása</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Szinkronizálás szüneteltetése</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Tényleg leszeretné állítani &lt;i&gt;%1&lt;/i&gt; könyvtár szinkronizálását?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Megjegyzés:&lt;/b&gt; Ez &lt;b&gt;nem&lt;/b&gt; töröl fájlokat.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1 (%3%) / %2 használatban. Néhány könyvtár - beleértve a hálózati megosztásokat és a megosztott könyvtárakat - eltérő korlátozással rendelkezhet.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%1 / %2 használatban</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Jelenleg nem érhető el tárhelyhasználati információ.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>Nincs beállított kapcsolat: %1.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Kijelentkezve</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Szétcsatlakozva</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Csatlakozva</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Szolgáltatás nem érhető el</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
- <translation type="unfinished"/>
+ <translation>Karbantartás Mód</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Hálózati hiba</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Beállítási hiba</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
- <translation type="unfinished"/>
+ <translation>A hitelesítő adatok kérése</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Ismeretlen fiók állapot</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Szerver aktivitás</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Szinkronizációs protokoll</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>Nincs szinkronizálva</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>Nincs szinkronizálva (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>A szerver aktivitási lista a vágólapra másolva.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>A szinkronizációs aktivitási lista a vágólapra másolva.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
- <translation type="unfinished"/>
+ <translation>A nem szinkronizált elemek listája átkerült a vágólapra.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Másolva a vágólapra</translation>
</message>
@@ -469,47 +488,47 @@
<translation>TextLabel</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Szerver aktivitások</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Másolás</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Aktivitási lista másolása a vágólapra.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Beavatkozás szükséges: Értesítések</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br /&gt; %1 fióknak nincsenek engedélyezve az aktivitások.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation><numerusform>%n új értesítést kapott innen: %2.</numerusform><numerusform>%n új értesítést kapott innen: %2.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation><numerusform>%n új értesítést kapott innen: %1 és %2.</numerusform><numerusform>%n új értesítést kapott innen: %1 és %2.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>Új értesítést kapott innen: %1, %2 és további fiókoktól.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>%1 értesítések - Beavatkozás szükséges</translation>
</message>
@@ -529,7 +548,7 @@
<message>
<location filename="../src/gui/addcertificatedialog.ui" line="35"/>
<source>Certificate &amp; Key (pkcs12) :</source>
- <translation type="unfinished"/>
+ <translation>Tanúsítvány és kulcs (pkcs12):</translation>
</message>
<message>
<location filename="../src/gui/addcertificatedialog.ui" line="51"/>
@@ -555,20 +574,45 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
- <source>Error accessing the configuration file</source>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
- <source>There was an error while accessing the configuration file at %1.</source>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
- <source>Quit ownCloud</source>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Kilépés</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Folytatás</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
+ <source>Error accessing the configuration file</source>
+ <translation>Hiba történt egy konfigurációs fájl elérésében</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="256"/>
+ <source>There was an error while accessing the configuration file at %1.</source>
+ <translation>Hiba történt a (z) %1 konfigurációs fájl elérésekor.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="259"/>
+ <source>Quit ownCloud</source>
+ <translation>Kilépés egy sajátCloud-ból</translation>
+ </message>
</context>
<context>
<name>OCC::AuthenticationDialog</name>
@@ -596,40 +640,40 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
- <translation type="unfinished"/>
+ <translation>Hiba történt a metaadatok megadása az adatbázisban</translation>
</message>
</context>
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>Nincs ownCloud fiók beállítva</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>A beállított szerver ehhez a klienshez túl régi</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Kérjük, frissítse a szervert az utolsó verzióra és indítsa újra a klienst.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Hitelesítési hiba: A felhasználónév vagy a jelszó hibás.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>időtúllépés</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>A megadott adatok helytelenek.</translation>
</message>
@@ -637,178 +681,206 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Felhasználó megszakította</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>%1 helyi mappa nem létezik.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 valószínűleg könyvtár, de nem az.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 nem olvasható.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 sikeresen törölve.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 sikeresen letöltve.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 sikeresen feltöltve.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 átnevezve erre: %2.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 áthelyezve ide: %2.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation><numerusform>%1 és %n további fájl törölve.</numerusform><numerusform>%1 és %n további fájl törölve.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation><numerusform>%1 és %n további fájl letöltve.</numerusform><numerusform>%1 és %n további fájl letöltve.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation><numerusform>%1 és %n további fájl feltöltve.</numerusform><numerusform>%1 és %n további fájl feltöltve.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation><numerusform>%1 átnevezve erre: %2 és még %n további fájl átnevezve.</numerusform><numerusform>%1 átnevezve erre: %2 és még %n további fájl átnevezve.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation><numerusform>%1 áthelyezve ide: %2 és még %n további fájl áthelyezve.</numerusform><numerusform>%1 áthelyezve ide: %2 és még %n további fájl áthelyezve.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation><numerusform>%1 és %n további fájl szinkronizálási konfliktussal rendelkezik.</numerusform><numerusform>%1 és %n további fájl szinkronizálási konfliktussal rendelkezik.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation>%1 fájl szinkronizálási konfliktussal rendelkezik. Kérjük ellenőrizze a konfliktus fájlt!</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation><numerusform>%1 és %n további fájlt nem sikerült szinkronizálni. Bővebb információ a naplófájlban.</numerusform><numerusform>%1 és %n további fájlt nem sikerült szinkronizálni. Bővebb információ a naplófájlban.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 nem sikerült szinkronizálni. Bővebb információ a naplófájlban.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Szinkronizálási aktivitás</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
- <translation type="unfinished"/>
+ <translation>Nem sikerült olvasni a rendszer kizárási fájlját</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
- <translation type="unfinished"/>
+ <translation>A (z) % 1 MB-nál nagyobb új mappa hozzáadva: % 2.
+</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
- <translation type="unfinished"/>
+ <translation>Hozzáadt egy mappát egy külső tárból.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
+ <translation>A beállítások megadásához válassza ki, ha szeretné letölteni.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
If you decide to delete the files, they will be unavailable to you, unless you are the owner.</source>
- <translation type="unfinished"/>
+ <translation>A kiszolgáló egy &quot;% 1&quot; mappában levő összes fájlt törölték.Ezek a törlések szinkronizálódnak a helyi szinkronizálási mappájukhoz, így az ilyen fájlok nem érhetők el, hacsak nem jogosult a visszaállításra. Ha úgy dönt, hogy megtartja a fájlokat, akkor újra szinkronizálódik a szerverrel, ha jogosult erre.Ha úgy dönt, hogy törli a fájlokat, akkor nem lesznek elérhetők, hacsak nem vagy egy tulajdonos.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
- <translation type="unfinished"/>
+ <translation>A (z) &quot;% 1&quot; helyi szinkronmappában található összes fájl törölve lett. Ezek a törlések szinkronizálásra kerülnek a kiszolgálóval, így az ilyen fájlok nem érhetők el, hacsak vissza nem állítják őket.Biztos benne, hogy ezeket a műveleteket szinkronizálni szeretné a kiszolgálóval?Ha ez baleset volt, és úgy döntenél, hogy megőrzi a fájlokat, újra szinkronizálódik a kiszolgálóról.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Törli az összes fájlt?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Összes fájl eltávolítása</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Fájlok megtartása</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
- <translation type="unfinished"/>
+ <translation>Ez a szinkronizálás a &quot;% 1&quot; szinkronizálási mappában korábbi időpontban alaphelyzetbe állítja a fájlokat.Ez azért lehetséges, mert egy biztonsági másolat visszaállt a kiszolgálón.Ha a szokásos módon folytatja a szinkronizálást, az régebbi fájl felülírja az összes fájlt egy korábbi állapotban. Meg szeretné őrizni a helyi legfrissebb fájlokat konfliktusfájlokként?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>Biztonsági mentés észlelve</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>Normal szinkronizáció</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>Helyi file-ok megtartása konfliktusként</translation>
</message>
@@ -816,114 +888,104 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
- <translation type="unfinished"/>
+ <translation>A térkép állapotának visszaállítása nem sikerült</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
- <translation type="unfinished"/>
+ <translation>Meglelt egy régi &apos;%1&apos; szinkronfüzet, de nem sikerült eltávolítani. Győződjön meg róla, hogy egyetlen alkalmazás sem használja azt.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation>(biztonsági mentés)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation>(biztonsági mentés: %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Ismeretlen állapot.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>Várakozás a szinkronizálás elindítására.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Előkészítés szinkronizációhoz.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>Szinkronizálás fut.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>Legutolsó szinkronizálás sikeres volt.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>Az utolsó szinkronizáció sikeresen lefutott, de néhány figyelmeztetés van.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>Legutolsó szinkronizálás sikeres volt.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Beállítás hiba.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Felhasználó megszakította.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>Szinkronizálás megállítva.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (szinkronizálás megállítva)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>Nincs érvényes könyvtár kiválasztva!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>A kiválasztott elérési út nem könyvtár!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Nincs joga a kiválasztott könyvtár írásához!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
- <translation type="unfinished"/>
+ <translation>Már van szinkronizálás a szerverről a helyi mappára. Kérjük, válasszon másik helyi mappát!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
- <translation type="unfinished"/>
+ <translation>A %1 helyi mappa már tartalmaz egy mappát a mappák szinkronizációjában. Kérem válasszon egyet!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation type="unfinished"/>
+ <translation>A %1 helyi mappa már tartalmazza a mappát és a szinkronizálási kapcsolatokat. Kérjük válasszon egyet!</translation>
</message>
</context>
<context>
@@ -931,12 +993,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<message>
<location filename="../src/gui/folderstatusdelegate.cpp" line="46"/>
<source>Add Folder Sync Connection</source>
- <translation type="unfinished"/>
+ <translation>Mappaszinkronizáció hozzáadása</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
- <translation type="unfinished"/>
+ <translation>Szinkronizálás a helyi mappával</translation>
</message>
<message>
<location filename="../src/gui/folderstatusdelegate.cpp" line="296"/>
@@ -949,12 +1011,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<message>
<location filename="../src/gui/folderstatusmodel.cpp" line="143"/>
<source>You need to be connected to add a folder</source>
- <translation type="unfinished"/>
+ <translation>A mappák hozzáadásához kapcsolódnia kell</translation>
</message>
<message>
<location filename="../src/gui/folderstatusmodel.cpp" line="145"/>
<source>Click this button to add a folder to synchronize.</source>
- <translation type="unfinished"/>
+ <translation>Kattintson erre a gombra egy mappa szinkronizálásához.</translation>
</message>
<message>
<location filename="../src/gui/folderstatusmodel.cpp" line="154"/>
@@ -966,151 +1028,169 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<message>
<location filename="../src/gui/folderstatusmodel.cpp" line="180"/>
<source>Error while loading the list of folders from the server.</source>
- <translation type="unfinished"/>
+ <translation>Hiba történt a mappák listájának betöltése és a kiszolgálóról.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Kijelentkezve</translation>
</message>
<message>
<location filename="../src/gui/folderstatusmodel.cpp" line="183"/>
<source>Fetching folder list from server...</source>
- <translation type="unfinished"/>
+ <translation>A lekérdezés listája a kiszolgálóról ...</translation>
</message>
<message>
<location filename="../src/gui/folderstatusmodel.cpp" line="209"/>
<source>There are unresolved conflicts. Click for details.</source>
+ <translation>Vannak megoldatlan konfliktusok. Kattints a részletekért.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
- <source>Reconciling changes</source>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
+ <source>Reconciling changes</source>
+ <translation>A változások összehangolása</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>%1 szinkronizálása</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>letöltés: %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>feltöltés: %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 / %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%5 maradt, %1 / %2, %3 / %4 fájl</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
- <translation type="unfinished"/>
+ <translation>%1 %2, fájl%3 a %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>%1 / %2 fájl</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>Várakozás...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>Várakozás %n további könyvtárra...</numerusform><numerusform>Várakozás %n további könyvtárra...</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>Felkészülés szinkronizálásra...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
- <translation type="unfinished"/>
+ <translation>Mappaszinkronizáció hozzáadása</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
- <translation type="unfinished"/>
+ <translation>Szinkronizálási kapcsolat hozzáadása</translation>
</message>
</context>
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>A szinkronizáláshoz válasszon ki egy helyi mappát.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Adjon meg a helyi könyvtár elérési útját.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Forrás könyvtár kiválasztása</translation>
</message>
@@ -1118,60 +1198,68 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
- <translation type="unfinished"/>
+ <translation>Távoli mappa létrehozása</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
- <translation type="unfinished"/>
+ <translation>Írjon be egy &apos;%1&apos; alatt létrehozandó új mappa nevét:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>A mappa sikeresen létrehozva: %1.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
- <translation type="unfinished"/>
+ <translation>Hitelesítés sikertelen a %1 elérésnél</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
- <translation type="unfinished"/>
+ <translation>Nem sikerült létrehozni a %1 mappát. Kérem, kézzel ellenőrizze.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
- <translation type="unfinished"/>
+ <translation>Nem sikerült listát trehozni . Hiba: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
- <translation type="unfinished"/>
+ <translation>Válassz ez egy szinkronizáláshoz</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Ez a mappa már szinkronizálva van.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation>Már szinkronizálni &lt;i&gt;% 1&lt;/i&gt;, amely egy szülő könyvtár &lt;i&gt;% 2&lt;/i&gt;.</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Figyelmeztetés:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Figyelmeztetés:&lt;/b&gt;</translation>
</message>
@@ -1179,22 +1267,22 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
- <translation type="unfinished"/>
+ <translation>A kiszolgálótól kapott E-Cimke nem található, ellenőrizze a Proxy/Átjáró szolgáltatást</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
- <translation type="unfinished"/>
+ <translation>Másik E-Cimkét kaptunk egy folytatáshoz. A következő alkalommal újra próbálkozni.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
- <translation type="unfinished"/>
+ <translation>A szerver rossz tartalomtartományt adott vissza</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Kapcsolat időtúllépés</translation>
</message>
@@ -1217,25 +1305,40 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Rendszertálcára</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Haladó</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
- <translation type="unfinished"/>
+ <translation>Kérjen megerősítést, mielőtt szinkronizálná a nagyobb könyvtárakat</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
- <translation type="unfinished"/>
+ <translation>Kérjen megerősítést a külső tárolók szinkronizálása előtt</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="26"/>
@@ -1253,43 +1356,79 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>&amp;Monokróm ikonok használata</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>K&amp;ihagyott fájlok szerkesztése</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>&amp;Hibabejelentő megjelenítése</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>Rólunk</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>Frissítések</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>Új&amp;raindítás és frissítés</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Mégsee</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
<message>
<location filename="../src/gui/creds/httpcredentialsgui.cpp" line="100"/>
<source>Please enter %1 password:&lt;br&gt;&lt;br&gt;User: %2&lt;br&gt;Account: %3&lt;br&gt;</source>
- <translation type="unfinished"/>
+ <translation>Kérjük, írja be a %1 jelszót:&lt;br&gt;&lt;br&gt; Felhasználó: %2 &lt;br&gt; Fiók: %3&lt;br&gt;</translation>
</message>
<message>
<location filename="../src/gui/creds/httpcredentialsgui.cpp" line="114"/>
<source>Reading from keychain failed with error: &apos;%1&apos;</source>
- <translation type="unfinished"/>
+ <translation>A kulcstartó olvasása nem sikerült hiba esetén: &apos;%1&apos;</translation>
</message>
<message>
<location filename="../src/gui/creds/httpcredentialsgui.cpp" line="120"/>
@@ -1299,7 +1438,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<message>
<location filename="../src/gui/creds/httpcredentialsgui.cpp" line="157"/>
<source>&lt;a href=&quot;%1&quot;&gt;Click here&lt;/a&gt; to request an app password from the web interface.</source>
- <translation type="unfinished"/>
+ <translation>&lt;a href=&quot;%1&quot;&gt;Kattints ide&lt;/a&gt; és kérheti az alkalmazás jelszavát a webes felületről.</translation>
</message>
</context>
<context>
@@ -1322,7 +1461,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<message>
<location filename="../src/gui/ignorelisteditor.ui" line="36"/>
<source>Files Ignored by Patterns</source>
- <translation type="unfinished"/>
+ <translation>A minták által figyelmen kívül hagyott fájlok</translation>
</message>
<message>
<location filename="../src/gui/ignorelisteditor.ui" line="55"/>
@@ -1337,7 +1476,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<message>
<location filename="../src/gui/ignorelisteditor.ui" line="80"/>
<source>Allow Deletion</source>
- <translation>Törlés engedélyezése</translation>
+ <translation>Törlés Engedélyezése</translation>
</message>
<message>
<location filename="../src/gui/ignorelisteditor.ui" line="45"/>
@@ -1345,36 +1484,38 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Eltávolítás</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
- <translation type="unfinished"/>
+ <translation>A mintának megfelelő fájlok vagy mappák nem lesznek szinkronizálva.
+
+A törlésre engedélyezett elemeket törölni fogják, ha megakadályozzák a könyvtár eltávolítását. Ez hasznos a metaadatoknál.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Nem sikerült a fájl megnyitása</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
- <translation type="unfinished"/>
+ <translation>Nem lehet megváltoztatni a &quot;%1&quot; változatot.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
- <translation type="unfinished"/>
+ <translation>Hozzáad Figyelmen kívül hagyás minta</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
- <translation type="unfinished"/>
+ <translation>Új figyelmen kívül hagyott minta hozzáadása:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
- <translation type="unfinished"/>
+ <translation>Ezt a bejegyzést a rendszer &apos;%1&apos; rendszerben adja meg, és nem módosítható ebben a nézetben.</translation>
</message>
</context>
<context>
@@ -1387,7 +1528,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<message>
<location filename="../src/gui/issueswidget.ui" line="20"/>
<source>List of issues</source>
- <translation type="unfinished"/>
+ <translation>A problémák listája</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="34"/>
@@ -1398,52 +1539,62 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<location filename="../src/gui/issueswidget.ui" line="42"/>
<location filename="../src/gui/issueswidget.ui" line="61"/>
<source>&lt;no filter&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;no filter&gt;</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Mappa</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="73"/>
<source>Show warnings</source>
- <translation type="unfinished"/>
+ <translation>Figyelmeztetések megjelenítése</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="83"/>
<source>Show ignored files</source>
- <translation type="unfinished"/>
+ <translation>A figyelmen kívülhagyott fájlok megjelenítése</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
+ <translation>Túl sok kérdés volt. Nem minden jelen lesz látható.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
- <translation type="unfinished"/>
+ <translation>Másolja a problémák listáját a vágólapra.</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Másolás</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Idő</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Fájl</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
+ <translation>Probléma</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1467,40 +1618,52 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<message>
<location filename="../src/gui/logbrowser.cpp" line="89"/>
<source>&amp;Capture debug messages</source>
- <translation type="unfinished"/>
+ <translation>&amp; Lekérdezzen hibakeresési üzeneteket</translation>
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Törlés</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Törölje a naplózás kimenetét.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>Menté&amp;s</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>A naplófájl mentése a helyi gépre.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Naplófájl mentése</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Hiba</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>Naplófájl írása nem lehet: %1</translation>
</message>
@@ -1508,12 +1671,12 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Hiba</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;&apos;%1&apos; fájlt&lt;br/&gt;nem lehet írásra megnyitni.&lt;br/&gt;&lt;br/&gt;A naplózás kimenete &lt;b&gt;nem&lt;/b&gt; menthető!&lt;/nobr&gt;</translation>
</message>
@@ -1521,27 +1684,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Új verzió érhető el</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;Egy új verzió érhető el a(z) %1 kliensből.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; elérhető letöltésre. A telepített verzió: %3.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Verzió kihagyása</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Kihagyás ezalkalommal</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Frissítés beszerzése</translation>
</message>
@@ -1615,7 +1778,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<location filename="../src/gui/networksettings.ui" line="250"/>
<location filename="../src/gui/networksettings.ui" line="282"/>
<source>Limit to 3/4 of estimated bandwidth</source>
- <translation type="unfinished"/>
+ <translation>Határozza meg a becsült sávszélesség 3/4-ét</translation>
</message>
<message>
<location filename="../src/gui/networksettings.ui" line="269"/>
@@ -1629,27 +1792,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation>Korlátozás automatikusan</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Proxy kiszolgáló</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Proxy felhasználónév</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Proxy jelszó</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>HTTP(S) proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>SOCKS5 proxy</translation>
</message>
@@ -1657,116 +1820,117 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
- <translation type="unfinished"/>
+ <translation>% 1 létrehozva</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
- <translation type="unfinished"/>
+ <translation>Néhány másodpercen belül lezárva ...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
- <translation type="unfinished"/>
+ <translation>%1 kérés sikertelen volt a következő helyen: %2</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
- <translation type="unfinished"/>
+ <translation>&apos;%1&apos; a &apos;%2&apos; kategóriában</translation>
</message>
</context>
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
- <translation type="unfinished"/>
+ <translation>Hiba történt egy szerveren: &lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
- <translation type="unfinished"/>
+ <translation>Hiba történt a &apos;token&apos; végpont elérésében: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
- <translation type="unfinished"/>
+ <translation>Nem sikerült elemezni a JSON visszaküldését a kiszolgálóról: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
- <translation type="unfinished"/>
+ <translation>A kiszolgálóra adott válasz nem tartalmazta az összes várható mezőt</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;h1&gt;Hibás Belépés&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;h1&gt;Helytelen felhasználó&lt;/h1&gt;&lt;p&gt;Ön bejelentkezett &lt;em&gt;%1&lt;/em&gt; felhasználóval, de bekel jelentkezni &lt;em&gt;%2&lt;/em&gt; felhasználóval.&lt;br&gt;Kérjük, jelentkezzen ki egy másik lapon %3-, majd &lt;a href=&apos;%4&apos;&gt;kattintson ide&lt;/a&gt; és jelentkezzen be %2&lt;/p&gt; -ként</translation>
</message>
</context>
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Elérhető új %1 frissítés</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
- <translation type="unfinished"/>
+ <translation>A %1 új frissítés telepítése folyamatban van. A frissítő kérheti
+további jogosultságokat a folyamat során.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>%1 verzió letöltése. Kérjük, várjon...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>Nem lehetett letölteni a frissítést. Kérjük, kattints &lt;a href=&apos;%1&apos;&gt;ide&lt;/a&gt; a frissítés kézi letöltéséhez.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Nem lehet ellenőrzi a frissítéseket.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>%1 verzió %2 elérhető. Kérjük, indítsa újra az alkalmazást a frissítés elkezdéséhez.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>Új %1 verzió %2 elérhető. Kérjük, a telepítéshez a rendszer frissítési eszközét használja.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Frissítési szerver ellenőrzése...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>Frissítési állapot ismeretlen: Nem lehet ellenőrizni a frissítéseket.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>Nincs újabb kiadás. Ez a legfrissebb verzió.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Frissítés ellenőrzése</translation>
</message>
@@ -1774,43 +1938,43 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Csatlakozás: %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
- <translation type="unfinished"/>
+ <translation>Helyi mappa beállítások megadása</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Csatlakozás...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
- <translation type="unfinished"/>
+ <translation>%1 mappa &apos;%2&apos; szinkronizálva van a &apos;%3&apos; helyi mappához</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
- <translation>„%1” könyvtár szinkronizálása</translation>
+ <translation>&apos;%1&apos; könyvtár szinkronizálása</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Figyelem:&lt;/strong&gt; A helyi mappa nem üres. Válassz egy másikat!&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Helyi Sync mappa</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1825,27 +1989,27 @@ for additional privileges during the process.</source>
<message>
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="43"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Failed to connect to the secure server address specified. How do you wish to proceed?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Nem sikerült csatlakozni a megadott biztonságos kiszolgáló címhez. Hogyan kívánja folytatni?</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="55"/>
<source>Select a different URL</source>
- <translation type="unfinished"/>
+ <translation>Válasszon egy másik URL-t</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="62"/>
<source>Retry unencrypted over HTTP (insecure)</source>
- <translation type="unfinished"/>
+ <translation>Nincs titkosítva újra próbálkozik HTTP-n (nem biztonságos)</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="69"/>
<source>Configure client-side TLS certificate</source>
- <translation type="unfinished"/>
+ <translation>Az ügyféloldali TLS-tanúsítvány konfigurálása</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.cpp" line="34"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Failed to connect to the secure server address &lt;em&gt;%1&lt;/em&gt;. How do you wish to proceed?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Nem sikerült csatlakozni a biztonságos szerver címhez&lt;em&gt; %1&lt;/em&gt;. Hogyan kívánja folytatni?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
@@ -1869,14 +2033,19 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Csatlakozás: %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
- <translation type="unfinished"/>
+ <translation>Jelentkezzen be egy böngészőbe</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation>Link másolása egy vágólapra</translation>
</message>
</context>
<context>
@@ -1889,13 +2058,14 @@ for additional privileges during the process.</source>
<message>
<location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="51"/>
<source>Setup %1 server</source>
- <translation type="unfinished"/>
+ <translation>Szerver %1 beállítás</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="129"/>
<source>This url is NOT secure as it is not encrypted.
It is not advisable to use it.</source>
- <translation type="unfinished"/>
+ <translation>Ez az URL nem biztonságos, mivel nincs titkosítva.
+Nem ajánlott használni.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="133"/>
@@ -1907,153 +2077,163 @@ It is not advisable to use it.</source>
<source>&amp;Next &gt;</source>
<translation>&amp;Következő &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>Érvénytelen URL</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Sikeresen csatlakozott az %1-hoz: %2 verziószám %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
- <translation type="unfinished"/>
+ <translation>Nem sikerült csatlakozni a következőhöz %1 a %2:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
- <translation type="unfinished"/>
+ <translation>Időkorlát a %1 kapcsolódás a %2 alatt.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Próbál kapcsolódni az %1-hoz: %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
- <translation type="unfinished"/>
+ <translation>A kiszolgáló hitelesített kérelme át lett irányítva &apos;%1&apos;. Az URL rossz, a kiszolgáló rosszul van beállítva.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
- <translation type="unfinished"/>
+ <translation>Érvénytelen válasz érkezett a hitelesített webdav kérelemre</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
- <translation type="unfinished"/>
+ <translation>A szerver tiltott hozzáférés. Annak ellenőrzése, hogy megfelelő hozzáféréssel rendelkezik-e,&lt;a href=&quot;%1&quot;&gt;kattints ide&lt;/a&gt; egy szolgáltatás elérése egy böngészővel.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>Érvénytelen URL</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
- <translation type="unfinished"/>
+ <translation>A kiszolgáló a következő hibát jelentette:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>A helyi %1 mappa már létezik, állítsa be a szinkronizálódását.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
- <translation type="unfinished"/>
+ <translation>Helyi szinkronizáló mappa létrehozása %1 ...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>ok</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation> sikertelen.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
- <translation type="unfinished"/>
+ <translation>Nem sikerült létrehozni a %1 helyi mappát</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
- <translation type="unfinished"/>
+ <translation>Nincs megadva távoli mappa!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Hiba: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
- <translation type="unfinished"/>
+ <translation>mappát létrehozta az ownCloud: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>%1 távoli nappa sikeresen létrehozva.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>A %1 távoli mappa már létezik. Csatlakoztassa a szinkronizációhoz.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>A könyvtár létrehozásakor keletkezett HTTP hibakód %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>A távoli mappa létrehozása nem sikerült, mert a megadott hitelesítő adatok hibásak!&lt;br/&gt;Kérem, térjen vissza és ellenőrizze a hitelesítő adatokat.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;A távoli mappa létrehozása sikertelen, valószínűleg mivel hibásak a megdott hitelesítési adatok.&lt;/font&gt;&lt;br/&gt;Lépjen vissza és ellenőrizze a belépési adatokat.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>A távoli %1 mappa létrehozása nem sikerült. Hibaüzenet: &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>A szinkronizációs kapcsolat a %1 és a %2 távoli mappa között létrejött.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Sikeresen csatlakozva: %1!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>A kapcsolat a %1 kiszolgálóhoz sikertelen. Ellenőrizze újra.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>A mappa átnevezése nem sikerült</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
- <translation type="unfinished"/>
+ <translation>A mappát nem lehet eltávolítani és biztonsági másolatot készíteni, mert a mappa vagy a benne található fájl megnyílik egy másik programban. Kérjük, zárjon be egy mappát vagy egy fájlt, és próbálja meg újra megpróbálni vagy törölni a beállítást.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Helyi %1 szinkronizációs mappa sikeresen létrehozva!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2061,13 +2241,30 @@ It is not advisable to use it.</source>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>%1 kapcsolódási varázsló</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
<translation type="unfinished"/>
</message>
</context>
@@ -2092,117 +2289,117 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
- <translation type="unfinished"/>
+ <translation>Érvénytelen JSON válasz egy lekérési URL-ben</translation>
</message>
</context>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
- <translation type="unfinished"/>
+ <translation>Hiba történt a metaadatok megadásához a adatbázisban</translation>
</message>
</context>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
- <translation type="unfinished"/>
+ <translation>A %1 fájl nem tölthető le a helyi fájlnév ütközés miatt!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
- <translation type="unfinished"/>
+ <translation>A letöltés csökkentené a helyi lemezterületet a határérték alatt</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
- <translation type="unfinished"/>
+ <translation>Szabad lemezterület kevesebb, mint %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>A fájl törlésre került a szerverről</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
- <translation type="unfinished"/>
+ <translation>A fájl nem tölthető le teljesen.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
- <translation type="unfinished"/>
+ <translation>A letöltött fájl üres, annak ellenére, hogy a kiszolgáló bejelentette, hogy %1-nek kell lennie.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
- <translation type="unfinished"/>
+ <translation>A %1 fájl nem menthető el a helyi fájlnév ütközése miatt!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
- <translation type="unfinished"/>
+ <translation>A fájl felfedezése óta megváltozott</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
- <translation type="unfinished"/>
+ <translation>Hiba történt a metaadatok megadásához a adatbázisban</translation>
</message>
</context>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
- <translation type="unfinished"/>
+ <translation>Helyreállítás sikertelen: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
- <translation type="unfinished"/>
+ <translation>A fájlt vagy mappát eltávolították egy csak olvasható megosztásból, de a helyreállítás sikertelen: %1</translation>
</message>
</context>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
- <translation type="unfinished"/>
+ <translation>nem sikerült törölni a %1 fájlt, hiba: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
- <translation type="unfinished"/>
+ <translation>Figyelmeztetés, lehetséges esetek érzékenysége ütközik a %1-vel</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
- <translation type="unfinished"/>
+ <translation>nem sikerült létrehozni a %1 mappát</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
- <translation type="unfinished"/>
+ <translation>Hiba történt a metaadatok megadásához a adatbázisban</translation>
</message>
</context>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
- <translation type="unfinished"/>
+ <translation>&apos;%1&apos; mappa nem távolítható el</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation type="unfinished"/>
</message>
@@ -2210,26 +2407,21 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
- <translation type="unfinished"/>
+ <translation>Hiba történt a metaadatok megadásához a adatbázisban</translation>
</message>
</context>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation type="unfinished"/>
</message>
@@ -2237,103 +2429,88 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
- <translation type="unfinished"/>
+ <translation>Hiba történt a metaadatok megadásához a adatbázisban</translation>
</message>
</context>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
- <translation type="unfinished"/>
+ <translation>Hiba történt a metaadatok megadásához a adatbázisban</translation>
</message>
</context>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Fájl törölve</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
- <translation type="unfinished"/>
+ <translation>A helyi file a szinkronizálás során megváltozott. Visszaállításra kerül.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
- <translation type="unfinished"/>
+ <translation>A helyi file a szinkronizálás során megváltozott</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
- <translation type="unfinished"/>
+ <translation>Hiba történt a metaadatok megadásához a adatbázisban</translation>
</message>
</context>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>A helyi fájl el lett távolítva a szinkronizálás alatt.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
- <translation type="unfinished"/>
+ <translation>A helyi file a szinkronizálás során megváltozott</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation type="unfinished"/>
</message>
@@ -2341,27 +2518,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>A helyi fájl el lett távolítva a szinkronizálás alatt.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
- <translation type="unfinished"/>
+ <translation>A helyi file a szinkronizálás során megváltozott</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation type="unfinished"/>
</message>
@@ -2379,42 +2551,47 @@ It is not advisable to use it.</source>
<translation>TextLabel</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Megnyitás böngészőben</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Idő</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Fájl</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Mappa</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Művelet</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Méret</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
- <translation type="unfinished"/>
+ <translation>Helyi szinkronizálási protokoll</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Másolás</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Az aktivitási lista másolása a vágólapra.</translation>
</message>
@@ -2455,7 +2632,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Szinkronizálandó elemek kiválasztása</translation>
</message>
@@ -2463,35 +2640,35 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Betöltés ...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
- <translation type="unfinished"/>
+ <translation>Távolítsa el a távoli mappákat, amelyeket nem kíván szinkronizálni.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Név</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Méret</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
- <translation type="unfinished"/>
+ <translation>Jelenleg nincsenek almappák a kiszolgálón.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
- <translation type="unfinished"/>
+ <translation>Hiba történt az almappák listájának betöltése.</translation>
</message>
</context>
<context>
@@ -2510,22 +2687,22 @@ It is not advisable to use it.</source>
<translation>Beállítások</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Aktivitás</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Általános</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Hálózat</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Fiók</translation>
</message>
@@ -2533,28 +2710,28 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Aktivitás</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Általános</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Hálózat</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Fiók</translation>
</message>
@@ -2582,42 +2759,42 @@ It is not advisable to use it.</source>
<translation>ownCloud útvonala:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>%1 megosztás</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Könyvtár: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
- <translation type="unfinished"/>
+ <translation>A szerver nem engedélyezi a megosztást</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
- <translation type="unfinished"/>
+ <translation>A lehetséges maximális megosztási jogosultságok lekérése a kiszolgálóról ...</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>A fájlt nem lehetett megosztani, mert megosztási jogosultság nélkül lett megosztva.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
- <translation type="unfinished"/>
+ <translation>Felhasználók és csoportok</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>Publikus Hivatkozások</translation>
</message>
@@ -2627,10 +2804,20 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="14"/>
<source>Share NewDocument.odt</source>
- <translation type="unfinished"/>
+ <translation>Megosztás NewDocument.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation>Csak feltöltés (File Drop)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation>Fájlokat fogadhat másoktól anélkül, hogy felfedné a mappa tartalmát. 169</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>TextLabel</translation>
</message>
@@ -2642,12 +2829,12 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="35"/>
<source>Enter a name to create a new public link...</source>
- <translation type="unfinished"/>
+ <translation>Adjon meg egy nevet egy új nyilvános link létrehozásához ...</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="42"/>
<source>&amp;Create new</source>
- <translation type="unfinished"/>
+ <translation>&amp; Új készíteni</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="105"/>
@@ -2660,19 +2847,24 @@ It is not advisable to use it.</source>
<translation>Jelszó beállítása</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
- <translation type="unfinished"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
+ <translation>Fogadók letölthetnek és megjeleníthetnek tartalmakat.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation>Letöltés / Megjelenítés</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>Mutassa a fájl listázásokat</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation>Letöltés / Megjelenítés / Feltöltés</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Szerkesztés engedélyezése</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation>Fogadók megjeleníthetnek, módosíthatnak, törölhetnek és feltölthetnek tartalmakat.</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2680,95 +2872,95 @@ It is not advisable to use it.</source>
<translation>Bárki a hivatkozással hozzáférhet a fájlhoz/mappához</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>J&amp;elszóval védve</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Jelszóval védett</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>A fájlt nem lehetett megosztani, mert megosztási jogosultság nélkül lett megosztva.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
- <translation type="unfinished"/>
+ <translation>A link-megosztások letiltásra kerültek</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
- <translation type="unfinished"/>
+ <translation>Hozzon létre nyilvános link megosztást</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Törlés</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
- <translation type="unfinished"/>
+ <translation>Nyissa meg egy linket egy böngészőben</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
- <translation type="unfinished"/>
+ <translation>Link másolása egy vágólapra</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
- <translation type="unfinished"/>
+ <translation>Link másolása a vágólapra (közvetlen letöltés)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Link küldése e-mail-ben</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
+ <translation>Link elküldése e-mailben (közvetlen letöltés)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
- <translation type="unfinished"/>
+ <translation>Egy link megosztásának törlési megerősítése</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;p&gt;Tényleg törölni szeretné a nyilvános link megosztását &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Megjegyzés: Ezt a műveletet nem lehet visszavonni.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Mégsem</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
- <translation type="unfinished"/>
+ <translation>Nyilvános link</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
- <translation type="unfinished"/>
+ <translation>Törölje a link megosztását</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>Nyilvános me&amp;gosztáshoz szükség van jelszóra</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Kérjük, állíts be egy jelszót</translation>
</message>
@@ -2778,7 +2970,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/shareusergroupwidget.ui" line="14"/>
<source>Share NewDocument.odt</source>
- <translation type="unfinished"/>
+ <translation>Megosztás NewDocument.odt</translation>
</message>
<message>
<location filename="../src/gui/shareusergroupwidget.ui" line="22"/>
@@ -2788,37 +2980,37 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/shareusergroupwidget.ui" line="108"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;You can direct people to this shared file or folder &lt;a href=&quot;private link menu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;by giving them a private link&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Az embereket erre a megosztott fájlra vagy mappára irányíthatja egy &lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;egy privát link által&lt;a href=&quot;private link menu&quot;&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
- <translation type="unfinished"/>
+ <translation>Az elemet nem osztják meg egyetlen felhasználóval sem</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
- <translation type="unfinished"/>
+ <translation>Nyissa meg egy linket egy böngészőben</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
- <translation type="unfinished"/>
+ <translation>Link másolása egy vágólapra</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Link küldése e-mail-ben</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
- <translation type="unfinished"/>
+ <translation>Nincs eredmény a &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
- <translation type="unfinished"/>
+ <translation>Megosztottam veled valamit</translation>
</message>
</context>
<context>
@@ -2829,37 +3021,38 @@ It is not advisable to use it.</source>
<translation>Űrlap</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>TextLabel</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>szerkesztheti</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>megoszthatja</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>létrehozás</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>módosít</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>töröl</translation>
</message>
@@ -2887,7 +3080,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/creds/shibboleth/shibbolethwebview.cpp" line="93"/>
<source>SSL Chipher Debug View</source>
- <translation type="unfinished"/>
+ <translation>SSL Cipher hibakeresési nézet</translation>
</message>
<message>
<location filename="../src/gui/creds/shibboleth/shibbolethwebview.cpp" line="101"/>
@@ -2897,152 +3090,185 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/creds/shibboleth/shibbolethwebview.cpp" line="101"/>
<source>Your session has expired. You need to re-login to continue to use the client.</source>
- <translation type="unfinished"/>
+ <translation>A munkamenet lejárt. A kliens használatának folytatásához újra be kell jelentkeznie.</translation>
</message>
</context>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>Megosztás vele: %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
- <source>I shared something with you</source>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
+ <source>I shared something with you</source>
+ <translation>Megosztottam veled valamit</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
- <translation type="unfinished"/>
+ <translation>Ossza meg ...</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
- <translation type="unfinished"/>
+ <translation>Privát hivatkozás másolás a vágólapra</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
+ <translation>Privát e-mail küldése: ...</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Megnyitás böngészőben</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Tanúsítvány részletei&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Általános név (CN):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>A tárgy további nevei:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Szervezet (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Szervezeti egység (OU):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Tagállam/Megye:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>Ország:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Sorozatszám:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Kibocsátó&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Aláíró:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Kibocsátva:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Lejárat:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Ujjlenyomatok&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;Megjegyzés:&lt;/b&gt; A tanúsítvány kézileg jóváhagyva&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (önaláírt)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>Ez a kapcsolat %1 bittel van titkosítva: %2.
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
- <translation type="unfinished"/>
+ <translation>SSL munkamenetek / azonosítók támogatása nem támogatott</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Tanúsítvány adatok:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
- <translation type="unfinished"/>
+ <translation>Ez a kapcsolat NEM biztonságos, mivel nem titkosított.</translation>
</message>
</context>
<context>
@@ -3126,305 +3352,270 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Sikerült.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;Az %1 beépülőmodul a csync-hez nem tölthető be.&lt;br/&gt;Ellenőrizze a telepítést!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>CSync hibás paraméterhiba.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>CSync frissítés feldolgozása meghíusult.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>CSync egyeztetési lépés meghíusult.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>A CSync nem találja a proxy kiszolgálót.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>A CSync nem tuja azonosítani magát a %1 kiszolgálón.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync hálózati kapcsolódási hiba.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
- <translation type="unfinished"/>
+ <translation>Hálózati kapcsolat időtúllépés történt.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>HTTP átviteli hiba történt.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
- <translation type="unfinished"/>
+ <translation>A beillesztett mappa ideiglenesen nem érhető el a kiszolgálón</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
- <translation type="unfinished"/>
+ <translation>Hiba történt a mappa megnyitása közben</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
- <translation type="unfinished"/>
+ <translation>Hiba történt egy térképen olvasása közben.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
- <translation type="unfinished"/>
+ <translation>%1 (kihagyva korábbi hiba miatt, próbálkozva újra %2-ban)</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
- <translation type="unfinished"/>
+ <translation>A fájl / mappát figyelmen kívül hagyja, mert rejtett.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
- <translation type="unfinished"/>
+ <translation>A mappa hierarchia túl mély</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: Nincs szabad tárhely az %1 kiszolgálón.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>CSync ismeretlen hiba.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Felhasználó megszakította</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation>Hozzáférés megtagadva.</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
+ <translation>File vagy alkönyvtár nem található:</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>A szolgáltatás ideiglenesen nem elérhető</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
- <translation type="unfinished"/>
+ <translation>Az elérés tiltott</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>Fájl a kizárási listán.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>Fájlnév túl nagy.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>Érvénytelen karakterek, kérjük nevezd át: %1</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>A fájlnév legalább egy érvénytelen karaktert tartalmaz!</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>a cél</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>a forrás</translation>
</message>
@@ -3434,7 +3625,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/synclogdialog.ui" line="14"/>
<source>Synchronisation Log</source>
- <translation type="unfinished"/>
+ <translation>Szinkronizálási napló</translation>
</message>
</context>
<context>
@@ -3448,17 +3639,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>%1 verzió elérhető. &lt;p&gt;További információk: &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -3489,81 +3680,81 @@ It is not advisable to use it.</source>
<translation>Belépés szükséges</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Mappa %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Nincsenek megadva szinkronizálandó mappák.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Megnyitás böngészőben</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Bejelentkezés...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Kilépés</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Legutóbbi változások</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Kezelt mappák:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>„%1” könyvtár megnyitása</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>%1 megnyitása böngészőben</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Ismeretlen állapot</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Beállítások...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Részletek...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Súgó</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>%1 kilépés</translation>
</message>
@@ -3578,11 +3769,6 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Szétcsatlakozva</translation>
@@ -3610,120 +3796,133 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="272"/>
<source>Account synchronization is disabled</source>
- <translation type="unfinished"/>
+ <translation>A fiókszinkronizálás le van tiltva</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
+ <translation>A szinkronizálás szünetel</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
- <translation type="unfinished"/>
+ <translation>Hiba történt egy szinkronizálás közben</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
- <translation type="unfinished"/>
+ <translation>Szüntesse meg az összes szinkronizálást</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
- <translation type="unfinished"/>
+ <translation>Jelentkezzen ki minden fiókból</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
- <translation type="unfinished"/>
+ <translation>Jelentkezzen be az összes fiókba ...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
- <translation type="unfinished"/>
+ <translation>Új fiók ...</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>%1 névjegye</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Mostanában nincs szinkronizált elem</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>%1/%2 szinkronizálása (%3 maradt)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>%1 szinkronizálása (%2 maradt)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>%1 szinkronizálása</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Naprakész</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation type="unfinished"/>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3735,9 +3934,9 @@ It is not advisable to use it.</source>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>TextLabel</translation>
</message>
@@ -3773,11 +3972,22 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Szinkronizálandó elemek kiválasztása</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>&amp;Helyi mappa</translation>
@@ -3794,11 +4004,16 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>M&amp;inden szinkronizálása a szerverről</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Állapotüzenet</translation>
</message>
@@ -3835,13 +4050,13 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
+ <source>An error occurred while connecting. Please try again.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="56"/>
<source>Re-open Browser</source>
- <translation type="unfinished"/>
+ <translation>Nyisd meg újra egy böngészőt</translation>
</message>
</context>
<context>
@@ -3860,7 +4075,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/wizard/owncloudsetupnocredspage.ui" line="86"/>
<source>Ser&amp;ver Address</source>
- <translation type="unfinished"/>
+ <translation>Szerver címe</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudsetupnocredspage.ui" line="102"/>
@@ -3917,12 +4132,12 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/common/utility.cpp" line="451"/>
<source>now</source>
- <translation type="unfinished"/>
+ <translation>A legtöbb</translation>
</message>
<message>
<location filename="../src/common/utility.cpp" line="453"/>
<source>Less than a minute ago</source>
- <translation type="unfinished"/>
+ <translation>Kevesebb, mint egy perce</translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="456"/>
@@ -3932,7 +4147,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/common/utility.cpp" line="459"/>
<source>Some time ago</source>
- <translation type="unfinished"/>
+ <translation>Kis idővel ezelött</translation>
</message>
<message>
<location filename="../src/libsync/syncresult.cpp" line="145"/>
@@ -3956,7 +4171,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/common/utility.cpp" line="138"/>
<source>%L1 KB</source>
- <translation type="unfinished"/>
+ <translation>%L1 KB</translation>
</message>
<message>
<location filename="../src/common/utility.cpp" line="141"/>
@@ -4015,7 +4230,7 @@ It is not advisable to use it.</source>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;Fordítva a &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; Git revizíóból, %3, %4 Qt %5, %6 felhasználásával&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4113,52 +4328,52 @@ It is not advisable to use it.</source>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Meghatározatlan állapot</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Várakozás a szinkronizálás elindulására</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>Szinkronizálás fut</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Szinkronizálás sikeres</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Szinkronizálás sikeres, néhány fájl kihagyva</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Szinkronizálási hiba</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Telepítési hiba</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Felkészülés szinkronizálásra</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Megszakítás...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>Szinkronizálás leállítva</translation>
</message>
@@ -4166,22 +4381,22 @@ It is not advisable to use it.</source>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation type="unfinished"/>
</message>
diff --git a/translations/client_it.ts b/translations/client_it.ts
index 2da0e159c..e915cb52c 100644
--- a/translations/client_it.ts
+++ b/translations/client_it.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="it" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation>Non posso creare cartelle nel cestino</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation>Impossibile muovere &apos;%1&apos; a &apos;%2&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation>Spostare il cestino non è implementato in questa piattaforma</translation>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,19 +95,19 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Connessione scaduta</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
- <translation type="unfinished"/>
+ <translation>Errore sconosciuto: la risposta di rete è stata eliminata</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
- <translation type="unfinished"/>
+ <translation>Il server ha risposto &quot;%1 %2&quot; a &quot;%3 %4&quot;</translation>
</message>
</context>
<context>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Annulla</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Account</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Scegli cosa sincronizzare</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Forza ora la sincronizzazione</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>Riavvia sincronizzazione</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>Rimuovi connessione di sincronizzazione cartelle</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Creazione della cartella non riuscita</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;Impossibile creare la cartella locale &lt;i&gt;%1&lt;/i&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>Conferma rimozione connessione di sincronizzazione cartelle</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>Rimuovi connessione di sincronizzazione cartelle</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>La sincronizzazione è in corso</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>L&apos;operazione di sincronizzazione è in corso.&lt;br/&gt;Vuoi terminarla?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 in uso</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 come &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>La versione %1 del server è datata e non supportata! Continua a tuo rischio.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Connesso a %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>Il server %1 è temporaneamente non disponibile.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation>Il Server %1 è attualmente in manutenzione</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>Disconnesso da %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
- <translation type="unfinished"/>
+ <translation>Ottenimento dell&apos;autorizzazione dal browser. &lt;a href=&apos;%1&apos;&gt;Clicca qui&lt;/a&gt; per riaprirle nel browser.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
- <translation type="unfinished"/>
+ <translation>Connessione con %1...</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>Nessuna connessione a %1 su %2.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Accedi</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>Ci sono nuove cartelle che non sono state sincronizzate poiché sono troppo grandi:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>Ci sono nuove cartelle che non sono state sincronizzate poiché sono archiviazioni esterne:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation>Ci sono nuove cartelle che non sono state sincronizzate poiché sono troppo grandi o archiviazioni esterne:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Conferma rimozione account</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Vuoi davvero eliminare la connessione all&apos;account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Nota:&lt;/b&gt; ciò &lt;b&gt;non&lt;/b&gt; eliminerà alcun file.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Rimuovi connessione</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Apri cartella</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Esci</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Riprendi la sincronizzazione</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Sospendi la sincronizzazione</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Vuoi davvero fermare la sincronizzazione della cartella &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Nota:&lt;/b&gt; ciò &lt;b&gt;non&lt;/b&gt; eliminerà alcun file.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1 (%3%) di %2 in uso. Alcune cartelle, incluse quelle montate in rete o le cartelle condivise, potrebbero avere limiti diversi.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%1% di %2 in uso</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Non ci sono informazioni disponibili sull&apos;utilizzo dello spazio di archiviazione.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>Nessuna connessione di %1 configurata.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Disconnesso</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Disconnesso</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Connesso</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Servizio non disponibile</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation>Modalità Manutenzione</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Errore di rete</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Errore di configurazione</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
- <translation type="unfinished"/>
+ <translation>Richiesta credenziali</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Stato dell&apos;account sconosciuto</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Attività del server</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Protocollo di sincronizzazione</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>Non sincronizzata</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>Non sincronizzata (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>L&apos;elenco di attività del server è stato copiato negli appunti.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>L&apos;elenco di attività di sincronizzazione è stato copiato negli appunti.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>L&apos;elenco di elementi non sincronizzati è stato copiato negli appunti.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Copiato negli appunti</translation>
</message>
@@ -469,47 +488,47 @@
<translation>EtichettaTesto</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Attività del server</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Copia</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Copia l&apos;elenco delle attività negli appunti.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Azione richiesta: notifiche</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;L&apos;account %1 non ha attività abilitate.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation><numerusform>Hai ricevuto %n nuova notifica da %2.</numerusform><numerusform>Hai ricevuto %n nuove notifiche da %2.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation><numerusform>Hai ricevuto %n nuova notifica da %1 e %2.</numerusform><numerusform>Hai ricevuto %n nuove notifiche da %1 e %2.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>Hai ricevuto nuove notifiche da %1, %2 e altri account.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>%1 notifiche - azione richiesta</translation>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Esci</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Continua</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation>Errore accedendo al file di configurazione</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation>Si è verificato un errore durante l&apos;accesso al file di configurazione su %1.</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>Esci da ownCloud</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>Errore durante la scrittura dei metadati nel database</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>Nessun account ownCloud configurato.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>Il server configurato per questo client è troppo datato</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Aggiorna all&apos;ultima versione del server e riavvia il client.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Errore di autenticazione: nome utente o password errati.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>timeout</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>Le credenziali fornite non sono corrette</translation>
</message>
@@ -637,121 +681,129 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Interrotto dall&apos;utente</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation>Il server che cerca i files risponde dati mancanti</translation>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>La cartella locale %1 non esiste.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 dovrebbe essere una cartella, ma non lo è.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 non è leggibile.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 è stato rimosso.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 è stato scaricato.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 è stato aggiornato.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 è stato rinominato in %2.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 è stato spostato in %2.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation><numerusform>%1 e %n altro file sono stati rimossi.</numerusform><numerusform>%1 e %n altri file sono stati rimossi.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation><numerusform>%1 e %n altro file sono stati scaricati.</numerusform><numerusform>%1 e %n altri file sono stati scaricati.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation><numerusform>%1 e %n altro file sono stati aggiornati.</numerusform><numerusform>%1 e %n altri file sono stati aggiornati.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation><numerusform>%1 è stato rinominato in %2 e %n altro file sono stati rinominati.</numerusform><numerusform>%1 è stato rinominato in %2 e %n altri file sono stati rinominati.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation><numerusform>%1 è stato spostato in %2 e %n altro file sono stati spostati.</numerusform><numerusform>%1 è stato spostato in %2 e %n altri file sono stati spostati.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation><numerusform>%1 e %n altro file hanno conflitti di sincronizzazione.</numerusform><numerusform>%1 e %n altri file hanno conflitti di sincronizzazione.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation>%1 ha un conflitto di sincronizzazione. Controlla il file in conflitto!</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation><numerusform>1% e %n altro file non sono stati sincronizzati a causa di errori. Controlla il log per i dettagli.</numerusform><numerusform>1% e %n altri file non sono stati sincronizzati a causa di errori. Controlla il log per i dettagli.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 non può essere sincronizzato a causa di un errore. Controlla il log per i dettagli.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Sincronizza attività</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>Impossibile leggere il file di esclusione di sistema</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation>Una nuova cartella più grande di %1 MB è stata aggiunta: %2.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation>Una nuova cartella da un&apos;archiviazione esterna è stata aggiunta.
@@ -759,12 +811,31 @@
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation>Vai nelle impostazioni e selezionala se vuoi scaricarla.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation>La cattella %1 è stata creata ma esclusa dalla sincronizzazione in prevecedenza. I dati al suo interno non saranno sincronzzati.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation>Il file %1 è stato creato ma escluso in precedenza dalla sincronizzazione. Non sarà quindi sincronizzato.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -772,29 +843,29 @@ If you decide to delete the files, they will be unavailable to you, unless you a
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Vuoi rimuovere tutti i file?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Rimuovi tutti i file</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Mantieni i file</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
@@ -803,17 +874,17 @@ Ciò potrebbe verificarsi in seguito al ripristino di un backup sul server.
Se continui normalmente la sincronizzazione provocherai la sovrascrittura di tutti i tuoi file con file più datati in uno stato precedente. Vuoi mantenere i tuoi file locali più recenti come file di conflitto?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>Backup rilevato</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>Sincronizzazione normale</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>Mantieni i file locali come conflitto</translation>
</message>
@@ -821,115 +892,105 @@ Se continui normalmente la sincronizzazione provocherai la sovrascrittura di tut
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>Impossibile ripristinare lo stato della cartella</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>È stato trovato un vecchio registro di sincronizzazione &apos;%1&apos;, ma non può essere rimosso. Assicurati che nessuna applicazione lo stia utilizzando.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation>(copia di sicurezza)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation>(copia di sicurezza %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Stato non definito.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>In attesa di iniziare la sincronizzazione.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Preparazione della sincronizzazione.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>La sincronizzazione è in corso.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>L&apos;ultima sincronizzazione è stata completata correttamente.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation>La sincronia ha avuto successo, nessun conflitto.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>Ultima sincronizzazione avvenuta, ma con avvisi relativi a singoli file.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>L&apos;ultima sincronizzazione è stata completata correttamente.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Errore di configurazione.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Interrotto dall&apos;utente.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>La sincronizzazione è sospesa.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation> %1 (La sincronizzazione è sospesa)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>Nessuna cartella valida selezionata!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>Il percorso selezionato non è una cartella!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Non hai i permessi di scrittura per la cartella selezionata!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation>La cartella locale %1 contiene un collegamento simbolico. La destinazione del collegamento contiene una cartella già sincronizzata. Selezionane un&apos;altra!</translation>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation>Esiste già una sincronizzazione dal server a questa cartella locale. Seleziona un&apos;altra cartella locale!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>La cartella locale %1 contiene già una cartella utilizzata in una connessione di sincronizzazione delle cartelle. Selezionane un&apos;altra!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>La cartella locale %1 è già contenuta in una cartella utilizzata in una connessione di sincronizzazione delle cartelle. Selezionane un&apos;altra!</translation>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation>La cartella locale %1 è un collegamento simbolico. La destinazione del collegamento è già contenuta in una cartella utilizzata in una connessione di sincronizzazione delle cartelle. Selezionane un&apos;altra!</translation>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -939,7 +1000,7 @@ Se continui normalmente la sincronizzazione provocherai la sovrascrittura di tut
<translation>Aggiungi connessioni di sincronizzazione cartelle</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>Sincronizzazione con cartella locale</translation>
</message>
@@ -974,7 +1035,7 @@ Se continui normalmente la sincronizzazione provocherai la sovrascrittura di tut
<translation>Errore durante il caricamento dell&apos;elenco delle cartelle dal server.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Disconnesso</translation>
</message>
@@ -989,115 +1050,133 @@ Se continui normalmente la sincronizzazione provocherai la sovrascrittura di tut
<translation>Ci sono conflitti irrisolti. Clicca per ulteriori dettagli. </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Controllo delle modifiche in &apos;%1&apos;</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation>Controllo per cambiamenti in &apos;%1&apos; remoto</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation>Controllo cambiamenti in &apos;%1 &apos; locale</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
- <translation type="unfinished"/>
+ <translation>Riconciliazione dei cambiamenti</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>Sincronizzazione di %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>ricezione %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>invio %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 di %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%5 rimanenti, %1 di %2, file %3 di %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 di %2, file %3 di %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>file %1 di %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>Attendere...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>In attesa di %n altra cartella...</numerusform><numerusform>In attesa di %n altre cartelle...</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>Preparazione della sincronizzazione...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>Aggiungi connessioni di sincronizzazione cartelle</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>Aggiungi connessione di sincronizzazione</translation>
</message>
@@ -1105,17 +1184,17 @@ Se continui normalmente la sincronizzazione provocherai la sovrascrittura di tut
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Fai clic per selezionare una cartella locale da sincronizzare.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Digita il percorso della cartella locale.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Seleziona la cartella di origine</translation>
</message>
@@ -1123,60 +1202,68 @@ Se continui normalmente la sincronizzazione provocherai la sovrascrittura di tut
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Crea cartella remota</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>Digita il nome della nuova cartella da creare sotto a &apos;%1&apos;:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>La cartella è stata creata correttamente su %1.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>Autenticazione non riuscita durante l&apos;accesso a %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>Non è stato possibile creare la cartella su %1. Controlla manualmente.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>Impossibile elencare una cartella. Errore: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Selezionala per sincronizzare l&apos;intero account</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Questa cartella è già sincronizzata.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Stai già sincronizzando &lt;i&gt;%1&lt;/i&gt;, che è la cartella superiore di &lt;i&gt;%2&lt;/i&gt;.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Avviso:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Avviso:&lt;/b&gt;</translation>
</message>
@@ -1184,22 +1271,22 @@ Se continui normalmente la sincronizzazione provocherai la sovrascrittura di tut
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>Nessun e-tag ricevuto dal server, controlla il proxy/gateway</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>Abbiamo ricevuto un e-tag diverso per il recupero. Riprova più tardi.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>Il server ha restituito un content-range errato</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Connessione scaduta</translation>
</message>
@@ -1222,23 +1309,38 @@ Se continui normalmente la sincronizzazione provocherai la sovrascrittura di tut
<translation>Per il vassoio di sistema</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Avanzate</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation>Chiedi conferma prima di scaricare cartelle più grandi di</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation>Chiedi conferma prima di sincronizzare storage esterni</translation>
</message>
@@ -1258,31 +1360,67 @@ Se continui normalmente la sincronizzazione provocherai la sovrascrittura di tut
<translation>Usa le icone &amp;monocolore</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>Mod&amp;ifica file ignorati</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation>Mostra le cartelle sincronizzate nel pannello di navigzoine di &amp;Explorer</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>Mostra il rapporto di c&amp;hiusura inattesa</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>Informazioni</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>Aggiornamenti</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>&amp;Riavvia e aggiorna</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1350,7 +1488,7 @@ Se continui normalmente la sincronizzazione provocherai la sovrascrittura di tut
<translation>Rimuovi</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1359,27 +1497,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
Gli elementi per i quali è consentita l&apos;eliminazione, saranno eliminati se impediscono la rimozione di una cartella. Utile per i metadati.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Impossibile aprire il file</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>Impossibile scrivere le modifiche in &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Aggiungi modello Ignora</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Aggiungi un nuovo modello di esclusione:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Questa voce è fornita dal sistema in &apos;%1&apos; e non può essere modificata in questa vista.</translation>
</message>
@@ -1409,7 +1547,7 @@ Gli elementi per i quali è consentita l&apos;eliminazione, saranno eliminati se
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Cartella</translation>
</message>
@@ -1424,35 +1562,45 @@ Gli elementi per i quali è consentita l&apos;eliminazione, saranno eliminati se
<translation>Mostra i file ignorati</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
+ <translation>Ci sono stati troppi errori. Non saranno visibili tutti qui.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation>Copia la lista dei problemi negli appunti.</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Copia</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Ora</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>File</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation>Problema</translation>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1474,40 +1622,52 @@ Gli elementi per i quali è consentita l&apos;eliminazione, saranno eliminati se
<message>
<location filename="../src/gui/logbrowser.cpp" line="89"/>
<source>&amp;Capture debug messages</source>
- <translation type="unfinished"/>
+ <translation>&amp;Cattura i messaggi di debug</translation>
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation>Salva i log permanentemente</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Cancella</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Svuota la visualizzazione del log.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>S&amp;alva</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Salva un file di log sul disco per il debug.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Salva file di log</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Errore</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>Impossibile scrivere il file di log di %1</translation>
</message>
@@ -1515,12 +1675,12 @@ Gli elementi per i quali è consentita l&apos;eliminazione, saranno eliminati se
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Errore</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;Il file &apos;%1&apos;&lt;br/&gt;non può essere aperto in scrittura.&lt;br/&gt;&lt;br/&gt;Il risultato del log &lt;b&gt;non&lt;/b&gt; può essere salvato!&lt;/nobr&gt;</translation>
</message>
@@ -1528,27 +1688,27 @@ Gli elementi per i quali è consentita l&apos;eliminazione, saranno eliminati se
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Nuova versione disponibile</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;Una nuova versione del client %1 è disponibile.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; è disponibile per lo scaricamento. La versione installata è %3.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Salta questa versione</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Salta questa volta</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Ottieni l&apos;aggiornamento</translation>
</message>
@@ -1636,27 +1796,27 @@ Gli elementi per i quali è consentita l&apos;eliminazione, saranno eliminati se
<translation>Limita automaticamente</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Nome host del server proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Nome utente del server proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Password del server proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>Proxy HTTP(S)</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>Proxy SOCKS5</translation>
</message>
@@ -1664,23 +1824,23 @@ Gli elementi per i quali è consentita l&apos;eliminazione, saranno eliminati se
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>Creato alle %1</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>Chiusura tra pochi secondi...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation>%1 richiesta non riuscita alle %2</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation>&apos;%1&apos; selezionato alle %2</translation>
@@ -1689,32 +1849,32 @@ Gli elementi per i quali è consentita l&apos;eliminazione, saranno eliminati se
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation>Messaggio di errore dal server: &lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
- <translation type="unfinished"/>
+ <translation>Si è verificato un errore accedendo al &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
- <translation type="unfinished"/>
+ <translation>Impossibile gestire la risposta JSON dal server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
- <translation type="unfinished"/>
+ <translation>La risposta del server non contiene tutti i campi attesi</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;h1&gt;Errore di login&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -1722,58 +1882,58 @@ Gli elementi per i quali è consentita l&apos;eliminazione, saranno eliminati se
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Un nuovo aggiornamento di %1 è pronto</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>Un nuovo aggiornamento di %1 sta per essere installato. L&apos;aggiornamento potrebbe richiedere privilegi aggiuntivi durante l&apos;avanzamento.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>Scaricamento della versione %1. Attendi...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>Impossibile scaricare l&apos;aggiornamento. Fai clic &lt;a href=&apos;%1&apos;&gt;qui&lt;/a&gt; per scaricare l&apos;aggiornamento manualmente.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Impossibile verificare la presenza di nuovi aggiornamenti.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>La versione %2 di %1 è disponibile. Riavvia l&apos;applicazione per iniziare l&apos;aggiornamento.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>Nuova versione %2 di %1 disponibile. Utilizza lo strumento di aggiornamento di sistema per installarla.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Controllo server degli aggiornamenti...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>Lo stato di aggiornamento è sconosciuto. Non è possibile verificare la presenza di nuovi aggiornamenti.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>Non ci sono aggiornamenti disponibili. La tua installazione è aggiornata all&apos;ultima versione.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Controllo aggiornamenti</translation>
</message>
@@ -1781,43 +1941,43 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Connetti a %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Configura le opzioni della cartella locale</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Connetti...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>La cartella &apos;%2&apos; di %1 è sincronizzata con la cartella locale &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>Sincronizza la cartella &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Avviso:&lt;/strong&gt; la cartella locale non è vuota. Scegli una soluzione.&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Cartella locale di sincronizzazione</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1876,15 +2036,20 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Connetti a %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation>Accedi tramite il tuo browser</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation>Copia link negli appunti</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1915,153 +2080,163 @@ Non è consigliabile utilizzarlo.</translation>
<source>&amp;Next &gt;</source>
<translation>Ava&amp;nti &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>URL non valido</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation>Impossibile caricare il certificato. Potrebbe essere la passwor errata ?</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Connesso correttamente a %1: %2 versione %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Connessione a %1 su %2:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>Tempo scaduto durante il tentativo di connessione a %1 su %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Tentativo di connessione a %1 su %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>La richiesta autenticata al server è stata rediretta a &apos;%1&apos;. L&apos;URL è errato, il server non è configurato correttamente.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>Ricevuta una risposta non valida a una richiesta webdav autenticata.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>Accesso negato dal server. Per verificare di avere i permessi appropriati, &lt;a href=&quot;%1&quot;&gt;fai clic qui&lt;/a&gt; per accedere al servizio con il tuo browser.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>URL non valido</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
- <translation type="unfinished"/>
+ <translation>Il server riporta il seguente errore:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>La cartella di sincronizzazione locale %1 esiste già, impostata per la sincronizzazione.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>Creazione della cartella locale di sincronizzazione %1... </translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>ok</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>non riuscita.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>Impossibile creare la cartella locale %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>Nessuna cartella remota specificata!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Errore: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>creazione cartella su ownCloud: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>La cartella remota %1 è stata creata correttamente.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>La cartella remota %1 esiste già. Connessione in corso per la sincronizzazione</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>La creazione della cartella ha restituito un codice di errore HTTP %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>La creazione della cartella remota non è riuscita poiché le credenziali fornite sono errate!&lt;br/&gt;Torna indietro e verifica le credenziali.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;La creazione della cartella remota non è riuscita probabilmente perché le credenziali fornite non sono corrette.&lt;/font&gt;&lt;br/&gt;Torna indietro e controlla le credenziali inserite.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>Creazione della cartella remota %1 non riuscita con errore &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>Una connessione di sincronizzazione da %1 alla cartella remota %2 è stata stabilita.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Connesso con successo a %1!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>La connessione a %1 non può essere stabilita. Prova ancora.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Rinomina della cartella non riuscita</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>Impossibile rimuovere o creare una copia di sicurezza della cartella poiché la cartella o un file in essa contenuto è aperta in un altro programma. Chiudi la cartella o il file e premi Riprova o annulla la configurazione.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Cartella locale %1 creata correttamente!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2069,14 +2244,31 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>Procedura guidata di connessione di %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Salta la configurazione delle cartelle</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2100,7 +2292,7 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>Risposta JSON non valida dall&apos;URL di richiesta</translation>
</message>
@@ -2108,7 +2300,7 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>Errore durante la scrittura dei metadati nel database</translation>
</message>
@@ -2116,47 +2308,47 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>Il file %1 non può essere scaricato a causa di un conflitto con un file locale.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
- <translation type="unfinished"/>
+ <translation>Il download ridurrebbe lo spazio su disco al di sotto del limite</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>Lo spazio libero su disco è inferiore a %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>Il file è stato eliminato dal server</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>Il file non può essere scaricato completamente.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation>Il file scaricato è vuoto nonostante il server indicasse una dimensione di %1.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>Il file %1 non può essere salvato a causa di un conflitto con un file locale.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>Il file è stato modificato dal suo rilevamento</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>Errore durante la scrittura dei metadati nel database</translation>
</message>
@@ -2164,12 +2356,12 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; Ripristino non riuscito: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation>Un file o una cartella è stato rimosso da una condivisione in sola lettura, ma il ripristino non è riuscito: %1</translation>
</message>
@@ -2177,22 +2369,22 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>Impossibile eliminare il file %1, errore: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>Attenzione, possibile conflitto relativo all&apos;uso di maiuscole e minuscole con %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>impossibile creare la cartella %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>Errore durante la scrittura dei metadati nel database</translation>
</message>
@@ -2200,17 +2392,17 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>Errore durante la rimozione di &apos;%1&apos;: %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>Impossibile rimuovere la cartella &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>Impossibile rimuovere %1 a causa di un conflitto con un file locale</translation>
</message>
@@ -2218,13 +2410,13 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>Il file %1 non può essere rinominato in %2 a causa di un conflitto con il nome di un file locale</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>Errore durante la scrittura dei metadati nel database</translation>
</message>
@@ -2232,12 +2424,7 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>Il file è stato rimosso da una condivisione in sola lettura. È stato ripristinato.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>Codice HTTP errato restituito dal server. Atteso 204, ma ricevuto &quot;%1 %2&quot;.</translation>
</message>
@@ -2245,12 +2432,12 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Codice HTTP errato restituito dal server. Atteso 201, ma ricevuto &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>Errore durante la scrittura dei metadati nel database</translation>
</message>
@@ -2258,28 +2445,13 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Questa cartella non può essere rinominata. Il nome originale è stato ripristinato.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Questa cartella non può essere rinominata. Ripristina il nome Shared.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>Il file è stato rinominato, ma è parte di una condivisione in sola lettura. Il file originale è stato ripristinato.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Codice HTTP errato restituito dal server. Atteso 201, ma ricevuto &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>Errore durante la scrittura dei metadati nel database</translation>
</message>
@@ -2287,33 +2459,33 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation>Il file %1 non può essere caricato poiché esiste un altro file con lo stesso nome, ma con differenze tra maiuscole e minuscole</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>File rimosso</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>Il file locale è stato modificato durante la sincronizzazione. Sarà ripristinato.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>Un file locale è cambiato durante la sincronizzazione.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
- <translation type="unfinished"/>
+ <translation>L&apos;upload eccede di %1 la quota della cartella</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>Errore durante la scrittura dei metadati nel database</translation>
</message>
@@ -2321,27 +2493,27 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>Il file locale è stato rimosso durante la sincronizzazione.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>Un file locale è cambiato durante la sincronizzazione.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation>Codice di uscita inatteso dal server (%1)</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation>File ID mancante dal server</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation>ETag mancante dal server</translation>
</message>
@@ -2349,27 +2521,22 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>Il file è stato modificato localmente, ma è parte di una condivisione in sola lettura. È stato ripristinato e la tua modifica è nel file di conflitto.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>URL di richiesta mancante</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>Il file locale è stato rimosso durante la sincronizzazione.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>Un file locale è cambiato durante la sincronizzazione.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation>Il server non ha riconosciuto l&apos;ultimo pezzo. (Non era presente alcun e-tag)</translation>
</message>
@@ -2387,42 +2554,47 @@ Non è consigliabile utilizzarlo.</translation>
<translation>EtichettaTesto</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Apri nel browser</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Ora</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>File</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Cartella</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Azione</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Dimensione</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>Protocollo di sincronizzazione locale</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Copia</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Copia l&apos;elenco delle attività negli appunti.</translation>
</message>
@@ -2463,7 +2635,7 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Scegli cosa sincronizzare</translation>
</message>
@@ -2471,33 +2643,33 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Caricamento in corso...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation>Deseleziona le cartelle remote che non desideri sincronizzare.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Nome</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Dimensione</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>Attualmente non ci sono sottocartelle sul server.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation>Si è verificato un errore durante il caricamento dell&apos;elenco delle sottocartelle.</translation>
</message>
@@ -2518,22 +2690,22 @@ Non è consigliabile utilizzarlo.</translation>
<translation>Impostazioni</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Attività</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Generale</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Rete</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Account</translation>
</message>
@@ -2541,28 +2713,28 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Attività</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Generale</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Rete</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Account</translation>
</message>
@@ -2590,42 +2762,42 @@ Non è consigliabile utilizzarlo.</translation>
<translation>Percorso di ownCloud:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>Condivisione %1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Cartella: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>Il server non consente la condivisione</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation>Recupero di tutti i permessi di condivisione possibili dal server...</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Il file non può essere condiviso poiché è stato condiviso senza il permesso di condivisione.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>Utenti e Gruppi</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>Collegamenti pubblici</translation>
</message>
@@ -2638,7 +2810,17 @@ Non è consigliabile utilizzarlo.</translation>
<translation>Condividi NuovoDocumento.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation>Solo caricamento (drop di un file)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation>Ricevere files dagli altri senza rivelare il contenuto della cartella</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>EtichettaTesto</translation>
</message>
@@ -2655,7 +2837,7 @@ Non è consigliabile utilizzarlo.</translation>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="42"/>
<source>&amp;Create new</source>
- <translation type="unfinished"/>
+ <translation>&amp;Crea nuovo</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="105"/>
@@ -2668,19 +2850,24 @@ Non è consigliabile utilizzarlo.</translation>
<translation>imposta la password</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
- <translation type="unfinished"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
+ <translation>I destinatari possono vedere o scaricare contenuti</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation>Scarica / visiona</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>Mostra elenco dei file</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation>Scarica / Visiona / Carica</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Consenti la modifica</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation>I destinatari possono vedere, scaricare, modificare, cancellare ed inviare contenuti</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2688,95 +2875,95 @@ Non è consigliabile utilizzarlo.</translation>
<translation>Chiunque sia in possesso del collegamento ha accesso al file/cartella</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>Proteggi con p&amp;assword</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Protetta da password</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Il file non può essere condiviso poiché è stato condiviso senza il permesso di condivisione.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation>La condivisione tramite link è stata disabilitata</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation>Crea collegamento pubblico</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Elimina</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation>Apri collegamento nel browser</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation>Copia link negli appunti</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
- <translation type="unfinished"/>
+ <translation>Copia negli appunti (download diretto)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Invia collegamento tramite email</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
+ <translation>Invia link tramite email (download diretto)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
- <translation type="unfinished"/>
+ <translation>Conferma la cancellazione del link di condivisione</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Annulla</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation>Collegamento pubblico</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
- <translation type="unfinished"/>
+ <translation>Cancella link condiviso</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>La condivisione pubblic&amp;a richiede una password</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>imposta la password</translation>
</message>
@@ -2799,32 +2986,32 @@ Non è consigliabile utilizzarlo.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation>L&apos;elemento non è condiviso con nessun utente o gruppo</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation>Apri collegamento nel browser</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation>Copia link negli appunti</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Invia collegamento tramite email</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>Nessun risultato per &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation>Ho condiviso qualcosa con te</translation>
</message>
@@ -2837,37 +3024,38 @@ Non è consigliabile utilizzarlo.</translation>
<translation>Modulo</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>EtichettaTesto</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>può modificare</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>può condividere</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>crea</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>cambia</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>elimina</translation>
</message>
@@ -2911,143 +3099,176 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>Condividi con %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation>Ho condiviso qualcosa con te</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation>Condividi...</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation>Copia link privato negli appunti</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation>Invia link privato per email</translation>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation>Ricondividere questo file non è permesso</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Apri nel browser</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Dettagli del certificato&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Nome comune (CN):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>Nomi alternativi soggetto (SAN):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Organizzazione (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Unità organizzativa (OU):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Stato/Regione:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>Nazione:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Numero di serie:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Emittente&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Emittente:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Emesso il:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Scade il:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Impronte digitali&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;Nota:&lt;/b&gt; questo certificato è stato approvato manualmente&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (autofirmato)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>Questa connessione è cifrata utilizzando %1 bit %2.
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation>Nessun supporto per i ticket/identificatori di sessione SSL</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Informazioni sul certificato:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>Questa connessione NON è sicura poiché non è cifrata.
@@ -3135,305 +3356,270 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Successo.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>CSync non è riuscito a scrivere il file di registro. Il file di registro è danneggiato.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;Il plugin %1 per csync non può essere caricato.&lt;br/&gt;Verifica l&apos;installazione!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>Errore grave di parametro di CSync.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>La fase di aggiornamento di CSync non è riuscita.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>La fase di riconciliazione di CSync non è riuscita.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync non è in grado di autenticarsi al proxy.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSync non è riuscito a trovare un proxy o server.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync non è riuscito ad autenticarsi al server %1.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync non è riuscito a connettersi alla rete.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>Si è verificato un timeout della connessione di rete.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>Si è verificato un errore di trasmissione HTTP.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation>La cartella montata è temporaneamente indisponibile sul server</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>Si è verificato un errore durante l&apos;apertura di una cartella</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>Errore durante la lettura della cartella.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
- <translation type="unfinished"/>
+ <translation>%1 (saltato per un errore, prova ancora tra %2)</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>Il file/cartella è ignorato poiché è nascosto.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
- <translation type="unfinished"/>
+ <translation>La gerarchia della cartella è troppo profonda</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
- <translation type="unfinished"/>
+ <translation>Conflitto: versione del server scaricata, copia locale rinominata e non caricata</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation>Sono disponibili solo %1, servono almeno %2 per iniziare</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
- <translation type="unfinished"/>
+ <translation>Non posso aprire o creare il database locale di sincronizzazione. Assicurarsi di avere il i permessi di scrittura nella cartella di sincronizzazione</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation>Non consentito poiché non disponi dei permessi per aggiungere la cartella superiore</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation>Non consentito poiché non disponi dei permessi per aggiungere file in quella cartella</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
- <translation type="unfinished"/>
+ <translation>Lo spazio su disco è scarso: I downloads che ridurranno lo spazio libero al di sotto di %1 verranno saltati.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: spazio insufficiente sul server %1.</translation>
+ <translation>Non c&apos;è spazio disponibile sul server per effettuare caricamenti.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>Errore non specificato di CSync.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Interrotto dall&apos;utente</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>CSync non è riuscito ad accedere</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation>Impossibile creare il file storico. Assicurarsi di avere permessi di lettura e scrittura nella cartella locale di sincronia</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation>Passo di scoperta fallito.</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation>Permesso negato.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
- <translation>CSync non è riuscito a caricare o a creare il file journal. Assicurati di avere i permessi di lettura e scrittura nella cartella di sincronizzazione locale.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
+ <translation>File o cartella non trovato:</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
- <translation>Problema di CSync a causa di un permesso negato non gestito.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
+ <translation>Tentativo di creare una cartella che già esiste.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
- <translation>CSync ha cercato di creare una cartella già esistente.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation>Spazio nel server %1 terminato.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>Il servizio è temporaneamente non disponibile</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>L&apos;accesso è vietato</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>SI è verificato un errore interno numero %1.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>I collegamenti simbolici non sono supportati dalla sincronizzazione.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>Il file è stato aggiunto alla lista ignorati.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation>I nomi del file che terminano con un punto non sono supportati su questo file system.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation>I nomi del file che contengono il carattere &apos;%1&apos; non sono supportati su questo file system.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation>Il nome del file è un nome riservato su questo file system.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation>Il nome del file contiene spazi alla fine.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>Il nome del file è troppo lungo.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
- <translation type="unfinished"/>
+ <translation>Il nome del file non può essere codificato sul tuo file system.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
- <translation type="unfinished"/>
+ <translation>Conflitto irrisolto.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>Stat non riuscita.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>La codifica del nome del file non è valida</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>Caratteri non validi, rinomina &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation>Impossibile leggere la lista nera dal database locale</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation>Impossibile leggere dal registro di sincronizzazione.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>Impossibile aprire il registro di sincronizzazione</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>Il nome del file contiene almeno un carattere non valido</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>Ignorato in base alla lista nera per la scelta di cosa sincronizzare</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation>Non consentito poiché non disponi dei permessi per aggiungere sottocartelle in quella cartella</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>Il caricamento di questo file non è consentito poiché è in sola lettura sul server, ripristino</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>Rimozione non consentita, ripristino</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>I file locali e la cartella condivisa sono stati rimossi.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>Spostamento non consentito, elemento ripristinato</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>Spostamento non consentito poiché %1 è in sola lettura</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>la destinazione</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>l&apos;origine</translation>
</message>
@@ -3457,17 +3643,17 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Versione %1. Per ulteriori informazioni vedi &lt;a href=&quot;%2&quot;&gt;3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;Distribuito da %1 e sotto licenza GNU General Public License (GPL) versione 2.0.&lt;br/&gt;%2 e il logo di %2 sono marchi registrati di %1 negli Stati Uniti, in altri paesi o entrambi.&lt;/p&gt;</translation>
</message>
@@ -3498,81 +3684,81 @@ Non è consigliabile utilizzarlo.</translation>
<translation>Accedi</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Cartella %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Non è stata configurata alcuna cartella per la sincronizzazione.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Apri nel browser</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Accedi...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Esci</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Modifiche recenti</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Controllo delle modifiche in &apos;%1&apos;</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Cartelle gestite:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Apri la cartella &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Apri %1 nel browser...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Stato sconosciuto</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Impostazioni...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Dettagli...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Aiuto</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>Esci da %1</translation>
</message>
@@ -3587,11 +3773,6 @@ Non è consigliabile utilizzarlo.</translation>
<translation>Versione del server non supportata</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation>Il server dell&apos;account %1 esegue una versione %2 datata e non supportata. L&apos;utilizzo del client con versioni non supportate non è sperimentato ed è potenzialmente pericoloso. Continua a tuo rischio.</translation>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Disconnesso</translation>
@@ -3623,116 +3804,129 @@ Non è consigliabile utilizzarlo.</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation>La sincronizzazione è in pausa</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation>Conflitti irrisolti</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation>Errore durante la sincronizzazione</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation>Nessuna cartella configurata per la sincronizzazione</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation>Riprendi tutte le cartelle</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>Sospendi tutte le cartelle</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>Riprendi tutte le sincronizzazioni</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>Riprendi la sincronizzazione</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>Sospendi tutte le sincronizzazioni</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>Sospendi la sincronizzazione</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Disconnetti tutti gli account</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Accedi a tutti gli account...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>Nuovo account...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>Informazioni su %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>Chiusura immediata</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Nessun elemento sincronizzato di recente</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation>Controllo per cambiamenti in &apos;%1&apos; remoto</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation>Controllo cambiamenti in &apos;%1 &apos; locale</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Sincronizzazione di %1 di %2 (%3 rimanenti)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation>Sincronizzazione di %1 di %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Sincronizzazione di %1 (%2 rimanenti)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>Sincronizzazione di %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Aggiornato</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation type="unfinished"/>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3744,9 +3938,9 @@ Non è consigliabile utilizzarlo.</translation>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>EtichettaTesto</translation>
</message>
@@ -3782,11 +3976,22 @@ Non è consigliabile utilizzarlo.</translation>
<translation>Chiedi conferma prima di sincroni&amp;zzare archiviazioni esterne</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Scegli cosa sincronizzare</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>Carte&amp;lla locale</translation>
@@ -3803,11 +4008,16 @@ Non è consigliabile utilizzarlo.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>Sincroni&amp;zza tutto dal server</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Messaggio di stato</translation>
</message>
@@ -3840,17 +4050,17 @@ Non è consigliabile utilizzarlo.</translation>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="36"/>
<source>Please switch to your browser to proceed.</source>
- <translation type="unfinished"/>
+ <translation>Prego ritorna al tuo browser per procedere.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
- <translation>Si è verificato un errore durante la connessione. Prova ancora </translation>
+ <source>An error occurred while connecting. Please try again.</source>
+ <translation>Errore di connessione. Prova tra un po&apos;.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="56"/>
<source>Re-open Browser</source>
- <translation type="unfinished"/>
+ <translation>Ri-apri browser</translation>
</message>
</context>
<context>
@@ -4024,7 +4234,7 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;Compilato dalla revisione Git &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; il %3, %4 utilizzando Qt %5, %6&lt;/small&gt;&lt;p&gt;</translation>
</message>
@@ -4122,52 +4332,52 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Stato non definito</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>In attesa di sincronizzazione</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>La sincronizzazione è in corso</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Sincronizzazione completata</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Sincronizzazione avvenuta, alcuni file sono stati ignorati.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Errore di sincronizzazione</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Errore di configurazione</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Preparazione della sincronizzazione</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Interruzione in corso...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>La sincronizzazione è sospesa</translation>
</message>
@@ -4175,22 +4385,22 @@ Non è consigliabile utilizzarlo.</translation>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation>Impossibile aprire il browser</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
- <translation type="unfinished"/>
+ <translation>Si è verificato un errore all&apos;avvio del browser per accedere all&apos;URL% 1. Forse non è stato configurato nessun browser predefinito?</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation>Impossibile aprire il client di posta</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation>Si è verificato un errore durante l&apos;avvio del client di posta per creare un nuovo messaggio. Forse non hai ancora configurato alcun client di posta predefinito?</translation>
</message>
diff --git a/translations/client_ja.ts b/translations/client_ja.ts
index 8c3166546..8e073787b 100644
--- a/translations/client_ja.ts
+++ b/translations/client_ja.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="ja_JP" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,19 +95,19 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>接続タイムアウト</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
- <translation type="unfinished"/>
+ <translation>未知のエラーです:ネットワーク応答が削除されました</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
- <translation type="unfinished"/>
+ <translation>サーバの返答は &quot;%1 %2&quot; から &quot;%3 %4&quot;です</translation>
</message>
</context>
<context>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>キャンセル</translation>
</message>
@@ -166,184 +185,184 @@
<translation>アカウント</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>同期フォルダーを選択</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>今すぐ強制的に同期</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>同期を再実行</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>同期フォルダー接続を削除</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>フォルダーの作成に失敗しました</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;ローカルフォルダー &lt;i&gt;%1&lt;/i&gt; を作成できません。</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>同期フォルダー接続の削除を確認</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>同期フォルダー接続を削除</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>同期を実行中</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>同期作業を実行中です。&lt;br/&gt;終了しますか?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 を使用中</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>&lt;i&gt;%2&lt;/i&gt; の %1</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>サーバーバージョン %1 は古くサポートされていません!自己責任で進んでください。</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>%1 に接続</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>サーバー %1 は一時的に利用できません</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation>サーバー %1 は現在メンテナンスモードです。</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>%1 からサインアウトしました。</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
- <translation type="unfinished"/>
+ <translation>ブラウザから権限を取得しています。&lt;a href=&apos;%1&apos;&gt;ここをクリック&lt;/a&gt;してブラウザを再度開いてください。 </translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation>%1 に接続中...</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>%2 の %1 への接続がありません。</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>ログイン</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>大きすぎるため同期されなかったフォルダーがあります:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>外部ストレージにあるため同期されなかったフォルダーがあります:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation>大きすぎたか、外部ストレージにあるため同期されなかったフォルダーがあります:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>アカウント削除確認</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt; アカウント &lt;i&gt;%1&lt;/i&gt; を本当に削除しますか?&lt;/p&gt;&lt;p&gt;&lt;b&gt;注意:&lt;/b&gt; これによりファイルが一切削除されることはありません。&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>接続削除</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>フォルダーを開く</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>ログアウト</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>再開</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>一時停止</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;フォルダー&lt;i&gt;%1&lt;/i&gt;の同期を本当に止めますか?&lt;/p&gt;&lt;p&gt;&lt;b&gt;注:&lt;/b&gt; これによりファイルが一切削除されることはありません。&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%2 の %1(%3%) 利用中。外部ネットワークストレージや共有フォルダーを含むフォルダーがある場合は、容量の上限値が異なる可能性があります。</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%2 のうち %1 を使用中</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>現在、利用できるストレージ利用状況はありません。</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>%1 の接続は設定されていません。</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>サインアウト</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>切断しました</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>接続しました</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>サービスが利用できません</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation>メンテナンスモード</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>ネットワークエラー</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>設定エラー</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation>証明書を要求</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>不明なアカウント状態</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>サーバーアクティビティ</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>同期状況</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>同期対象外</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>未同期 (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>サーバーアクティビティリストをクリップボードにコピーしました。</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>同期状況をクリップボードにコピーしました。</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>同期されていないアイテムのリストがクリップボードにコピーされました。</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>クリップボードにコピー</translation>
</message>
@@ -469,47 +488,47 @@
<translation>テキストラベル</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>サーバーアクティビティ</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>コピー</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>アクティビティ一覧をコピーする</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>操作が必要: 通知</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;%1 アカウントは、 アクティビティを有効にしていません。</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation><numerusform>%2 から %n の新しい通知がありました。</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation><numerusform>%1 と %2 から %n の新しい通知がありました。</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>%1 と %2 、その他アカウントから新しい通知がありました。</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>通知 %1 - 操作が必要です。</translation>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>終了</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>続ける</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation>設定ファイルのアクセスでエラーが発生しました</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation>設定ファイルの %1 行目にアクセスしている時にエラーが発生しました。</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>ownCloudを終了</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>メタデータのデータベースへの書き込みに失敗</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>ownCloudアカウントが設定されていません</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>このクライアントのサーバー設定は古すぎます。</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>サーバーを最新にアップデートして、クライアントを再起動してください。</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>認証エラー: ユーザー名またはパスワードが間違っています。</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>タイムアウト</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>入力された資格情報が正しくありません</translation>
</message>
@@ -637,133 +681,160 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>ユーザーによって中止されました</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>ローカルフォルダー %1 は存在しません。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 はフォルダーのはずですが、そうではないようです。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 は読み込み可能ではありません。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 は削除されました。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 はダウンロードされました。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 が更新されました。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 の名前が %2 に変更されました。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 は %2 に移動しました。</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation><numerusform>%1 とその他 %n 個のファイルが削除されました。</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation><numerusform>%1 とその他 %n 個のファイルがダウンロードされました。</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation><numerusform>%1 とその他 %n 個のファイルが更新されました。</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation><numerusform>%1 を %2 にファイル名を変更し、その他 %n 個のファイル名を変更しました。</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation><numerusform>%1 を %2 に移動し、その他 %n 個のファイルを移動しました。</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation><numerusform>%1 と その他 %n 個のファイルが同期で衝突しました。</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation>%1 が同期で衝突しています。コンフリクトファイルを確認してください。</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation><numerusform>エラーにより、%1 と その他 %n 個のファイルが同期できませんでした。ログで詳細を確認してください。</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>エラーにより %1 が未同期です。ログで詳細を確認してください。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>同期アクティビティ</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>システム上の除外ファイルを読み込めません</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation>%1 MB より大きな新しいフォルダーが追加されました: %2
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation>外部ストレージからフォルダーが追加されました。
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation>このフォルダーをダウンロードするには設定画面で選択してください。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -774,7 +845,7 @@ If you decide to delete the files, they will be unavailable to you, unless you a
「すべてのファイルを削除」を選択すると、あなたが所有者でない限り、ファイルは使用できなくなります。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
@@ -783,39 +854,39 @@ If this was an accident and you decide to keep your files, they will be re-synce
「ファイルを残す」を選択した場合、ファイルはサーバーから再同期されます。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>すべてのファイルを削除しますか?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>すべてのファイルを削除</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>ファイルを残す</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
<translation>この同期により同期フォルダー &apos;%1&apos; のファイルが以前のものに戻されます。 これは、バックアップがサーバー上に復元されたためです。 通常と同じように同期を続けると、すべてのファイルが以前の状態の古いファイルによって上書きされます。最新のローカルファイルを競合ファイルとして保存しますか?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>バックアップが検出されました</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>正常同期</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>コンフリクト時にローカルファイルを保持</translation>
</message>
@@ -823,115 +894,105 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>フォルダーの状態をリセットできませんでした</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>古い同期ジャーナル &apos;%1&apos; が見つかりましたが、削除できませんでした。それを現在使用しているアプリケーションが存在しないか確認してください。</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation>(バックアップ)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation>(%1をバックアップ)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>未定義の状態。</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>同期開始を待機中</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>同期の準備中。</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>同期を実行中です。</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>最後の同期は成功しました。</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>最新の同期は成功しました。しかし、一部のファイルに問題がありました。</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>最後の同期は成功しました。</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>設定エラー。</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>ユーザーによる中止。</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>同期を一時停止しました。</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (同期を一時停止)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>有効なフォルダーが選択されていません!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>指定のパスは、フォルダーではありません!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>選択されたフォルダーに書き込み権限がありません</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation>ローカルフォルダー %1 にはシンボリックリンクが含まれています。リンク先にはすでに同期されたフォルダーが含まれているため、別のフォルダーを選択してください!</translation>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation>すでに同期されたフォルダーがあります。別のフォルダーを選択してください!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>ローカルフォルダー %1 にはすでに同期フォルダーとして利用されてるフォルダーを含んでいます。他のフォルダーを選択してください。</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>ローカルフォルダー %1 には同期フォルダーとして利用されているフォルダーがあります。他のフォルダーを選択してください。</translation>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation>ローカルフォルダー %1 には同期フォルダーとして利用されているフォルダーがあります。他のフォルダーを選択してください!</translation>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -941,7 +1002,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>同期フォルダーを追加</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>ローカルフォルダーを同期中</translation>
</message>
@@ -976,7 +1037,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>サーバーからフォルダーのリスト取得時にエラー</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>サインアウト</translation>
</message>
@@ -991,115 +1052,133 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>未解決の競合があります。クリックで詳細。</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>&apos;%1&apos; の更新を確認しています</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>同期中 %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>ダウンロード %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>アップロード %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%4 中 %3 完了)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>残り%5、%2中%1完了 、ファイル%4個中%3個完了</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 of %2, ファイル数 %3 of %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>%1 / %2 ファイル</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>待機中...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>%n 他のフォルダーの完了待ち...</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>同期の準備中...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>同期フォルダーを追加</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>同期接続を追加</translation>
</message>
@@ -1107,17 +1186,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>同期したいローカルフォルダーをクリックしてください。</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>ローカルフォルダーのパスを入力してください。</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>ソースフォルダーを選択</translation>
</message>
@@ -1125,60 +1204,68 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>リモートフォルダーを追加</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation> &apos;%1&apos;の下に新しいフォルダーの名前を入力:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>%1 にフォルダーが作成されました。</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>%1 アクセス中に認証に失敗しました</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>%1 にフォルダーを作成できませんでした。手作業で確認してください。</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>フォルダーをリストアップできません。エラー: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>アカウント全体を同期する場合はこちらを選択</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>このフォルダーはすでに同期されています。</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>&lt;i&gt;%1&lt;/i&gt;は、&lt;i&gt;%2&lt;/i&gt;の親フォルダーですでに同期しています。</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;警告:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;警告:&lt;/b&gt; </translation>
</message>
@@ -1186,22 +1273,22 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>サーバーからE-Tagを受信できません。プロキシ/ゲートウェイを確認してください。</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>同期再開時に違う E-Tagを受信しました。次回リトライします。</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>サーバーが間違ったcontent-rangeを返しました</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>接続タイムアウト</translation>
</message>
@@ -1224,23 +1311,38 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>システムトレイ</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation>安定</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation>ベータ</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>詳細設定</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation>指定された容量以上のフォルダーは同期前に確認する</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation>外部ストレージと同期する前に確認する</translation>
</message>
@@ -1260,31 +1362,67 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>モノクロアイコンを使用(&amp;M)</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>除外ファイルリストを編集(&amp;I)</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>クラッシュ報告を表示(&amp;H)</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>バージョン情報</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>アップデート</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>再起動してアップデート(&amp;R)</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>キャンセル</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1352,7 +1490,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>削除</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1361,27 +1499,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
パターンによってディレクトリを削除から除外する場合は,パターンに含まれた項目も削除されます。例えばメタデータファイルに有用です。</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>ファイルが開けませんでした</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>&apos;%1&apos;を更新できません。</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>除外するファイルパターンを追加</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>除外するファイルパターンを新しく追加:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>このエントリーは、システム &apos;%1&apos; から提供されています。この画面では変更できません。</translation>
</message>
@@ -1411,7 +1549,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>フォルダー</translation>
</message>
@@ -1426,35 +1564,45 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation>除外ファイルを表示</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
+ <translation>問題が多すぎます。すべてはここに表示できません。</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
- <translation type="unfinished"/>
+ <translation>問題リストをクリップボードにコピーしてください。</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>コピー</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>時刻</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>ファイル</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation>問題</translation>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1480,36 +1628,48 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>クリア</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>ログの表示をクリアする。</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>保存(&amp;A)</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>デバッグ目的でディスクにログファイルを保存する</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>ログファイルを保存</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>エラー</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>ログファイル%1に書き込みできませんでした。</translation>
</message>
@@ -1517,12 +1677,12 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>エラー</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;ファイル &apos;%1&apos;&lt;br/&gt;を書き込み用で開けませんでした。&lt;br/&gt;&lt;br/&gt;ログ出力を&lt;b&gt;保存できません&lt;/b&gt;でした!&lt;/nobr&gt;</translation>
</message>
@@ -1530,27 +1690,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>新しいバージョンが利用可能です</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;%1 クライアントの新しいバージョンが利用可能です。&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; がダウンロード可能です。インストールされているバージョンは %3 です。&lt;p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>今回のバージョンをスキップ</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>今回はスキップ</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>アップデートを取得</translation>
</message>
@@ -1638,27 +1798,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation>自動的に制限</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>プロキシサーバーのホスト名</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>プロキシサーバーのユーザー名</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>プロキシサーバーのパスワード</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>HTTP(S)プロキシ</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>SOCKS5プロキシ</translation>
</message>
@@ -1666,23 +1826,23 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>%1 を作成しました。</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>数秒以内に接続を終了します。</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation>リクエスト %1 が %2 に失敗 </translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation>&apos;%1&apos; が %2 に選択されました</translation>
@@ -1691,91 +1851,91 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
- <translation type="unfinished"/>
+ <translation>サーバからエラーが返されました: &lt;em&gt;%1&lt;/em&gt; </translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
- <translation type="unfinished"/>
+ <translation>サーバからの返答にあるべきフィールドがありません</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;h1&gt;ログインエラー&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt; </translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;h1&gt;ユーザの誤りです&lt;/h1&gt;&lt;p&gt;&lt;em&gt;%1&lt;/em&gt;としてログインされましたがm、&lt;em&gt;%2&lt;/em&gt;でなければいけません。&lt;br&gt;別のタブで %3 からログアウトし、&lt;a href=&apos;%4&apos;&gt;ここをクリック&lt;/a&gt;して %2 としてログインしてください&lt;/p&gt; </translation>
</message>
</context>
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>新しい %1 アップデートの準備完了</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>%1 の新しいアップデートのインストール準備ができました。アップデートのインストール中、追加の権限が必要な場合があります。</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>バージョン %1 をダウンロードしています。しばらくお待ちください...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>アップデートをダウンロードできませんでした。手動でアップデートするには、&lt;a href=&apos;%1&apos;&gt;ここ&lt;/a&gt; をクリックしてください。 </translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>アップデートを確認できませんでした。</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>%1 のバージョン %2 が利用できます。アップデートを開始するためにアプリケーションを再起動してください。</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>%1 の新しいバージョン %2 に更新できます。アプリのアップデートツールでインストールしてください。</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>アップデートをチェックしています....</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>更新状況が不明です: 更新をチェックしていません。</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>利用可能なアップデートはありません。最新版がインストールされています。</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>アップデートを確認</translation>
</message>
@@ -1783,43 +1943,43 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>%1 に接続中</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>ローカルフォルダーのオプションを設定</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>接続...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1 フォルダー &apos;%2&apos; はローカルフォルダー &apos;%3&apos; と同期しています</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>&apos;%1&apos; フォルダーを同期</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;警告:&lt;/strong&gt; ローカルフォルダーは空ではありません。解決方法を選択してください!&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>ローカル同期フォルダー</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1878,14 +2038,19 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>%1 に接続中</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
- <translation type="unfinished"/>
+ <translation>御自身のブラウザでログインしてください</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation>クリップボードにリンクをコピー</translation>
</message>
</context>
<context>
@@ -1916,153 +2081,163 @@ It is not advisable to use it.</source>
<source>&amp;Next &gt;</source>
<translation>次(&amp;N) &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>無効なURL</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;正常に %1 へ接続されました:%2 バージョン %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>%2 の %1 に接続に失敗:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>%2 の %1 へ接続を試みた際にタイムアウトしました。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>%2 の %1 へ接続を試みています...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>サーバーへの認証リクエストは &apos;%1&apos; へリダイレクトされました。URLは不正です、サーバーの設定に誤りがあります。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>認証された WebDav リクエストに不正な応答がありました</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>サーバーによってアクセスが拒否されています。適切なアクセス権があるか検証するには、&lt;a href=&quot;%1&quot;&gt;ここをクリック&lt;/a&gt;してブラウザーでサービスにアクセスしてください。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>無効なURL</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
- <translation type="unfinished"/>
+ <translation>サーバが以下のエラーを報告しています:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>ローカルの同期フォルダー %1 はすでに存在するため、同期の設定をしてください。&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>ローカル同期フォルダー %1 を作成中...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>失敗。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>ローカルフォルダー %1 を作成できませんでした</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>リモートフォルダーが指定されていません!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>エラー: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>ownCloud上にフォルダーを作成中: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>リモートフォルダー %1 は正常に生成されました。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>リモートフォルダー %1 はすでに存在します。同期のために接続しています。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>フォルダーの作成はHTTPのエラーコード %1 で終了しました</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>指定された資格情報が間違っているため、リモートフォルダーの作成に失敗しました!&lt;br/&gt;前に戻って資格情報を確認してください。&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;おそらく資格情報が間違っているため、リモートフォルダーの作成に失敗しました。&lt;/font&gt;&lt;br/&gt;前に戻り、資格情報をチェックしてください。&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>リモートフォルダー %1 の作成がエラーで失敗しました。&lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>%1 からリモートディレクトリ %2 への同期接続を設定しました。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>%1への接続に成功しました!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>%1 への接続を確立できませんでした。もう一度確認してください。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>フォルダー名の変更に失敗しました。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>フォルダーまたはその中にあるファイルが他のプログラムで開かれているため、フォルダーの削除やバックアップができません。フォルダーまたはファイルを閉じてから再試行するか、セットアップをキャンセルしてください。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;ローカルの同期フォルダー %1 は正常に作成されました!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2070,14 +2245,31 @@ It is not advisable to use it.</source>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>%1 接続ウィザード</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>フォルダー設定をスキップ</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2101,7 +2293,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>不正なJSONがポーリングURLから返りました</translation>
</message>
@@ -2109,7 +2301,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>メタデータのデータベースへの書き込みに失敗</translation>
</message>
@@ -2117,47 +2309,47 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>ファイル %1 はローカルファイル名が衝突しているためダウンロードできません!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>ディスク空き容量が %1 よりも少なくなっています</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>ファイルはサーバーから削除されました</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>このファイルのダウンロードは完了しませんでした</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation>サーバーが通知しているファイルは %1 であるべきですが、ダウンロードファイルは空でした。</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>%1 はローカルファイル名が衝突しているため保存できません!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>ファイルは発見以降に変更されました</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>メタデータのデータベースへの書き込みに失敗</translation>
</message>
@@ -2165,12 +2357,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; 復元に失敗: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation>ファイルまたはフォルダーが読み込み専用の共有から削除されましたが、復元に失敗しました: %1</translation>
</message>
@@ -2178,22 +2370,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>ファイル %1 を削除できません。エラー: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>注意: %1 で大文字小文字が競合している可能性</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>フォルダー %1 を作成できません</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>メタデータのデータベースへの書き込みに失敗</translation>
</message>
@@ -2201,17 +2393,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>&apos;%1&apos;の削除エラー: %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>フォルダー &apos;%1&apos;を削除できません</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>%1 はローカルファイル名が衝突しているため削除できませんでした</translation>
</message>
@@ -2219,13 +2411,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>ファイル %1 はローカルファイル名が衝突しているため %2 に名前を変更できません</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>メタデータのデータベースへの書き込みに失敗</translation>
</message>
@@ -2233,12 +2425,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>ファイルが読み込み専用の共有から削除されました。ファイルは復元されました。</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>誤ったHTTPコードがサーバーから返されました。204のはずが、&quot;%1 %2&quot;が返りました。</translation>
</message>
@@ -2246,12 +2433,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>誤ったHTTPコードがサーバーから返されました。201のはずが、&quot;%1 %2&quot;が返りました。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>メタデータのデータベースへの書き込みに失敗</translation>
</message>
@@ -2259,28 +2446,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>このフォルダー名は変更できません。元の名前に戻します。</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>このフォルダー名は変更できません。名前を Shared に戻してください。</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>ファイルの名前が変更されましたが、読み込み専用の共有の一部です。オリジナルのファイルが復元されました。</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>誤ったHTTPコードがサーバーから返されました。201のはずが、&quot;%1 %2&quot;が返りました。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>メタデータのデータベースへの書き込みに失敗</translation>
</message>
@@ -2288,33 +2460,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation>ファイル %1 は、大文字と小文字の区別が違う同じ名前のファイルが存在するためアップロードできません</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>ファイルを削除しました</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>ローカルファイルが同期中に変更されました。再開されます。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>ローカルのファイルが同期中に変更されました。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>メタデータのデータベースへの書き込みに失敗</translation>
</message>
@@ -2322,27 +2494,27 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>ローカルファイルを同期中に削除します。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>ローカルのファイルが同期中に変更されました。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation>サーバー (%1) からの予期しない戻りコード</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation>サーバーからファイルIDの戻りがありません</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation>サーバーからETagの戻りがありません</translation>
</message>
@@ -2350,27 +2522,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>ファイルがローカルで編集されましたが、読み込み専用の共有の一部です。ファイルは復元され、あなたの編集は競合するファイル内にあります。</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>ポーリングURLがありません</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>ローカルファイルを同期中に削除します。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>ローカルのファイルが同期中に変更されました。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation>サーバーは最終チャンクを認識しませんでした。(e-tag が存在しませんでした)</translation>
</message>
@@ -2388,42 +2555,47 @@ It is not advisable to use it.</source>
<translation>テキストラベル</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>ブラウザーで開く</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>時刻</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>ファイル</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>フォルダー</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>アクション</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>サイズ</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>ローカルファイル同期状況</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>コピー</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>アクティビティ一覧をコピーする</translation>
</message>
@@ -2464,7 +2636,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>同期フォルダーを選択</translation>
</message>
@@ -2472,33 +2644,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>読込中 ...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation>同期したくないリモートのサブフォルダーは、同期対象から外せます。</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>名前</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>サイズ</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>現在サーバーにサブフォルダーはありません。</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation>サーバーからフォルダーのリスト取得時にエラーが発生しました。</translation>
</message>
@@ -2519,22 +2691,22 @@ It is not advisable to use it.</source>
<translation>設定</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>アクティビティ</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>一般</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>ネットワーク</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>アカウント</translation>
</message>
@@ -2542,28 +2714,28 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>アクティビティ</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>一般</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>ネットワーク</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>アカウント</translation>
</message>
@@ -2591,42 +2763,42 @@ It is not advisable to use it.</source>
<translation>OwnCloudのパス:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>%1 を共有中</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>フォルダー: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>サーバーで共有を許可していません</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation>サーバーから共有権限を取得できる最大数で取得しています</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>再共有権限がない共有ため、このファイルは共有できません。</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>ユーザーとグループ</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>公開リンク</translation>
</message>
@@ -2639,7 +2811,17 @@ It is not advisable to use it.</source>
<translation>Share NewDocument.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>テキストラベル</translation>
</message>
@@ -2669,19 +2851,24 @@ It is not advisable to use it.</source>
<translation>パスワードを設定</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>ファイルリストを表示</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation>ダウンロード / 表示</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>編集を許可</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation>ダウンロード / 表示 / アップロード</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2689,95 +2876,95 @@ It is not advisable to use it.</source>
<translation>リンクを知っている人はファイル/フォルダーにアクセスできます</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>パスワード保護(&amp;A)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>パスワード保護</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>再共有権限がない共有ため、このファイルは共有できません。</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>削除</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
- <translation type="unfinished"/>
+ <translation>ブラウザでリンクを開く</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
- <translation type="unfinished"/>
+ <translation>クリップボードにリンクをコピー</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>メールでリンクを送信</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>キャンセル</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>共有するにはパスワードが必要(&amp;A)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>パスワードを入力してください</translation>
</message>
@@ -2800,32 +2987,32 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
- <translation type="unfinished"/>
+ <translation>ブラウザでリンクを開く</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
- <translation type="unfinished"/>
+ <translation>クリップボードにリンクをコピー</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>メールでリンクを送信</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>&apos;%1&apos; は見つかりませんでした</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
@@ -2838,37 +3025,38 @@ It is not advisable to use it.</source>
<translation>フォーム</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>テキストラベル</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>編集を許可</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>共有可</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>…</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>作成</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>更新</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>削除</translation>
</message>
@@ -2912,143 +3100,176 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>%1 と共有</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>ブラウザーで開く</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;詳細認証情報&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>コモンネーム(CN):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>サブジェクトの別名:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>組織(O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>部門名(OU):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>州/県:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>国:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>シリアル番号:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;発行者&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>発行者: </translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>発行日:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>有効期限:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;フィンガープリント&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;注意:&lt;/b&gt; この認証は手動で承認されました&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (自己証明書)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>この接続は、%1 の %2 bit を使って暗号化されています。
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation>SSLセッションチケット/識別子はサポートされていません</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>認証情報:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>暗号化されていないので、この接続は安全ではありません。
@@ -3136,305 +3357,270 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>成功。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>CSyncはジャーナルファイルの読み込みに失敗しました。ジャーナルファイルが破損しています。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;csync 用の %1 プラグインをロードできませんでした。&lt;br/&gt;インストール状態を確認してください!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>CSyncの致命的なパラメータエラーです。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>CSyncの処理ステップの更新に失敗しました。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>CSyncの処理ステップの調停に失敗しました。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSyncはそのプロキシで認証できませんでした。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSyncはプロキシもしくはサーバーの参照に失敗しました。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSyncは %1 サーバーでの認証に失敗しました。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSyncはネットワークへの接続に失敗しました。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>ネットワーク接続のタイムアウトが発生しました。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>HTTPの伝送エラーが発生しました。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation>サーバー上のマウント済フォルダーが一時的に利用できません。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>フォルダーを開く際にエラーが発生しました</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>フォルダーの読み込みエラー</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>隠しファイル/フォルダーのため無視されました</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation>%1 しか空き容量がありません、開始するためには少なくとも %2 は必要です。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation>親フォルダーを追加する権限がありません</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation>そのフォルダーにファイルを追加する権限がありません</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: %1 サーバーには利用可能な空き領域がありません。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>CSyncの未指定のエラーです。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>ユーザーによって中止されました</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>CSync は接続できませんでした</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
- <translation>CSyncはジャーナルファイルの読み込みや作成に失敗しました。ローカルの同期フォルダーに読み書きの権限があるか確認してください。</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
- <translation>CSync が処理できないパーミション拒否により失敗しました</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
- <translation>CSyncはすでに存在するフォルダーを作成しようとしました。</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>サーバーは一時的に利用できません</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>アクセスが禁止されています</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>内部エラー番号 %1 が発生しました。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>同期機能はシンボリックリンクをサポートしていません。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>ファイルは除外リストに登録されています。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation>末尾にピリオドを使うファイル名はサポートされていません</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation>ファイル名に使用できない文字列が含まれています: &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation>ファイル名はこのファイルシステムで予約されている名前です。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation>ファイル名末尾にスペースが含まれます。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>ファイル名が長すぎます</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>情報取得エラー</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>ファイル名のエンコーディングが無効です。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>無効な文字です、&quot;%1&quot; を変更してください。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation>ローカルデータベースからブラックリストを読み込みできません</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation>同期ジャーナルから読み込みできません</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>同期ジャーナルを開くことができません</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>ファイル名に1文字以上の無効な文字が含まれています</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>&quot;同期対象先&quot; ブラックリストにより無視されました。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation>そのフォルダーにサブフォルダーを追加する権限がありません</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>サーバーでは読み取り専用となっているため、このファイルをアップロードすることはできません、復元しています</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>削除できないので復元しています</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>ローカルファイルと共有フォルダーを削除しました。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>移動できないので項目を復元しました</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>%1 は読み取り専用のため移動できません</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>移動先</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>移動元</translation>
</message>
@@ -3458,17 +3644,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;バージョン %1. 詳細な情報は&lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;を確認してください。&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;%1 が配布し、 GNU General Public License (GPL) バージョン2.0 の下でライセンスされています。&lt;br/&gt;%2 及び %2 のロゴはアメリカ合衆国またはその他の国、あるいはその両方における %1 の登録商標です。&lt;/p&gt;</translation>
</message>
@@ -3499,81 +3685,81 @@ It is not advisable to use it.</source>
<translation>サインインしてください</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>フォルダー %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>同期するフォルダーがありません。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>ブラウザーで開く</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>ログイン...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>ログアウト</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>最近変更されたファイル</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>&apos;%1&apos; の更新を確認しています</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>管理フォルダー:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>フォルダー ’%1’ を開く</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>%1をブラウザーで開く</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>不明な状態</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>設定...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>詳細...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>ヘルプ</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>%1 を終了</translation>
</message>
@@ -3588,11 +3774,6 @@ It is not advisable to use it.</source>
<translation>サポートされていないサーバーバージョン</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation>%1 アカウントのサーバーのバージョン %2 は古く、未サポートです。この未サポートのサーバーバージョンとこのクライアントでの組み合わせは、未テストで潜在的な危険があります。ご利用は自己責任でお願いいたします。</translation>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>切断しました</translation>
@@ -3624,116 +3805,129 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation>すべてのフォルダーの同期を再開</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>すべてのフォルダーの同期を一時停止</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>すべての同期を再開</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>同期を再開</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>すべての同期を一時停止</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>同期を一時停止</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>全てのアカウントからログアウト</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>全てのアカウントにログイン</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>新規アカウント...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>%1 について</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>クラッシュしました。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>最近同期されたアイテムはありません。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>同期中 %2 中 %1 (残り %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation>%2 の %1 を同期しています</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>同期中 %1 (残り %2)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>同期中 %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>最新です</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation type="unfinished"/>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3745,9 +3939,9 @@ It is not advisable to use it.</source>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>テキストラベル</translation>
</message>
@@ -3783,11 +3977,22 @@ It is not advisable to use it.</source>
<translation>外部ストレージと同期する前に確認する(&amp;X)</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>同期フォルダーを選択</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>ローカルフォルダー(&amp;L)</translation>
@@ -3804,11 +4009,16 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>サーバーからすべてのファイルを同期(&amp;Y)</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>状態メッセージ</translation>
</message>
@@ -3845,7 +4055,7 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
+ <source>An error occurred while connecting. Please try again.</source>
<translation type="unfinished"/>
</message>
<message>
@@ -4025,7 +4235,7 @@ It is not advisable to use it.</source>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; %3, %4 のGitリビジョンからのビルド Qt %5, %6 を利用&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4123,52 +4333,52 @@ It is not advisable to use it.</source>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>未定義の状態</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>同期開始を待っています</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>同期を実行中</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>同期成功</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>同期が完了しました。一部のファイルが除外されました。</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>同期エラー</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>設定エラー</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>同期の準備中</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>中止しています...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>同期を一時停止</translation>
</message>
@@ -4176,22 +4386,22 @@ It is not advisable to use it.</source>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
- <translation type="unfinished"/>
+ <translation>ブラウザを開くことができませんでした。</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
- <translation type="unfinished"/>
+ <translation>URL %1 をブラウザで開く際にエラーが発生しました。おそらくデフォルトのブラウザが設定されていないのでは?</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation>電子メールクライアントを開くことができませんでした</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation>メールクライアントを起動して新しいメッセージを作成するときにエラーが発生しました。デフォルトのメールクライアントが設定されていませんか?</translation>
</message>
diff --git a/translations/client_nb_NO.ts b/translations/client_nb_NO.ts
index 46fa85f73..dec8885ba 100644
--- a/translations/client_nb_NO.ts
+++ b/translations/client_nb_NO.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="nb_NO" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation>Kunne ikke lage kataloger i søppelbøtten</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation>Kunne ikke flytte &apos;%1&apos; til &apos;%2&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation>Flytting til søppelbøtten er ikke støttet på denne plattformen</translation>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,17 +95,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Forbindelsen fikk tidsavbrudd</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation>Ukjent feil: nettverkssvar ble slettet</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation>Server svarte &quot;%1 %2&quot; til &quot;%3 %4&quot;</translation>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Avbryt</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Konto</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Velg hva som synkroniseres</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Tving synkronisering nå</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>Prøv synkronisering igjen</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>Fjern tilkobling for mappe-synkronisering</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Oppretting av mappe feilet</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;Klarte ikke å opprette lokal mappe &lt;i&gt;%1&lt;/i&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>Bekreft fjerning av tilkobling for mappe-synkronisering</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>Fjern tilkobling for mappe-synkronisering</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Synkroniserer...</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>Synkronisering kjører.&lt;br/&gt;Vil du avbryte den?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 i bruk</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 som &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>Server-versjonen %1 er gammel og støttes ikke! Fortsett på egen risiko.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Tilkoblet %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>Server %1 er midlertidig utilgjengelig.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation>Server %1 er for øyeblikket i vedlikeholdsmodus.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>Logget ut fra %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
- <translation type="unfinished"/>
+ <translation>Hente autorisasjon fra nettleseren. &lt;a href=&apos;%1&apos;&gt;Klikk her &lt;/a&gt; for å åpne nettleseren på nytt.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation>Kobler til %1...</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>Ingen tilkobling til %1 på %2.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Logg inn</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>Noen mapper ble ikke synkronisert fordi de er for store</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>Noen mapper ble ikke synkronisert fordi de er eksterne lagringsplasser:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation>Noen mapper ble ikke synkronisert fordi de er for store eller de er eksterne lagringsplasser:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Bekreft fjerning av konto</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Vil du virkelig fjerne tilkoblingen til kontoen &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Merk:&lt;/b&gt; Dette vil &lt;b&gt;ikke&lt;/b&gt; slette noen filer.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Fjern tilkobling</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Åpne mappe</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Logg ut</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Fortsett synkronisering</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Sett synkronisering på pause</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Vil du virkelig stoppe synkronisering av mappen &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Merk:&lt;/b&gt; Dette vil &lt;b&gt;ikke&lt;/b&gt; slette noen filer.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1 (%3%) av %2 i bruk. Noen mapper, inkludert nettverkstilkoblede eller delte mapper, kan ha andre begrensninger.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%1 av %2 i bruk</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Ingen informasjon om bruk av lagringsplass tilgjengelig for øyeblikket.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>Ingen %1-forbindelse konfigurert.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Logget ut</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Frakoblet</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Tilkoblet</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Tjeneste utilgjengelig</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation>Vedlikeholdsmodus</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Nettverksfeil</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Konfigurasjonsfeil</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
- <translation type="unfinished"/>
+ <translation>Be om legitimasjon</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Ukjent kontotilstand</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Server-aktivitet</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Synkroniseringsprotokoll</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>Ikke synkronisert</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>Ikke synkronisert (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>Server-aktivitetslisten er kopiert til utklippstavlen.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>Synkroniserings-aktivitetslisten er kopiert til utklippstavlen.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>Listen med usynkroniserte elementer ble kopiert til utklippstavlen.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Kopiert til utklippstavlen</translation>
</message>
@@ -469,47 +488,47 @@
<translation>Tekst-etikett</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Server-aktiviteter</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Kopier</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Kopier aktivitetslisten til utklippstavlen.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Handling kreves: Varsler</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;Konto %1 har ikke aktiviteter aktivert.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation><numerusform>Du mottok %n nytt varsel fra %2.</numerusform><numerusform>Du mottok %n nye varsler fra %2.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation><numerusform>Du mottok %n nytt varsel fra %1 og %2.</numerusform><numerusform>Du mottok %n nye varsler fra %1 og %2.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>Du mottok nye varsler fra %1, %2 og andre kontoer.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>%1 varsler - Handling kreves</translation>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation>Å fortsette vil&lt;b&gt; slette disse innstillingene &lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation>Å fortsette vil &lt;b&gt; ignorere disse innstillingene &lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Avslutt</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Fortsett</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation>Feil ved lesing av konfigurasjonsfil</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation>En feil oppstod ved aksessering av konfigurasjonsfilen på %1.</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>Avslutt ownCloud</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>Feil ved skriving av metadata til databasen</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>Ingen ownCloud-konter konfigurert</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>Den konfigurerte serveren for denne klienten er for gammel</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Vennligst oppdatert til den nyeste serveren og start klienten på nytt.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Autentiseringsfeil: Bruker navn eller passord er feil.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>tidsavbrudd</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>Oppgitt påloggingsinformasjon er feil</translation>
</message>
@@ -637,132 +681,159 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Avbrutt av brukeren</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation>Server fil oppdagelse svaret mangler data. </translation>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>Lokal mappe %1 eksisterer ikke.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 skal være en mappe men er ikke det.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 kan ikke leses.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 har blitt fjernet.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 har blitt lastet ned.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 har blitt oppdatert.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 har blitt omdøpt til %2.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 har blitt flyttet til %2.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation><numerusform>%1 og %n annen fil har blitt fjernet.</numerusform><numerusform>%1 og %n andre filer har blitt fjernet.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation><numerusform>%1 og %n annen fil har blitt lastet ned.</numerusform><numerusform>%1 og %n andre filer har blitt lastet ned.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation><numerusform>%1 og %n annen fil har blitt oppdatert.</numerusform><numerusform>%1 og %n andre filer har blitt oppdatert.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation><numerusform>%1 er blitt omdøpt til %2 og %n annen fil har blitt omdøpt.</numerusform><numerusform>%1 er blitt omdøpt til %2 og %n andre filer har blitt omdøpt.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation><numerusform>%1 er blitt flyttet til %2 og %n annen fil har blitt flyttet.</numerusform><numerusform>%1 er blitt flyttet til %2 og %n andre filer har blitt flyttet.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation><numerusform>%1 og %n andre filer har synkroniseringskonflikter.</numerusform><numerusform>%1 og %n andre filer har synkroniseringskonflikter.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation>%1 har en synkroniseringskonflikt. Sjekk konflikt-filen.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation><numerusform>%1 og %n andre filer kunne ikke synkroniseres pga. feil. Se loggen for detaljer.</numerusform><numerusform>%1 og %n andre filer kunne ikke synkroniseres pga. feil. Se loggen for detaljer.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 kunne ikke synkroniseres pga. en feil. Se loggen for detaljer.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Synkroniseringsaktivitet</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>Klarte ikke å lese systemets ekskluderingsfil</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation>En ny mappe større enn %1 MB er blitt lagt til: %2.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation>En mappe fra et eksternt lager er blitt lagt til.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation>Gå til Innstillinger og velg den hvis du ønsker å laste den ned.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation>Mappen %1  var laget, men har tidligere blitt ekskludert fra synkronisering. Data i mappen vil derfor ikke bli synkronisert. </translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -773,7 +844,7 @@ Hvis du velger å beholde filene, vil de bli synkronisert tilbake til serveren h
Hvis du velger å slette filene, blir de utilgjengelige for deg hvis du ikke er eieren av filen.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
@@ -782,22 +853,22 @@ Er du sikker på at du ønsker å synkronisere denne handlingen med serveren?
Hvis det var et uhell og du velger å beholde filene, vil de bli synkronisert tilbake fra serveren.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Fjerne alle filer?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Fjern alle filer</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Behold filer</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
@@ -806,17 +877,17 @@ Dette kan være fordi en backup ble gjenopprettet på serveren.
Hvis synkroniseringen fortsetter som normalt, vil alle filene dine bli overskrevet av en eldre fil i en tidligere tilstand. Ønsker du å beholde dine ferskeste lokale filer som konflikt-filer?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>Backup oppdaget</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>Normal synkronisering</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>Behold lokale filer som konflikt</translation>
</message>
@@ -824,115 +895,105 @@ Hvis synkroniseringen fortsetter som normalt, vil alle filene dine bli overskrev
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>Klarte ikke å tilbakestille mappetilstand</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>En gammel synkroniseringsjournal &apos;%1&apos; ble funnet men kunne ikke fjernes. Pass på at ingen applikasjoner bruker den.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation> (sikkerhetskopi)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation> (sikkerhetskopi %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Udefinert tilstand.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>Venter på å starte synkronisering.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Forbereder synkronisering.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>Synkronisering kjører.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>Siste synkronisering var vellykket.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation>Synkronisering var vellykket, uløste konflikter.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>Siste synkronisering var vellykket, men med advarsler på enkelte filer.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>Siste synkronisering var vellykket.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Feil med oppsett.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Brukeravbrudd.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>Synkronisering er satt på pause.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Synkronisering er satt på pause)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>Ingen gyldig mappe valgt!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>Den valgte stien er ikke en mappe!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Du har ikke skrivetilgang til den valgte mappen!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation>Den lokale mappen %1 inneholder en symbolsk lenke. Målet for lenken inneholder en mappe som allerede er synkronisert. Velg en annen mappe!</translation>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation>Det er allerede en synkronisering fra serveren til denne lokale mappen. Velg en annen mappe!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Den lokale mappen %1 inneholder allerede en mappe brukt i en mappe-synkronisering. Velg en annen!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Den lokale mappen %1 er allerede en undermappe av en mappe brukt i en mappe-synkronisering. Velg en annen!</translation>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation>Den lokale mappen %1 er en symbolsk lenke. Målet for lenken er allerede en undermappe av en mappe brukt i en mappe-synkronisering. Velg en annen!</translation>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -942,7 +1003,7 @@ Hvis synkroniseringen fortsetter som normalt, vil alle filene dine bli overskrev
<translation>Legg til mappe-synkronisering</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>Synkroniserer med lokal mappe</translation>
</message>
@@ -977,7 +1038,7 @@ Hvis synkroniseringen fortsetter som normalt, vil alle filene dine bli overskrev
<translation>Feil ved innlasting av listen av mapper fra serveren.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Logget ut</translation>
</message>
@@ -989,118 +1050,136 @@ Hvis synkroniseringen fortsetter som normalt, vil alle filene dine bli overskrev
<message>
<location filename="../src/gui/folderstatusmodel.cpp" line="209"/>
<source>There are unresolved conflicts. Click for details.</source>
+ <translation>Det er uløste konflikter. Klikk for detaljer.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Ser etter endringer i &apos;%1&apos;</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation>Sjekker for endringer i ekstern &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation>Sjekker for endringer i lokal &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation>Sammenslår endringer</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>Synkroniserer %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>nedlasting %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>opplasting %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 av %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%5 igjen, %1 av %2, fil %3 of %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 av %2, fil %3 av %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>fil %1 av %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>Venter..</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>Venter på %n annen mappe...</numerusform><numerusform>Venter på %n andre mappe(r)...</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>Forbereder synkronisering...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>Legg til mappe-synkronisering</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>Legg til tilkobling for synkronisering</translation>
</message>
@@ -1108,17 +1187,17 @@ Hvis synkroniseringen fortsetter som normalt, vil alle filene dine bli overskrev
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Klikk for å velge en lokal mappe å synkronisere.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Legg inn stien til den lokale mappen.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Velg kildemappe</translation>
</message>
@@ -1126,60 +1205,68 @@ Hvis synkroniseringen fortsetter som normalt, vil alle filene dine bli overskrev
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Opprett ekstern mappe</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>Oppgi navnet på den nye mappen som skal opprettes under &apos;%1&apos;:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>Mappen ble opprettet på %1.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>Autentisering feilet ved tilgang til %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>Klarte ikke å opprette mappen på %1. Sjekk manuelt.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>Klarte ikke å liste en mappe. Feil: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Velg dette for å synkronisere en hel konto</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Denne mappen synkroniseres allerede.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Du synkroniserer allerede &lt;i&gt;%1&lt;/i&gt;, som er foreldremappe for &lt;i&gt;%2&lt;/i&gt;.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation>Bruk virtuelt filsystem istedet for å laste ned filer umiddelbart (eksperimentelt) </translation>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Advarsel:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Advarsel:&lt;/b&gt;</translation>
</message>
@@ -1187,22 +1274,22 @@ Hvis synkroniseringen fortsetter som normalt, vil alle filene dine bli overskrev
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>Ingen E-Tag mottatt fra server. Sjekk proxy/gateway.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>Vi mottok en forskjellig E-Tag for å fortsette. Prøver igjen neste gang.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>Serveren returnerte feil content-range</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Tidsavbrudd ved tilkobling</translation>
</message>
@@ -1225,23 +1312,38 @@ Hvis synkroniseringen fortsetter som normalt, vil alle filene dine bli overskrev
<translation>For systemkurven</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation>Stabil</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation>beta</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Avansert</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation>Be om bekreftelse før synkronisering av mapper større enn</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation>Be om bekreftelse før synkronisering av eksterne lagre</translation>
</message>
@@ -1261,31 +1363,71 @@ Hvis synkroniseringen fortsetter som normalt, vil alle filene dine bli overskrev
<translation>Bruk svart/&amp;hvite ikoner</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>Rediger &amp;ignorerte filer</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>Vis &amp;krasj-rapportering</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>Om</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>Oppdateringer</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>&amp;Omstart &amp;&amp; Oppdater</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation>Bytt oppdateringskanal? </translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation>Oppdateringskanalen bestemmer hvilke klientoppdateringer som skal tilbys for installasjon. Den &quot;stabile&quot; kanalen inneholder bare oppgraderinger som betraktes som pålitelige, mens versjonene i &quot;beta&quot; -kanalen kan inneholde nyere funksjoner og feilrettinger, men har ennå ikke blitt testet grundig.
+
+Vær oppmerksom på at dette bare velger hvor oppgraderinger kommer ifra, og at nedgraderinger ikke er mulig. Så å gå tilbake fra beta-kanalen til den stabile kanalen, kan ikke gjøres umiddelbart og betyr å vente på en stabil versjon som er nyere enn den nåværende installerte betaen versjon.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation>Bytt oppdateringskanal</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Avbryt</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation>Delings feil</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation>Kunne ikke hente eller lage offentlig deling. Error:
+
+%1</translation>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1353,7 +1495,7 @@ Hvis synkroniseringen fortsetter som normalt, vil alle filene dine bli overskrev
<translation>Fjern</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1362,27 +1504,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
Elementer hvor sletting er tillatt, vil bli slettet hvis de forhindrer fjerning av en mappe. Dette er hendig for metadata.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Klarte ikke å åpne fil</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>Kan ikke skrive endringer til &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Nytt mønster</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Legg til ignoreringsmønster:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Denne oppføringen er gitt av systemet på &apos;%1&apos; og kan ikke endres i denne visningen.</translation>
</message>
@@ -1397,7 +1539,8 @@ Elementer hvor sletting er tillatt, vil bli slettet hvis de forhindrer fjerning
<message>
<location filename="../src/gui/issueswidget.ui" line="20"/>
<source>List of issues</source>
- <translation type="unfinished"/>
+ <translation>Liste over problemer
+</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="34"/>
@@ -1412,49 +1555,59 @@ Elementer hvor sletting er tillatt, vil bli slettet hvis de forhindrer fjerning
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Mappe</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="73"/>
<source>Show warnings</source>
- <translation type="unfinished"/>
+ <translation>Vis advarsler</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="83"/>
<source>Show ignored files</source>
- <translation type="unfinished"/>
+ <translation>Vis ignorerte filer</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
- <translation type="unfinished"/>
+ <translation>Det var for mange problemer. Ikke alle vil være synlige her.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation>Det er konflikter. Vennligst sjekk dokumentasjonen på hvordan å løse dem. </translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
- <translation type="unfinished"/>
+ <translation>Kopier problemlisten til utklippstavlen.</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Kopier</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Tid</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Fil</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
- <translation type="unfinished"/>
+ <translation>Problem</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation>Det er konflikter. &lt;a href=&quot;%1&quot;&gt;Vennligst sjekk dokumentasjonen på hvordan å løse dem. &lt;/a&gt;</translation>
</message>
</context>
<context>
@@ -1477,40 +1630,52 @@ Elementer hvor sletting er tillatt, vil bli slettet hvis de forhindrer fjerning
<message>
<location filename="../src/gui/logbrowser.cpp" line="89"/>
<source>&amp;Capture debug messages</source>
- <translation type="unfinished"/>
+ <translation>Fang feilsøkingsmeldinger</translation>
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation>Lagre logger permanent</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Tøm</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Tøm loggvisningen.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>L&amp;agre</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Lagre logg til disken for feilsøking</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Lagre logg fil</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Feil</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>Kunne ikke skrive til loggfil %1</translation>
</message>
@@ -1518,12 +1683,12 @@ Elementer hvor sletting er tillatt, vil bli slettet hvis de forhindrer fjerning
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Feil</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;Fil &apos;%1&apos;&lt;br/&gt;kan ikke åpnes for skriving.&lt;br/&gt;&lt;br/&gt;Loggen kan &lt;b&gt;ikke&lt;/b&gt; lagres!&lt;/nobr&gt;</translation>
</message>
@@ -1531,27 +1696,27 @@ Elementer hvor sletting er tillatt, vil bli slettet hvis de forhindrer fjerning
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Ny versjon tilgjengelig</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;En ny versjon av %1-klienten er tilgjengelig.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; er tilgjengelig for nedlasting. Installert versjon er %3.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Hopp over denne versjonen</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Hopp over denne gangen</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Hent oppdatering</translation>
</message>
@@ -1639,27 +1804,27 @@ Elementer hvor sletting er tillatt, vil bli slettet hvis de forhindrer fjerning
<translation>Begrens automatisk</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Servernavnet til proxy-serveren</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Brukernavn for proxy-server</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Passord for proxy-server</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>HTTP(S) proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>SOCKS5 proxy</translation>
</message>
@@ -1667,23 +1832,23 @@ Elementer hvor sletting er tillatt, vil bli slettet hvis de forhindrer fjerning
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>Opprettet %1</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>Lukkes om noen sekunder...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation>%1 forespørsel feilet %2</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation>&apos;%1&apos; valgt %2</translation>
@@ -1692,136 +1857,136 @@ Elementer hvor sletting er tillatt, vil bli slettet hvis de forhindrer fjerning
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
- <translation type="unfinished"/>
+ <translation>Feil returnert fra serveren: &lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
- <translation type="unfinished"/>
+ <translation>Det oppsto en feil med tilgang til &quot;token&quot; endepunktet: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
- <translation type="unfinished"/>
+ <translation>Kunne ikke prosessere JSON returnert fra serveren:&lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
- <translation type="unfinished"/>
+ <translation>Svaret fra serveren inneholder ikke alle forventede felt</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;h1&gt;Innloggingsfeil&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;h1&gt;Feil bruker&lt;/h1&gt;&lt;p&gt;Du logget inn med bruker &lt;em&gt;%1&lt;/em&gt;, men må logge inn med bruker &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Logg ut av %3 i en annen tab, &lt;a href=&apos;%4&apos;&gt;klikk deretter her&lt;/a&gt; og logg inn som bruker %2&lt;/p&gt;</translation>
</message>
</context>
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Ny %1-oppdatering er klar</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
- <translation>En ny oppdatering for %1 er i ferd med å bli installert. Oppdateringen
-kan be om flere rettigheter under behandlingen.</translation>
+ <translation>En ny oppdatering for %1 vil bli installert. Oppdateringen
+kan be om flere rettigheter underveis.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>Laster ned versjon %1. Vennligst vent...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>Klarte ikke å laste ned oppdateringen. Klikk &lt;a href=&apos;%1&apos;&gt;her&lt;/a&gt; for å laste ned oppdateringen manuelt.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Klarte ikke å se etter nye oppdateringer.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>%1 versjon %2 tilgjengelig. Start applikasjonen på nytt for å starte oppdatering.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>Ny %1 versjon %2 tilgjengelig. Bruk systemets oppdateringsverktøy til å installere den.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Sjekker oppdaterings-server...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>Oppdateringsstatus er ukjent: Sjekket ikke for nye oppdateringer.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>Ingen oppdateringer tilgjengelig. Du har den nyeste versjonen.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
- <translation>Oppdateringssjek</translation>
+ <translation>Oppdateringssjekk</translation>
</message>
</context>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Koble til %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Sett opp valg for lokal mappe</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Koble til...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1 mappe &apos;%2&apos; er synkronisert til lokal mappe &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>Synkroniser mappen &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Advarsel:&lt;/strong&gt; Den lokale mappen er ikke tom. Velg en løsning!&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Lokal synkroniseringsmappe</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1880,14 +2045,19 @@ kan be om flere rettigheter under behandlingen.</translation>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Koble til %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
- <translation type="unfinished"/>
+ <translation>Logg inn i nettleseren din</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation>Kopier link til utklippstavlen</translation>
</message>
</context>
<context>
@@ -1919,153 +2089,163 @@ Det er ikke tilrådelig å bruke den.</translation>
<source>&amp;Next &gt;</source>
<translation>&amp;Neste &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>Ugyldig URL</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation>Kunne ikke laste inn sertifikat. Kanskje feil passord?</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Vellykket oppkobling mot %1: %2 versjon %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Klarte ikke å koble til %1 på %2:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>Tidsavbrudd ved oppkobling mot %1 på %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Prøver å koble til %1 på %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>Autentisert forespørsel til serveren ble omdirigert til &apos;%1&apos;. URL-en er ugyldig, serveren er feilkonfigurert.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>Det kom et uventet svar fra en autentisert webdav-forespørsel.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>Tilgang forbudt av serveren. For å sjekke om du har gyldig tilgang, &lt;a href=&quot;%1&quot;&gt;klikk her&lt;/a&gt; for å aksessere tjenesten med nettleseren din.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>Ugyldig URL</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
- <translation type="unfinished"/>
+ <translation>Serveren rapporterte følgende feil:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>Lokal synkroniseringsmappe %1 finnes allerede. Setter den opp for synkronisering.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>Oppretter lokal synkroniseringsmappe %1...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>ok</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>feilet.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>Klarte ikke å opprette lokal mappe %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>Ingen ekstern mappe spesifisert!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Feil: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>oppretter mappe på ownCloud: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>Ekstern mappe %1 ble opprettet.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>Ekstern mappe %1 finnes allerede. Kobler den til for synkronisering.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>Oppretting av mappe resulterte i HTTP-feilkode %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>Oppretting av ekstern mappe feilet fordi påloggingsinformasjonen er feil!&lt;br/&gt;Gå tilbake og sjekk brukernavnet og passordet ditt.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Oppretting av ekstern mappe feilet, sannsynligvis fordi oppgitt påloggingsinformasjon er feil.&lt;/font&gt;&lt;br/&gt;Vennligst gå tilbake og sjekk ditt brukernavn og passord.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>Oppretting av ekstern mappe %1 feilet med feil &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>En synkroniseringsforbindelse fra %1 til ekstern mappe %2 ble satt opp.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Forbindelse til %1 opprettet!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>Klarte ikke å etablere forbindelse til %1. Sjekk igjen.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Omdøping av mappe feilet</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>Kan ikke fjerne og sikkerhetskopiere mappen fordi mappen eller en fil i mappen er åpen i et annet program. Lukk mappen eller filen og prøv igjen, eller avbryt oppsettet.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Oppretting av lokal synkroniseringsmappe %1 vellykket!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2073,14 +2253,31 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>%1 Veiviser for tilkobling</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Hopp over mappekonfigurasjon</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation>Aktiver eksperimentelle funksjoner?</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation>Aktiver eksperimentelt modus</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation>Hold deg trygg</translation>
</message>
</context>
<context>
@@ -2104,7 +2301,7 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>Ugyldig JSON-svar fra forespørsels-URL</translation>
</message>
@@ -2112,7 +2309,7 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>Feil ved skriving av metadata til databasen</translation>
</message>
@@ -2120,47 +2317,47 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>Fil %1 kan ikke lastes ned på grunn av lokalt sammenfall av filnavn!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
- <translation type="unfinished"/>
+ <translation>Nedlastingen ville ha redusert ledig lokal diskplass under grensen</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>Ledig plass på disk er mindre enn %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>Filen ble slettet fra serveren</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>Hele filen kunne ikke lastes ned.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation>Nedlastet fil er tom, selv om serveren annonserte at den skulle være %1.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>Fil %1 kan ikke lagres på grunn av lokal konflikt med filnavn.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>Filen er endret siden den ble oppdaget</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>Feil ved skriving av metadata til databasen</translation>
</message>
@@ -2168,12 +2365,12 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; Gjenoppretting feilet: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation>En fil eller mappe ble fjernet fra en deling med lesetilgang, men gjenoppretting feilet: %1</translation>
</message>
@@ -2181,22 +2378,22 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>klarte ikke å slette fil %1, feil: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>Merk! mulig sammenfall med %1 pga. sensitivitet for store/små bokstaver</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>klarte ikke å opprette mappe %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>Feil ved skriving av metadata til databasen</translation>
</message>
@@ -2204,17 +2401,17 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>Feil ved fjerning av &apos;%1&apos;: %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>Klarte ikke å fjerne mappe &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>Kunne ikke fjerne %1 på grunn av lokalt sammenfall av filnavn</translation>
</message>
@@ -2222,13 +2419,13 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>Fil %1 kan ikke omdøpes til %2 på grunn av lokalt sammenfall av filnavn</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>Feil ved skriving av metadata til databasen</translation>
</message>
@@ -2236,12 +2433,7 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>Filen er blitt fjernet fra en deling med lesetilgang. Den ble gjenopprettet.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>Feil HTTP-kode returnert fra server. Ventet 204, men mottok &quot;%1 %2&quot;.</translation>
</message>
@@ -2249,12 +2441,12 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Feil HTTP-kode returnert fra server. Ventet 201, men mottok &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>Feil ved skriving av metadata til databasen</translation>
</message>
@@ -2262,28 +2454,13 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Denne mappen må ikke omdøpes. Den er omdøpt tilbake til sitt opprinnelige navn.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Denne mappen må ikke omdøpes. Vennligst omdøp den tilbake til Shared.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>Filen ble gitt nytt navn mer er en del av en deling med lesetilgang. Den opprinnelige filen ble gjenopprettet.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Feil HTTP-kode returnert fra server. Ventet 201, men mottok &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>Feil ved skriving av metadata til databasen</translation>
</message>
@@ -2291,33 +2468,33 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation>Fil %1 kan ikke lastes opp fordi en annen fil eksisterer med samme navn, bare med forskjellige store og små bokstaver i navnet.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Fil fjernet</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>Lokal fil endret under synkronisering. Den vil gjenopptas.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>Lokal fil endret under synkronisering.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
- <translation type="unfinished"/>
+ <translation>Opplasting av %1 overstiger kvoten for mappen</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>Feil ved skriving av metadata til databasen</translation>
</message>
@@ -2325,27 +2502,27 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>Den lokale filen ble fjernet under synkronisering.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>Lokal fil endret under synkronisering.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation>Uventet returkode fra serveren (%1)</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation>Mangler File ID fra server</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation>Mangler ETag fra server</translation>
</message>
@@ -2353,27 +2530,22 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>Filen ble redigert lokalt men er en del av en deling med lesetilgang. Den er blitt gjenopprettet og din endring er i konfliktfilen.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>Forespørsels-URL mangler</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>Den lokale filen ble fjernet under synkronisering.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>Lokal fil endret under synkronisering.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation>Serveren godtok ikke den siste deloverføringen. (Ingen e-tag var tilstede)</translation>
</message>
@@ -2391,42 +2563,47 @@ Det er ikke tilrådelig å bruke den.</translation>
<translation>Tekst-etikett</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Åpne i nettleser</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Tid</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Fil</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Mappe</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Handling</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Størrelse</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>Lokal synkroniseringsprotokoll</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Kopier</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Kopier aktivitetslisten til utklippstavlen.</translation>
</message>
@@ -2467,7 +2644,7 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Velg hva som synkroniseres</translation>
</message>
@@ -2475,33 +2652,33 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Laster ...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation>Fjern valg for eksterne mapper som du ikke ønsker å synkronisere.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Navn</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Størrelse</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>Ingen undermapper på serveren nå</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation>Det oppstod en feil ved lasting av liten med undermapper.</translation>
</message>
@@ -2522,22 +2699,22 @@ Det er ikke tilrådelig å bruke den.</translation>
<translation>Innstillinger</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Aktivitet</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Generelt</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Nettverk</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Konto</translation>
</message>
@@ -2545,28 +2722,28 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Aktivitet</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Generelt</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Nettverk</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Konto</translation>
</message>
@@ -2594,42 +2771,42 @@ Det er ikke tilrådelig å bruke den.</translation>
<translation>ownCloud-sti:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>%1-deling</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Mappe: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>Serveren tillater ikke deling</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation>Henter maksimalt mulige delerettigheter fra serveren...</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Filen kan ikke deles fordi den ble delt uten adgang til å dele.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>Brukere og grupper</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>Offentlige lenker</translation>
</message>
@@ -2642,7 +2819,17 @@ Det er ikke tilrådelig å bruke den.</translation>
<translation>Del NewDocument.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation>Kun opplasting (Fil Slipp)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation>Motta filer fra andre uten å avsløre innholdet i mappen.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>Tekst-etikett</translation>
</message>
@@ -2654,12 +2841,12 @@ Det er ikke tilrådelig å bruke den.</translation>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="35"/>
<source>Enter a name to create a new public link...</source>
- <translation type="unfinished"/>
+ <translation>Skriv inn et navn for å opprette en ny offentlig lenke...</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="42"/>
<source>&amp;Create new</source>
- <translation type="unfinished"/>
+ <translation>&amp; Lag ny</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="105"/>
@@ -2672,19 +2859,24 @@ Det er ikke tilrådelig å bruke den.</translation>
<translation>Sett passord</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
- <translation type="unfinished"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
+ <translation>Mottakere kan se og laste ned innhold.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation>Last ned / Se</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>Vis filoppføringer</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation>Last ned / Se / Last opp</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Tillat redigering</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation>Mottakere kan se, laste ned, redigere og laste opp innhold.</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2692,95 +2884,95 @@ Det er ikke tilrådelig å bruke den.</translation>
<translation>Alle med linken har tilgang til filen/mappen</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>P&amp;assordbeskyttelse</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Passordbeskyttet</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Filen kan ikke deles fordi den ble delt uten adgang til å dele.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
- <translation type="unfinished"/>
+ <translation>Lenker har blitt deaktivert</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
- <translation type="unfinished"/>
+ <translation>Opprett offentlig kobling deling</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Slett</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
- <translation type="unfinished"/>
+ <translation>Åpne lenke i nettleser</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
- <translation type="unfinished"/>
+ <translation>Kopier link til utklippstavlen</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
- <translation type="unfinished"/>
+ <translation>Kopier link til utklippstavlen (direkte nedlasting)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Send link i e-post</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
+ <translation>Send link i e-post (direkte nedlasting)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
- <translation type="unfinished"/>
+ <translation>Bekreft Sletting av Link</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;p&gt;Ønsker du virkelig å slette delingen av den offentlige lenken&lt;i&gt;%1&lt;/i&gt;? &lt;/p&gt; &lt;p&gt;Merk: Denne handlingen kan ikke omgjøres.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Avbryt</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation>Offentlig lenke</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
- <translation type="unfinished"/>
+ <translation>Slett link</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>Offentlig d&amp;eling krever et passord</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Sett passord</translation>
</message>
@@ -2800,37 +2992,37 @@ Det er ikke tilrådelig å bruke den.</translation>
<message>
<location filename="../src/gui/shareusergroupwidget.ui" line="108"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;You can direct people to this shared file or folder &lt;a href=&quot;private link menu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;by giving them a private link&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Du kan lede folk til denne delte filen eller mappen &lt;a href=&quot;private link menu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt; ved å gi dem en privat lenke&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
- <translation type="unfinished"/>
+ <translation>Elementet deles ikke med noen brukere eller grupper</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
- <translation type="unfinished"/>
+ <translation>Åpne lenke i nettleser</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
- <translation type="unfinished"/>
+ <translation>Kopier URL til utklippstavlen</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Send link i e-post</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>Ingen resultater for &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
- <translation type="unfinished"/>
+ <translation>Jeg delte noe med deg</translation>
</message>
</context>
<context>
@@ -2841,37 +3033,38 @@ Det er ikke tilrådelig å bruke den.</translation>
<translation>Skjema</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>Tekst-etikett</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>kan endre</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>kan dele</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>opprette</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>endre</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>slett</translation>
</message>
@@ -2915,143 +3108,176 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>Del med %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
- <source>I shared something with you</source>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
+ <source>I shared something with you</source>
+ <translation>Jeg delte noe med deg</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
- <translation type="unfinished"/>
+ <translation>Del...</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
- <translation type="unfinished"/>
+ <translation>Kopier privat URL til utklippstavlen</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
- <translation type="unfinished"/>
+ <translation>Send privat link i e-post</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation>Videre deling av denne filen er ikke tillatt</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation>Kopier offentlig link til utklippstavlen</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Åpne i nettleser</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Sertifikatdetaljer&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Common Name (CN):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>Subject Alternative Names:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Organization (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Organizational Unit (OU):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>State/Province:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>Land:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Serial:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Utsteder&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Utsteder:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Utstedt dato:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Utløper dato:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Fingeravtrykk&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;NB:&lt;/b&gt; Dette sertifikatet ble godkjent manuelt&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (egensignert)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>Denne forbindelsen er kryptert med %1 bit %2.
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation>Ingen støtte for billett/ID for SSL-økt</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Sertifikatinformasjon:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>Denne forbindelsen er IKKE sikker da den ikke er kryptert.
@@ -3139,305 +3365,270 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Suksess.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>CSync kunne ikke laste inn journalfilen. Journalfilen er ødelagt.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;Klarte ikke å laste utvidelse %1 for csync.&lt;br/&gt;Verifiser installasjonen!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>CSync fatal parmeterfeil.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>CSync-behandlingssteg oppdatering feilet.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>CSync-behandlingssteg overensstemming feilet.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync klarte ikke å autentisere mot proxy.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSync klarte ikke å slå opp proxy eller server.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync karte ikke å autentisere på serveren %1.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync klarte ikke å koble seg til nettverket.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>Det oppstod et tidsavbrudd for en nettverksforbindelse.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>En HTTP-overføringsfeil oppstod.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation>Den oppkoblede mappen er for tiden ikke tilgjengelig på serveren</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>Det oppstod en feil ved åpning av en mappe</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>Feil ved lesing av mappe.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
- <translation type="unfinished"/>
+ <translation>%1 (hoppet over på grunn av tidligere feil, prøver igjen om %2)</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>Filen/mappen ignoreres fordi den er skjult.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
- <translation type="unfinished"/>
+ <translation>Mapphierarkiet er for dypt</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
- <translation type="unfinished"/>
+ <translation>Konflikt: Serverversjon lastet ned, lokal kopi har byttet navn og er ikke lastet opp.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation>Bare %1 er tilgjengelig, trenger minst %2 for å begynne</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
- <translation type="unfinished"/>
+ <translation>Kan ikke åpne eller opprette den lokale synkroniseringsdatabasen. Kontroller at du har skrivetilgang i synkroniseringsmappen.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation>Ikke tillatt fordi du ikke har lov til å legge til foreldremappe</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation>Ikke tillatt fordi du ikke har lov til å opprette filer i den mappen</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
- <translation type="unfinished"/>
+ <translation>Diskplass er lav: Nedlastinger som ville redusere ledig plass under% 1 ble hoppet over.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: Ikke ledig plass tilgjengelig på server %1.</translation>
+ <translation>Det er ikke nok ledig plass på serveren for noen av opplastingene.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>CSync uspesifisert feil.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Avbrutt av brukeren</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>CSync klarte ikke å aksessere</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation>Klarte ikke å laste eller opprette journalfilen. Sjekk at du har lese- og skrivetilgang i den lokale synkroniseringsmappen.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
- <translation>CSync klarte ikke å laste eller opprette journalfilen. Sjekk at du har lese- og skrivetilgang i den lokale synkroniseringsmappen.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation>Discovery forsøket mislyktes.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
- <translation>CSync feilet fordi nektet tilgang ikke ble håndtert.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation>Tilgang nektet.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
- <translation>CSync prøvde å opprette en mappe som finnes allerede.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
+ <translation>Fant ikke filen eller katalogen:</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
+ <translation>Prøvde å opprette en mappe som finnes allerede.</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation>Ingen plass på %1 server tilgjengelig.</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>Tjenesten er midlertidig utilgjengelig</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>Tilgang er nektet</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>En intern feil nummer %1 oppstod.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>Symbolske lenker støttes ikke i synkronisering.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>Filen ligger på ignoreringslisten.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation>Filnavn som slutter med punktum er ikke tillatt på dette filsystemet</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation>Filnavn som inneholder &apos;%1&apos; er ikke tillatt på dette filsystemet</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation>Filnavnet er et reservert navn på dette filsystemet.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation>Filnavn inneholder blanke på slutten.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>Filnavn er for langt.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
- <translation type="unfinished"/>
+ <translation>Filnavnet kan ikke kodes på filsystemet ditt.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation>Uløst konflikt</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>Stat feilet.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>Filnavn-koding er ikke gyldig</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>Ugyldige tegn, gi et annet navn til &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation>Kan ikke lese svartelisten fra den lokale databasen</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation>Kan ikke lese fra synkroniseringsjournalen</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>Kan ikke åpne synkroniseringsjournalen</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>Filnavnet inneholder minst ett ulovlig tegn</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>Ignorert på grunn av svartelisten &quot;velg hva som skal synkroniseres&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation>Ikke tillatt fordi du ikke har lov til å lage undermapper i den mappen</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>Ikke tillatt å laste opp denne filenfordi den er skrivebeskyttet på serveren, gjenoppretter</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>Ikke tillatt å fjerne, gjenoppretter</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>Lokale filer og delingsmappe fjernet.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>Flytting ikke tillatt, element gjenopprettet</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>Flytting ikke tillatt fordi %1 er skrivebeskyttet</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>målet</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>kilden</translation>
</message>
@@ -3461,17 +3652,17 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Versjon %1. For mer informasjon gå til &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;Distribuert av %1 og lisensiert under GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 og %2-logoet er registrerte varemerker for %1 i USA, i andre land eller begge deler.&lt;/p&gt;</translation>
</message>
@@ -3502,81 +3693,81 @@ Det er ikke tilrådelig å bruke den.</translation>
<translation>Vennligst logg inn</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Mappe %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Ingen synkroniseringsmapper er konfigurert.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Åpne i nettleser</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Logg inn..</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Logg ut</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Siste endringer</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Ser etter endringer i &apos;%1&apos;</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Administrerte mapper:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Åpne mappe &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Åpne %1 i nettleser</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Ukjent status</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Innstillinger...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Detaljer...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Hjelp</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>Avslutt %1</translation>
</message>
@@ -3591,11 +3782,6 @@ Det er ikke tilrådelig å bruke den.</translation>
<translation>Server-versjonen støttes ikke</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation>Serveren på konto %1 kjører en gammel %2 som ikke støttes. Bruk av denne klienten med ikke-støttede server-versjoner er ikke testet og kan være farlig. Fortsett på egen risiko.</translation>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Frakoblet</translation>
@@ -3603,7 +3789,7 @@ Det er ikke tilrådelig å bruke den.</translation>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="240"/>
<source>Disconnected from some accounts</source>
- <translation type="unfinished"/>
+ <translation>Frakoblet noen kontoer</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="251"/>
@@ -3627,116 +3813,129 @@ Det er ikke tilrådelig å bruke den.</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
- <translation type="unfinished"/>
+ <translation>Synkronisering er satt på pause</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation>Uløste konflikter</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
- <translation type="unfinished"/>
+ <translation>Feil under synkronisering</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
- <translation type="unfinished"/>
+ <translation>Ingen synkronisering-mapper konfigurert.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation>Fortsett alle mapper</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>Sett alle mapper på pause</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>Fortsett all synkronisering</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>Fortsett synkronisering</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>Sett all synkronisering på pause</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>Sett synkronisering på pause</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Logg ut av alle kontoer</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Logg inn på alle kontoer...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>Ny konto...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>Om %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>Krasj nå</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Ingenting synkronisert nylig</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation>Sjekker for endringer i ekstern &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation>Sjekker for endringer i lokal &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Synkroniserer %1 av %2 (%3 gjenstår)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation>Synkroniserer %1 av %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Synkroniserer %1 (%2 gjenstår)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>Synkroniserer %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Oppdatert</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Versjon %2. For mer informasjon gå til &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For kjente problemer og hjelp, gå til: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;Av Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt med flere.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Lisensiert under GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud og ownCloud-logo er registrerte varemerker for ownCloud GmbH i USA, andre land eller begge deler.&lt;/p&gt;</translation>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3748,9 +3947,9 @@ Det er ikke tilrådelig å bruke den.</translation>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>Tekst-etikett</translation>
</message>
@@ -3786,11 +3985,22 @@ Det er ikke tilrådelig å bruke den.</translation>
<translation>Be om bekreftelse før synkronisering av e&amp;ksterne lagre</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Velg hva som synkroniseres</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation>Manuelt opprett mappesynk koblinger. </translation>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>&amp;Lokal mappe</translation>
@@ -3807,11 +4017,16 @@ Det er ikke tilrådelig å bruke den.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>S&amp;ynkroniser alt fra serveren</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation>Synkroniser alt fra serveren (anbefalt)</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Statusmelding</translation>
</message>
@@ -3848,7 +4063,7 @@ Det er ikke tilrådelig å bruke den.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
+ <source>An error occurred while connecting. Please try again.</source>
<translation>Det oppstod en feil under tilkobling. Vennligst prøv igjen.</translation>
</message>
<message>
@@ -4028,7 +4243,7 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;Bygget fra Git-revisjon &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; %3, %4 med Qt %5, %6&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4126,52 +4341,52 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Status udefinert</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Venter på å starte synkronisering</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>Synkronisering pågår</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Synkronisering vellykket</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Vellykket synkronisering. Noen filer ble ignorert.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Synkroniseringsfeil</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Feil i oppsett</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Forbereder synkronisering</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Avbryter...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>Synkronisering er satt på pause</translation>
</message>
@@ -4179,22 +4394,22 @@ Det er ikke tilrådelig å bruke den.</translation>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation>Kunne ikke åpne nettleseren</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation>Det oppstod en feil ved start av nettleseren for å gå til URL %1. Kanskje ingen standard nettleser er konfigurert?</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation>Klarte ikke å åpne epost-klient</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation>Det oppstod en feil ved oppstart av epost-klienten for å lage en ny melding. Kanskje ingen standard epost-klient er konfigurert?</translation>
</message>
diff --git a/translations/client_nl.ts b/translations/client_nl.ts
index e543cecfe..67537da91 100644
--- a/translations/client_nl.ts
+++ b/translations/client_nl.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="nl" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,17 +95,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Time-out verbinding</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
- <translation type="unfinished"/>
+ <translation>Onbekende fout: antwoord van het netwerk is verwijderd</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation>Server antwoordde &quot;%1 %2&quot; naar &quot;%3 %4&quot;</translation>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Annuleren</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Account</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Selectieve synchronisatie</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Forceer sync nu</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>Herstarten sync</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
- <translation>Verwijderen map sync verbinding</translation>
+ <translation>Verwijder map-synchronisatie verbinding</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Maken map mislukt</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;Kon lokale map &lt;i&gt;%1&lt;/i&gt; niet maken.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
- <translation>Bevestig verwijderen Map Sync verbinding</translation>
+ <translation>Bevestig verwijderen map-synchronisatie verbinding</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
- <translation>Verwijderen Map Sync verbinding</translation>
+ <translation>Verwijder map-synchronisatie verbinding</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Bezig met synchroniseren</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>Bezig met synchroniseren.&lt;br/&gt;Wilt u stoppen met synchroniseren?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 in gebruik</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 als &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>De serverversie %1 is oud en wordt niet meer ondersteund. Verdergaan is op eigen risico.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Verbonden met %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>Server %1 is tijdelijk niet beschikbaar</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
- <translation type="unfinished"/>
+ <translation>Server %1 is momenteel in onderhoudsmodus.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>Uitgelogd van %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
- <translation type="unfinished"/>
+ <translation>Probeert autorisatie te krijgen van de browser. &lt;a href=&apos;%1&apos;&gt; Klik hier &lt;/a&gt; om de browser opnieuw te openen.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation>Verbinden met %1...</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>Geen verbinding met %1 op %2.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Meld u aan</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>Er zijn mappen die niet gesynchroniseerd werden, omdat ze te groot zijn:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>Er zijn mappen die niet gesynchroniseerd werden, omdat ze op externe opslag staan:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation>Er zijn mappen die niet gesynchroniseerd werden, omdat ze te groot zijn of op externe opslag staan:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Bevestig verwijderen account</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Wilt u echt de verbinding met het account &lt;i&gt;%1&lt;/i&gt; verbreken?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Let op:&lt;/b&gt; Hierdoor verwijdert u &lt;b&gt;geen&lt;/b&gt; bestanden.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Verwijderen verbinding</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Openen map</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Afmelden</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Hervatten sync</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Pauzeren sync</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Weet u zeker dat u de synchronisatie van map &lt;i&gt;%1&lt;/i&gt; wilt stoppen?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Opmerking:&lt;/b&gt; Dit zal &lt;b&gt;geen&lt;/b&gt; bestanden verwijderen.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1 (%3%) van %2 in gebruik. Sommige mappen, inclusief netwerkmappen en gedeelde mappen, kunnen andere limieten hebben.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%1 van %2 in gebruik</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Er is nu geen informatie over het gebruik van de opslagruimte beschikbaar.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>Geen %1 connectie geconfigureerd.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Afgemeld</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Niet verbonden</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Verbonden</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Dienst niet beschikbaar</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation>Onderhoudsmodus</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Netwerkfout</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Configuratiefout</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Onbekende account-status</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Serveractiviteit</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Synchronisatiegeschiedenis</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>Niet gesynchroniseerd</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>Niet gesynchroniseerd (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>De server activiteitenlijst is gekopieerd naar het klembord.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>De sync activiteitenlijst is gekopieerd naar het klembord.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>De lijst met niet gesyncte objecten is gekopieerd naar het klembord.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Gekopieerd naar het klembord</translation>
</message>
@@ -469,47 +488,47 @@
<translation>Tekstlabel</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Serveractiviteiten</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Kopiëren</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Kopieer de activiteitenlijst naar het klembord.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Actie verwacht: Berichten</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;Account %1 heeft geen activiteiten ingeschakeld.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation><numerusform>U ontving %n nieuw bericht van %2.</numerusform><numerusform>U ontving %n nieuwe berichten van %2.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation><numerusform>U ontving %n nieuwe melding(en) van %1 en %2.</numerusform><numerusform>U ontving %n nieuwe melding(en) van %1 en %2.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>Je hebt nieuwe berichten ontvangen van %1, %2 en andere acounts</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>%1 Berichten - Actie verwacht</translation>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Afsluiten</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Verder</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation>Fout bij benaderen configuratiebestand</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation>Er trad een fout op bij het benaderen configuratiebestand op %1</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>Verlaten ownCloud</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>Fout bij schrijven van Metadata naar de database</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>Geen ownCloud-account geconfigureerd</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>De voor dit programma ingestelde server is te oud</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Werk de server bij naar de nieuwste versie en herstart het programma.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Authenticatiefout: Gebruikersnaam of wachtwoord onjuist.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>time-out</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>De verstrekte inloggegevens zijn niet juist</translation>
</message>
@@ -637,133 +681,160 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Afgebroken door de gebruiker</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>Lokale map %1 bestaat niet.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 zou een map moeten zijn, maar is dat niet.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 is niet leesbaar.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 is verwijderd.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 is gedownload.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 is bijgewerkt.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 is hernoemd naar %2.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 is verplaatst naar %2.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation><numerusform>%1 en %n ander bestand(en) zijn verwijderd.</numerusform><numerusform>%1 en %n andere bestand(en) zijn verwijderd.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation><numerusform>%1 en %n ander bestand(en) zijn gedownload.</numerusform><numerusform>%1 en %n andere bestand(en) zijn gedownload.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation><numerusform>%1 en %n ander bestand(en) zijn bijgewerkt.</numerusform><numerusform>%1 en %n andere bestand(en) zijn bijgewerkt.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation><numerusform>%1 is hernoemd naar %2 en %n ander bestand(en) is hernoemd.</numerusform><numerusform>%1 is hernoemd naar %2 en %n andere bestand(en) zijn hernoemd.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation><numerusform>%1 is verplaatst naar %2 en %n ander bestand(en) is verplaatst.</numerusform><numerusform>%1 is verplaatst naar %2 en %n andere bestand(en) zijn verplaatst.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation><numerusform>%1 en %n ander bestand(en) hebben een sync conflict.</numerusform><numerusform>%1 en %n andere bestand(en) hebben sync conflicten.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation>%1 heeft een sync conflict. Controleer het conflict bestand!</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation><numerusform>%1 en %n ander bestand(en) konden niet worden gesynchroniseerd wegens fouten. Bekijk het log voor details.</numerusform><numerusform>%1 en %n andere bestand(en) konden niet worden gesynchroniseerd wegens fouten. Bekijk het log voor details.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 kon niet worden gesynchroniseerd door een fout. Bekijk het log voor details.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Synchronisatie-activiteit</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>Kon het systeem-uitsluitingsbestand niet lezen</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation>Er is een nieuwe map groter dan %1 MB toegevoegd: %2.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation>Er is een map op externe opslag toegevoegd.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation>Ga naar de instellingen om het te selecteren als u deze wilt downloaden.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -774,7 +845,7 @@ Als u de bestanden wilt behouden, worden ze opnieuw gesynchroniseerd met de serv
Als u de bestanden wilt verwijderen, worden ze niet beschikbaar, tenzij u de eigenaar bent.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
@@ -782,22 +853,22 @@ If this was an accident and you decide to keep your files, they will be re-synce
Als dit een ongelukje was en u de bestanden wilt behouden, worden ze opnieuw gesynchroniseerd met de server.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Verwijder alle bestanden?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Verwijder alle bestanden</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Bewaar bestanden</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
@@ -806,17 +877,17 @@ Dit kan komen doordat een backup is hersteld op de server.
Doorgaan met deze synchronisatie overschrijft al uw bestanden door een eerdere versie. Wilt u uw lokale meer recente bestanden behouden als conflict bestanden?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>Backup gedetecteerd</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>Normale synchronisatie</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>Behoud lokale bestanden als conflict</translation>
</message>
@@ -824,114 +895,104 @@ Doorgaan met deze synchronisatie overschrijft al uw bestanden door een eerdere v
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>Kan de beginstaat van de map niet terugzetten</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>Een oud synchronisatieverslag &apos;%1&apos; is gevonden maar kan niet worden verwijderd. Zorg ervoor dat geen applicatie dit bestand gebruikt.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation>(backup)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation>(backup %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Ongedefiniëerde staat</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>In afwachting van synchronisatie.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Synchronisatie wordt voorbereid</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>Bezig met synchroniseren.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>Laatste synchronisatie was geslaagd.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>Laatste synchronisatie geslaagd, maar met waarschuwingen over individuele bestanden.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>Laatste synchronisatie was geslaagd.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Installatiefout.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Afgebroken door gebruiker.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>Synchronisatie gepauzeerd.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Synchronisatie onderbroken)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>Geen geldige map geselecteerd!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>Het geselecteerde pad is geen map!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>U heeft geen permissie om te schrijven naar de geselecteerde map!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation>Lokale map %1 bevat een symbolische link. De doellink bevat een map die al is gesynchroniseerd. Kies een andere!</translation>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation>Er wordt vanaf de server al naar deze lokale map gesynchroniseerd. Kies een andere lokale map!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
- <translation>Lokale map %1 bevat al een map die wordt gebruikt voor een mapsync verbinding. Kies een andere!</translation>
+ <translation>Lokale map %1 bevat al een map die wordt gebruikt voor een map-synchronisatie verbinding. Kies een andere!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation>Lokale map %1 zit al in een map die wordt gebruikt voor een mapsync verbinding. Kies een andere!</translation>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation>Lokale map %1 is een symbolische link. De doellink zit al in een map die in een mapsync verbinding wordt gebruikt. Kies een andere!</translation>
+ <translation>Lokale map %1 zit al in een map die wordt gebruikt voor een map-synchronisatie verbinding. Kies een andere!</translation>
</message>
</context>
<context>
@@ -939,10 +1000,10 @@ Doorgaan met deze synchronisatie overschrijft al uw bestanden door een eerdere v
<message>
<location filename="../src/gui/folderstatusdelegate.cpp" line="46"/>
<source>Add Folder Sync Connection</source>
- <translation>Toevoegen mapsync verbinding</translation>
+ <translation>Voeg map synchronisatie verbinding toe</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>Synchroniseren met lokale map</translation>
</message>
@@ -978,7 +1039,7 @@ Doorgaan met deze synchronisatie overschrijft al uw bestanden door een eerdere v
<translation>Fout bij ophalen mappenlijst van de server.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Afgemeld</translation>
</message>
@@ -990,118 +1051,136 @@ Doorgaan met deze synchronisatie overschrijft al uw bestanden door een eerdere v
<message>
<location filename="../src/gui/folderstatusmodel.cpp" line="209"/>
<source>There are unresolved conflicts. Click for details.</source>
+ <translation>Er zijn onopgeloste conflicten. Klik voor details.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Controleren op wijzigingen in &apos;%1&apos;</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
- <source>Reconciling changes</source>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
+ <source>Reconciling changes</source>
+ <translation>Wijzigingen doorvoeren</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>Synchroniseren %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>download %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>upload %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 van %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%5 over, %1 van %2, bestand %3 van %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 van %2, bestand %3 van %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>bestand %1 van %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>Aan het wachten...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>Wacht op %n andere map...</numerusform><numerusform>Wacht op %n andere mappen...</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>Voorbereiden op sync...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
- <translation>Toevoegen mapsync verbinding</translation>
+ <translation>Voeg map-synchronisatie verbinding toe</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>Toevoegen Sync verbinding</translation>
</message>
@@ -1109,17 +1188,17 @@ Doorgaan met deze synchronisatie overschrijft al uw bestanden door een eerdere v
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Klikken om een lokale map te selecteren voor synchronisatie</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Geef het pad op naar de lokale map.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Selecteer de bronmap</translation>
</message>
@@ -1127,60 +1206,68 @@ Doorgaan met deze synchronisatie overschrijft al uw bestanden door een eerdere v
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Externe map aanmaken</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>Voer de naam van de hieronder te maken nieuwe map in &apos;%1&apos;:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>Map is succesvol aangemaakt op %1.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>Authenticatie mislukt bij benaderen %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>Aanmaken van de map op %1 mislukt. Controleer handmatig.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>Tonen mappenlijst mislukt. Fout: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Kies dit om uw volledige account te synchroniseren</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Deze map is al gesynchroniseerd.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>U synchroniseert &lt;i&gt;%1&lt;/i&gt; al, dat is de bovenliggende map van &lt;i&gt;%2&lt;/i&gt;.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Waarschuwing:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Waarschuwing:&lt;/b&gt; </translation>
</message>
@@ -1188,22 +1275,22 @@ Doorgaan met deze synchronisatie overschrijft al uw bestanden door een eerdere v
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>Geen E-Tag ontvangen van de server, controleer Proxy/Gateway</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>We ontvingen een afwijkende E-Tag om door te gaan. We proberen het later opnieuw.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>Server retourneerde verkeerde content-bandbreedte</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Verbindingstime-out</translation>
</message>
@@ -1226,23 +1313,38 @@ Doorgaan met deze synchronisatie overschrijft al uw bestanden door een eerdere v
<translation>Voor systeemvak</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Geavanceerd</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation>Vraag bevestiging voordat mappen worden gedownload groter dan</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation>Vraag bevestiging voor synchronisatie van mappen op externe opslag</translation>
</message>
@@ -1262,31 +1364,67 @@ Doorgaan met deze synchronisatie overschrijft al uw bestanden door een eerdere v
<translation>Gebruik &amp;monochrome pictogrammen</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>Bewerken &amp;genegeerde bestanden</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>T&amp;onen crash reporter</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>Over</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>Updates</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>&amp;Herstarten en &amp;Bijwerken</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Annuleren</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1358,7 +1496,7 @@ Account: %3
<translation>Verwijder</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1367,27 +1505,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
Onderdelen die gewist mogen worden worden verwijderd als ze voorkomen dat een map verdwijnt. Dit is nuttig voor metadata.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Kon het bestand niet openen</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>Er kunnen geen wijzigingen worden geschreven naar %1</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Toevoegen negeerpatroon</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Voeg nieuw negeerpatroon toe:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Deze entry is door het systeem geleverd op &apos;%1&apos; en kan niet worden aangepast in deze sessie.</translation>
</message>
@@ -1417,7 +1555,7 @@ Onderdelen die gewist mogen worden worden verwijderd als ze voorkomen dat een ma
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Map</translation>
</message>
@@ -1432,35 +1570,45 @@ Onderdelen die gewist mogen worden worden verwijderd als ze voorkomen dat een ma
<translation>Tonen genegeerde bestanden</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
+ <translation>Er zijn teveel problemen. Niet alles zal worden vertoond.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
- <translation type="unfinished"/>
+ <translation>Kopieer de probleemlijst naar het klembord.</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Kopiëren</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Tijd</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Bestand</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation>Probleem</translation>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1482,40 +1630,52 @@ Onderdelen die gewist mogen worden worden verwijderd als ze voorkomen dat een ma
<message>
<location filename="../src/gui/logbrowser.cpp" line="89"/>
<source>&amp;Capture debug messages</source>
- <translation type="unfinished"/>
+ <translation>&amp;Capture berichten debuggen</translation>
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Opschonen</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Schoon de logweergave op.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>Opslaan</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Sla het logbestand op om te debuggen.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Opslaan logbestand</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Fout</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>Kon niet schrijven naar logbestand %1</translation>
</message>
@@ -1523,12 +1683,12 @@ Onderdelen die gewist mogen worden worden verwijderd als ze voorkomen dat een ma
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Fout</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;Bestand &apos;%1&apos;&lt;br/&gt;kan niet worden geopend voor schrijven.&lt;br/&gt;&lt;br/&gt;De logging output kan &lt;b&gt;niet&lt;/b&gt; worden weggeschreven!&lt;/nobr&gt;</translation>
</message>
@@ -1536,27 +1696,27 @@ Onderdelen die gewist mogen worden worden verwijderd als ze voorkomen dat een ma
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Nieuwe versie beschikbaar</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;Er is een nieuwe versie van de %1 Client beschikbaar.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is beschikbaar voor download. De geïnstalleerde versie is %3.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Deze versie overslaan.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Deze keer overslaan</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Ophalen update</translation>
</message>
@@ -1644,27 +1804,27 @@ Onderdelen die gewist mogen worden worden verwijderd als ze voorkomen dat een ma
<translation>Beperk automatisch</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Hostnaam van proxy server</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Gebruikersnaam voor proxy server</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Wachtwoord voor proxy server</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>HTTP(S) proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>SOCKS5 proxy</translation>
</message>
@@ -1672,23 +1832,23 @@ Onderdelen die gewist mogen worden worden verwijderd als ze voorkomen dat een ma
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>Aangemaakt op %1</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>Wordt afgesloten binnen enkele seconden...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation>%1 aanvraag mislukt om %2</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation>&apos;%1&apos; geselecteerd om %2</translation>
@@ -1697,92 +1857,92 @@ Onderdelen die gewist mogen worden worden verwijderd als ze voorkomen dat een ma
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation>Fout gemeld door de server: &lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
- <translation type="unfinished"/>
+ <translation>Er heeft zich een fout voorgedaan bij het verkrijgen van de &apos;token&apos; eindpunt: 1 2 %1 2</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
- <translation type="unfinished"/>
+ <translation>Kon de JSON dat teruggekomen is van de server niet ontleden: 1 2 %1 2</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
- <translation type="unfinished"/>
+ <translation>Het antwoord van de server bevat niet alle verwachte velden</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation>&lt;h1&gt;Inlog fout&lt;p&gt;%1&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>1 Verkeerde gebruiker 1 2 U bent ingelogd met user 3 %1 3, maar dient ingelogd te zijn met user 4 %2 4. 5 Log %3 alstublieft uit in een andere tabblad, vervolgens 6 klikt u hier 6 en log-in als user %2 2</translation>
</message>
</context>
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Nieuwe %1 update is klaar</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>Er wordt een nieuwe update voor %1 geïnstalleerd. De updater kan
vragen om extra autorisaties tijdens installatie.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>Downloaden versie %1. Even geduld...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>Kon de download niet bijwerken. Klik &lt;a href=&apos;%1&apos;&gt;hier&lt;/a&gt; om de download handmatig bij te werken.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Kon niet controleren op updates.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>%1 versie %2 beschikbaar. Herstart de applicatie om de update te starten.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>Nieuwe %1 versie %2 beschikbaar. Gebruik de systeemupdate tool om te installeren.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Controleren updateserver...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>Update status is onbekend: niet gecontroleerd op nieuwe updates.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>Geen updates beschikbaar. Uw installatie is al de laatste versie.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Controle update</translation>
</message>
@@ -1790,43 +1950,43 @@ vragen om extra autorisaties tijdens installatie.</translation>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Verbinden met %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Bepaal de instellingen voor de lokale map</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Verbinden...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1 map &apos;%2&apos; is gesynchroniseerd naar de lokale map &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>Sync map &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Waarschuwing:&lt;/strong&gt; De lokale map is niet leeg. Maak een keuze!&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Lokale synchronisatiemap</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1885,14 +2045,19 @@ vragen om extra autorisaties tijdens installatie.</translation>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Verbinden met %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
- <translation type="unfinished"/>
+ <translation>Login in uw browser</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation>Kopiëren link naar klembord</translation>
</message>
</context>
<context>
@@ -1924,153 +2089,163 @@ We adviseren deze site niet te gebruiken.</translation>
<source>&amp;Next &gt;</source>
<translation>&amp;Volgende &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>Ongeldige URL</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Succesvol verbonden met %1: %2 versie %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Kon geen verbinding maken met %1 op %2:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>Time-out bij verbinden met %1 om %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Probeer te verbinden met %1 om %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>De geauthentiseerde aanvraag voor de server werd omgeleid naar &apos;%1&apos;. De URL is onjuist, de server is verkeerd geconfigureerd.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>Er was een ongeldig antwoord op een geauthenticeerde webdav opvraging</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>Toegang door server verboden. Om te verifiëren dat u toegang mag hebben, &lt;a href=&quot;%1&quot;&gt;klik hier&lt;/a&gt; om met uw browser toegang tot de service te krijgen.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>Ongeldige URL</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
- <translation type="unfinished"/>
+ <translation>De server rapporteerde de volgende fout:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>Lokale synch map %1 bestaat al, deze wordt ingesteld voor synchronisatie.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>Creëren lokale sync map %1...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>ok</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>mislukt.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>Kon lokale map %1 niet aanmaken</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>Geen externe map opgegeven!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Fout: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>aanmaken map op ownCloud: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>Externe map %1 succesvol gecreërd.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>De remote map %1 bestaat al. Verbinden voor synchroniseren.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>Het aanmaken van de map resulteerde in HTTP foutcode %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>Het aanmaken van de remote map is mislukt, waarschijnlijk omdat uw inloggegevens fout waren.&lt;br/&gt;Ga terug en controleer uw inloggegevens.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Het aanmaken van de remote map is mislukt, waarschijnlijk omdat uw inloggegevens fout waren.&lt;/font&gt;&lt;br/&gt;ga terug en controleer uw inloggevens.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>Aanmaken van remote map %1 mislukt met fout &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>Er is een sync verbinding van %1 naar remote directory %2 opgezet.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Succesvol verbonden met %1!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>Verbinding met %1 niet geslaagd. Probeer het nog eens.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Hernoemen map mislukt</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>Kan de map niet verwijderen en backuppen, omdat de map of een bestand daarin, geopend is in een ander programma. Sluit de map of het bestand en drup op Opnieuw of annuleer de installatie.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Lokale synch map %1 is succesvol aangemaakt!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2078,14 +2253,31 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>%1 Verbindingswizard</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Sla configuratie van mappen over</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2109,7 +2301,7 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>Ongeldig JSON antwoord van de opgegeven URL</translation>
</message>
@@ -2117,7 +2309,7 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>Fout bij schrijven van Metadata naar de database</translation>
</message>
@@ -2125,47 +2317,47 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>Bestand %1 kan niet worden gedownload, omdat de naam conflicteert met een lokaal bestand</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
- <translation type="unfinished"/>
+ <translation>De download zal de vrije lokale schijfruimte reduceren tot onder het limiet</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>Vrije schijfruimte is minder dan %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>Bestand was verwijderd van de server</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>Het bestand kon niet volledig worden gedownload.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation>Het gedownloade bestand is leeg, hoewel de server meldde dat het %1 zou moeten zijn.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>Bestand %1 kan niet worden opgeslagen wegens een lokaal bestandsnaam conflict!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>Het bestand is gewijzigd sinds het is gevonden</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>Fout bij schrijven van Metadata naar de database</translation>
</message>
@@ -2173,12 +2365,12 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; Herstel mislukte: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation>Er is een bestand of map verwijderd van een alleen-lezen share, maar herstellen is mislukt: %1</translation>
</message>
@@ -2186,22 +2378,22 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>kon bestand file %1 niet verwijderen, fout: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>Let op, mogelijk conflict hoofdlettergevoeligheid met 1%</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>kon map %1 niet maken</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>Fout bij schrijven van Metadata naar de database</translation>
</message>
@@ -2209,17 +2401,17 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>Fout bij verwijderen &apos;%1&quot;: %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>Kon map &apos;%1&apos; niet verwijderen</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>Bestand %1 kon niet worden verwijderd, omdat de naam conflicteert met een lokaal bestand</translation>
</message>
@@ -2227,13 +2419,13 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>Bestand %1 kan niet worden hernoemd naar %2, omdat de naam conflicteert met een lokaal bestand</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>Fout bij schrijven van Metadata naar de database</translation>
</message>
@@ -2241,12 +2433,7 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>Het bestand is verwijderd van een alleen-lezen share. Het is teruggezet.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>Foutieve HTTP code ontvangen van de server. Verwacht was 204, maar ontvangen &quot;%1 %2&quot;.</translation>
</message>
@@ -2254,12 +2441,12 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Foutieve HTTP code ontvangen van de server. Verwacht was 201, maar ontvangen &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>Fout bij schrijven van Metadata naar de database</translation>
</message>
@@ -2267,28 +2454,13 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Deze map mag niet worden hernoemd. De naam van de map is teruggezet naar de originele naam.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Deze map mag niet worden hernoemd. Verander de naam terug in Gedeeld.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>Het bestand is hernoemd, maar hoort bij een alleen-lezen share. Het originele bestand is teruggezet.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Foutieve HTTP code ontvangen van de server. Verwacht werd 201, maar ontvangen &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>Fout bij schrijven van Metadata naar de database</translation>
</message>
@@ -2296,33 +2468,33 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation>Bestand %1 kan niet worden geüpload omdat er al een ander bestand met dezelfde naam bestaan, al verschillen hoofd/kleine letters</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Bestand verwijderd</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>Lokaal bestand gewijzigd bij sync. Wordt opnieuw meengenomen.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>Lokaal bestand gewijzigd bij sync.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
- <translation type="unfinished"/>
+ <translation>Upload van %1 overtreft de quota van de folder</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>Fout bij schrijven van Metadata naar de database</translation>
</message>
@@ -2330,27 +2502,27 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>Het lokale bestand werd verwijderd tijdens sync.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>Lokaal bestand gewijzigd bij sync.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation>Onverwachte reactie van server (%1)</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation>Ontbrekende File ID van de server</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation>Ontbrekende ETag van de server</translation>
</message>
@@ -2358,27 +2530,22 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>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.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>URL opvraag ontbreekt</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>Het lokale bestand werd verwijderd tijdens sync.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>Lokaal bestand gewijzigd bij sync.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation>De server heeft het laatste deel niet bevestigd (er was geen e-tag aanwezig)</translation>
</message>
@@ -2396,42 +2563,47 @@ We adviseren deze site niet te gebruiken.</translation>
<translation>Tekstlabel</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Open in browser</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Tijd</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Bestand</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Map</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Handeling</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Grootte</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>Lokaal sync protocol</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Kopiëren</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Kopieer de activiteitenlijst naar het klembord.</translation>
</message>
@@ -2472,7 +2644,7 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Kies wat te synchroniseren</translation>
</message>
@@ -2480,33 +2652,33 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Laden ...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation>Deselecteer de externe mappen die u niet wenst te synchroniseren.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Naam</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Grootte</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>Momenteel geen submappen op de server.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation>Er trad een fout op bij het laden van de lijst met submappen.</translation>
</message>
@@ -2527,22 +2699,22 @@ We adviseren deze site niet te gebruiken.</translation>
<translation>Instellingen</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Activiteit</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Algemeen</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Netwerk</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Account</translation>
</message>
@@ -2550,28 +2722,28 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Activiteit</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Algemeen</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Netwerk</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Account</translation>
</message>
@@ -2599,42 +2771,42 @@ We adviseren deze site niet te gebruiken.</translation>
<translation>OwnCloud Pad:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>%1 Delen</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Map: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>De server staat delen niet toe</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation>Maximum aantal mogelijke permissies van de server ophalen...</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Het bestand kan niet worden gedeeld, omdat het werd gedeeld zonder verder delen toestemming.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>Gebruikers en Groepen</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>Openbare Links</translation>
</message>
@@ -2647,7 +2819,17 @@ We adviseren deze site niet te gebruiken.</translation>
<translation>Delen NewDocument.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>Tekstlabel</translation>
</message>
@@ -2659,12 +2841,12 @@ We adviseren deze site niet te gebruiken.</translation>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="35"/>
<source>Enter a name to create a new public link...</source>
- <translation type="unfinished"/>
+ <translation>Voer een naam in om een nieuwe publieke link aan te maken</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="42"/>
<source>&amp;Create new</source>
- <translation type="unfinished"/>
+ <translation>&amp;Create nieuw</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="105"/>
@@ -2677,19 +2859,24 @@ We adviseren deze site niet te gebruiken.</translation>
<translation>Instellen wachtwoord</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
- <translation>Link eigenschappen:</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
+ <translation>Ontvangers kunnen de inhoud bekijken of downloaden.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation>Download / Bekijk</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>Tonen bestandenlijst</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation>Download / Bekijk / Upload</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Toestaan bewerken</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation>Ontvangers kunnen de inhoud bekijken, downloaden, bewerken, verwijderen en uploaden.</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2697,95 +2884,95 @@ We adviseren deze site niet te gebruiken.</translation>
<translation>Iedereen met de link heeft toegang tot het bestand of de map</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>&amp;Wachtwoord beveiligd</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Wachtwoord beveiligd</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Het bestand kan niet worden gedeeld, omdat het werd gedeeld zonder verder delen toestemming.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
- <translation type="unfinished"/>
+ <translation>Link delen zijn uitgeschakeld</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
- <translation type="unfinished"/>
+ <translation>Maak een verdeelbare publieke link aan</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Verwijderen</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation>Openen link in browser</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation>Kopiëren link naar klembord</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
- <translation type="unfinished"/>
+ <translation>Kopieer de link naar het klembord (directe download)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Versturen links via e-mail</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
+ <translation>Verzend link met email (directe download)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
- <translation type="unfinished"/>
+ <translation>Bevestig Gedeelde Link Verwijdering</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>1 Wilt u echt de verdeelbare publieke link verwijderen 2 %1 2 ? 1 3 Let op: deze actie kan niet ongedaan gemaakt worden. 3</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Annuleren</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation>Openbare Link</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
- <translation type="unfinished"/>
+ <translation>Verwijder verdeelbare link</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>Openbaar de&amp;len vereist een wachtwoord</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Stel uw wachtwoord in</translation>
</message>
@@ -2808,32 +2995,32 @@ We adviseren deze site niet te gebruiken.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation>Openen link in browser</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation>Kopiëren link naar klembord</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Versturen links via e-mail</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>Geen resultaten voor &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation>Ik deelde iets met u</translation>
</message>
@@ -2846,37 +3033,38 @@ We adviseren deze site niet te gebruiken.</translation>
<translation>Formulier</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>Tekstlabel</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>kan wijzigen</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>kan delen</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>creëer</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>wijzig</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>verwijderen</translation>
</message>
@@ -2920,143 +3108,176 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>Delen met %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation>Ik deelde iets met u</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation>Delen...</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation>Kopiëren privé-link naar klembord</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Open in browser</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Certificaat details&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Common Name (CN):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>Alternatieve subject namen:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Organisatie (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Organisatie unit (OU):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Land/Provincie:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>Land:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Serienummer:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Uitgever&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Uitgever:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Uitgegeven op:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Vervalt op:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Vingerafdrukken&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;Let op:&lt;/b&gt; Dit certificaat werd handmatig goedgekeurd&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (zelf ondertekend)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>Deze verbinding is versleuteld via %1 bit %2.
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation>Geen ondersteuning voor SSL-sessie tickets/identifiers</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Certificaat informatie:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>Deze verbinding is NIET veilig, omdat deze niet versleuteld is.
@@ -3144,305 +3365,270 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Succes.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>CSync kon het journal bestand niet inladen. Het journal bestand is kapot.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;De %1 plugin voor csync kon niet worden geladen.&lt;br/&gt;Verifieer de installatie!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>CSync fatale parameter fout.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>CSync verwerkingsstap bijwerken mislukt.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>CSync verwerkingsstap verzamelen mislukt.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync kon niet authenticeren bij de proxy.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSync kon geen proxy of server vinden.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync kon niet authenticeren bij de %1 server.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync kon niet verbinden met het netwerk.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>Er trad een netwerk time-out op.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>Er trad een HTTP transmissiefout plaats.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation>De gemounte map is tijdelijk niet beschikbaar op de server</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>Er trad een fout op bij het openen van een map</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>Fout tijdens lezen map.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>Bestand/Map is genegeerd omdat het verborgen is. </translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation>Slechts %1 beschikbaar, maar heeft minimaal %2 nodig om te starten</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation>Niet toegestaan omdat u geen rechten hebt om een bovenliggende map toe te voegen</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation>Niet toegestaan omdat u geen rechten hebt om bestanden in die map toe te voegen</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: Geen ruimte op %1 server beschikbaar.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>CSync ongedefinieerde fout.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Afgebroken door de gebruiker</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>CSync kreeg geen toegang</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
- <translation>CSync kon het journal bestand niet maken of lezen. Controleer of u de juiste lees- en schrijfrechten in de lokale syncmap hebt.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
- <translation>CSync mislukt omdat de benodigde toegang werd geweigerd.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
- <translation>CSync probeerde een al bestaande map aan te maken.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>De dienst is tijdelijk niet beschikbaar</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>Toegang verboden</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>Een interne fout met nummer %1 is opgetreden.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>Symbolische links worden niet ondersteund bij het synchroniseren.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>Het bestand is opgenomen op de negeerlijst.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation>Bestandsnamen die eindigen met een punt worden niet ondersteund door het bestandssysteem.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation>Bestandsnamen met een &apos;%1&apos; symbool worden niet ondersteund door het bestandssysteem.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation>De bestandsnaam is een gereserveerde naam op dit bestandssysteem.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation>De bestandsnaam bevat spaties achteraan.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>De bestandsnaam is te lang.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>Stat mislukt.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>Bestandsnaamcodering is niet geldig</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>Ongeldige tekens, hernoem &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation>Kan de blacklist niet lezen uit de lokale database</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation>Niet mogelijk om te lezen uit het synchronisatie verslag.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>Kan het sync transactielog niet openen</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>De bestandsnaam bevat ten minste één ongeldig teken</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>Genegeerd vanwege de &quot;wat synchroniseren&quot; zwarte lijst</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation>Niet toegestaan, omdat je geen permissies hebt om submappen aan die map toe te voegen</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>Niet toegestaan om dit bestand te uploaden, omdat het alleen-lezen is op de server, herstellen</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>Niet toegestaan om te verwijderen, herstellen</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>Lokale bestanden en share-map verwijderd. </translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>Verplaatsen niet toegestaan, object hersteld</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>Verplaatsen niet toegestaan, omdat %1 alleen-lezen is</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>bestemming</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>bron</translation>
</message>
@@ -3466,17 +3652,17 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Versie %1. Voor meer informatie bezoek &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;Gedistribueerd door %1 en gelicenseerd onder de GNU General Public License (GPL) Versie 2.0.&lt;br/&gt;%2 en het %2 logo zijn geregistreerde handelsmerken van %1 in de Verenigde Staten, in andere landen of beide.&lt;/p&gt;</translation>
</message>
@@ -3507,81 +3693,81 @@ We adviseren deze site niet te gebruiken.</translation>
<translation>Log alstublieft in</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Map %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Er zijn geen synchronisatie-mappen geconfigureerd.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Open in browser</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Inloggen...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Afmelden</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Recente wijzigingen</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Controleren op wijzigingen in &apos;%1&apos;</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Beheerde mappen:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Open map &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Open %1 in browser</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Onbekende status</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Instellingen...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Details ...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Help</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>%1 afsluiten</translation>
</message>
@@ -3596,11 +3782,6 @@ We adviseren deze site niet te gebruiken.</translation>
<translation>Niet-ondersteunde server versie</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation>De server van account %1 gebruikt een oude versie %2. Het gebruik van deze clientsoftware met niet-ondersteunde server versies is niet getest en mogelijk gevaarlijk. Verdergaan is voor uw eigen risico.</translation>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Niet verbonden</translation>
@@ -3632,116 +3813,129 @@ We adviseren deze site niet te gebruiken.</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation>Hervat alle mappen</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>Pauzeer alle mappen</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>Hervat alle synchronisatie</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>Hervat synchronisatie</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>Pauzeer alle synchronisatie</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>Pauzeer synchronisatie</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Uitloggen van alle accounts...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Inloggen op alle accounts...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>Nieuw account...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>About %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>Crash nu</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Recent niets gesynchroniseerd</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Sync %1 van %2 (%3 over)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation>Synchroniseren %1 van %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Sync %1 (%2 over)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>Synchroniseren %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Bijgewerkt</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Versie %2. Voor meer informatie bezoek &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Voor bekende problemen en hulp, bezoek: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;small&gt;Door Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt en anderen.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud, GmbH&lt;/p&gt;&lt;p&gt;Gelicenseerd onder de GNU General Public License (GPL) Versie 2.0&lt;br/&gt;ownCloud en het ownCloud logo zijn geregistreerde handelsmerken van ownCloud GmbH in de Verenigde Staten, andere landen, of beide.&lt;/p&gt;</translation>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3753,9 +3947,9 @@ We adviseren deze site niet te gebruiken.</translation>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>TekstLabel</translation>
</message>
@@ -3791,11 +3985,22 @@ We adviseren deze site niet te gebruiken.</translation>
<translation>Vraag bevestiging voor synchronisatie van e&amp;xterne opslag</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Selectieve synchronisatie</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>&amp;Lokale map</translation>
@@ -3812,11 +4017,16 @@ We adviseren deze site niet te gebruiken.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>S&amp;ynchroniseer alles vanaf de server</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Statusbericht</translation>
</message>
@@ -3853,7 +4063,7 @@ We adviseren deze site niet te gebruiken.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
+ <source>An error occurred while connecting. Please try again.</source>
<translation type="unfinished"/>
</message>
<message>
@@ -4033,7 +4243,7 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;Gebouwd vanuit Git revisie &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; op %3, %4 gebruik makend van Qt %5, %6&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4131,52 +4341,52 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Ongedefinieerde status</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>In afwachting van synchronisatie</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>Bezig met synchroniseren</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Synchronisatie geslaagd</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Synchronisatie geslaagd, sommige bestanden werden genegeerd.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Synchronisatiefout</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Installatiefout</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Voorbereiden synchronisatie</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Aan het afbreken...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>Synchronisatie is gepauzeerd</translation>
</message>
@@ -4184,22 +4394,22 @@ We adviseren deze site niet te gebruiken.</translation>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
- <translation type="unfinished"/>
+ <translation>Kon het browser niet openen</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation>Kon e-mailclient niet openen</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation>Er trad een fout op bij het starten van de e-mailclient om een nieuw bericht te maken. Misschien is er geen e-mailclient gedefinieerd?</translation>
</message>
diff --git a/translations/client_pl.ts b/translations/client_pl.ts
index 5d1ce36e5..7f5eced69 100644
--- a/translations/client_pl.ts
+++ b/translations/client_pl.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="pl" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation>Nie można utworzyć folderów w Koszu</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation>Nie można przenieść &apos;%1&apos; do &apos;%2&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation>Przenoszenie do Kosza nie jest dostępne na tej platformie</translation>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,19 +95,19 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Przekroczono czas odpowiedzi</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
- <translation type="unfinished"/>
+ <translation>Nieznany błąd: odpowiedź sieci została usunięta</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
- <translation type="unfinished"/>
+ <translation>Serwer odpowiedział &quot;%1 %2&quot; do &quot;%3 %4&quot;</translation>
</message>
</context>
<context>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Anuluj</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Konto</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Wybierz co synchronizować</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Zsynchronizuj teraz</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>Uruchom ponownie synchronizację</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>Usuń folder połączenia synchronizacji</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Nie udało się stworzyć katalogu</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;Nie można stworzyć lokalnego katalogu &lt;i&gt;%1&lt;/i&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
- <translation>Usuń folder połączenia synchronizacji</translation>
+ <translation>Potwierdź usunięcie połączenia folderów synchronizacji</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>Usuń folder połączenia synchronizacji</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Synchronizacja uruchomiona</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>Operacja synchronizacji jest uruchomiona.&lt;br&gt;Czy chcesz ją zakończyć?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 w użyciu</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 jako &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>Wersja serwera %1 jest przestarzała i nie jest już wspierana. Kontynuujesz na własne ryzyko.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Podłączony do %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>Serwer %1 jest tymczasowo niedostępny.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation>Serwer %1 jest obecnie w trybie konserwacji.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>Wylogowano z %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation>Łączenie do %1...</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>Brak połączenia do %1 z %2.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Zaloguj</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>Te foldery nie zostały zsynchronizowane ponieważ są zbyt duze:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>Te foldery nie zostały zsynchronizowane ponieważ znajdują się w pamięci zewnętrznej:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation>Te foldery nie zostały zsynchronizowane ponieważ są zbyt duże lub znajdują się w pamięci zewnętrznej:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Potwierdź usunięcie konta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Czy na pewno chcesz usunąć połączenie z kontem &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Uwaga:&lt;/b&gt; ta operacja &lt;b&gt;nie&lt;/b&gt; usunie plików klienta.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Usuwanie połączenia</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Otwórz katalog</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Wyloguj</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Przywróć synchronizację</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Zatrzymaj synchronizację</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Czy na pewno chcesz zatrzymać synchronizację folderu &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Uwaga:&lt;/b&gt; ta operacja &lt;b&gt;nie&lt;/b&gt; usunie plików z klienta.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1 (%3%) z %2 w użyciu. Niektóre foldery, w tym zamontowane lub udostępnione foldery w sieci, mogą mieć różne limity.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%1 z %2 w użyciu</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Obecnie nie ma dostępnych informacji o wykorzystaniu pamięci masowej.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>Połączenie %1 nie skonfigurowane.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Odłączony</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Rozłączony</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Połączony</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Usługa niedostępna</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation>Tryb konserwacji</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Błąd sieci</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Błąd konfiguracji</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
- <translation type="unfinished"/>
+ <translation>Zapytanie o poświadczenia</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Status konta nieznany</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Aktywność serwera</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Protokół synchronizacji</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>Niezsynchronizowany</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>Niezsynchronizowany (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>Log aktywności serwera został skopiowany do schowka.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>Przebieg synchronizacji został skopiowany do schowka.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>Lista niezsynchronizowanych elementów została skopiowana do schowka</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Skopiuj do schowka</translation>
</message>
@@ -469,47 +488,47 @@
<translation>Etykieta</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Działania serwera</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Kopiuj</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Kopiuj listę aktywności do schowka.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Wymagana akcja: Powiadomienia</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;Użytkownik %1 nie ma włączonej historii aktywności.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation><numerusform>Otrzymano %n nowe powiadomienie od %2.</numerusform><numerusform>Otrzymano %n nowe powiadomienia od %2.</numerusform><numerusform>Otrzymano %n nowych powiadomień od %2.</numerusform><numerusform>Otrzymano %n nowych powiadomień od %2.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation><numerusform>Otrzymano %n nowe powiadomienie od %1 i %2.</numerusform><numerusform>Otrzymano %n nowe powiadomienia od %1 i %2.</numerusform><numerusform>Otrzymano %n nowych powiadomień %1 i %2.</numerusform><numerusform>Otrzymano %n nowych powiadomień %1 i %2.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>Otrzymałeś nowe powiadomienia z %1, %2 i innych kont.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>%1 Powiadomień - Wymagana akcja</translation>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation>Kontynuowanie oznacza &lt;b&gt; usunięcie tych ustawień &lt;/b&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation>Kontynuowanie oznacza &lt;b&gt; zignorowanie tych ustawień &lt;/b&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation>Część ustawień została skonfigurowana w nowszej wersji klienta i nie jest dostępna w tej wersji &lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt; Aktualna konfiguracja została zarchiwizowana w &lt;i&gt;%2&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Wyjdź</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Kontynuuj </translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation>Błąd przy dostępie do pliku konfiguracji</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation>Wystąpił błąd podczas próby dostępu do pliku konfiguracyjnego %1.</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>Wyłącz ownCloud</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>Błąd podczas zapisu metadanych do bazy</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>Nie skonfigurowano konta ownCloud</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>Konfigurowany serwer dla tego klienta jest za stary</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Proszę zaaktualizować serwer do najnowszej wersji i zrestartować klienta.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Błąd autentykacji: nazwa użytkownika lub hasło są nieprawidłowe.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>wygaśnięcie</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>Podane dane logowania są nieprawidłowe</translation>
</message>
@@ -637,133 +681,160 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Anulowane przez użytkownika</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>Folder lokalny %1 nie istnieje.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 powinien być katalogiem, ale nie jest.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 jest nie do odczytu.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 został usunięty.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 został ściągnięty.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 został uaktualniony.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 zmienił nazwę na %2.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 został przeniesiony do %2.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation><numerusform>%1 i %n inny plik został usunięty.</numerusform><numerusform>%1 i %n inne pliki zostały usunięte.</numerusform><numerusform>%1 i %n innych plików zostało usuniętych.</numerusform><numerusform>%1 i %n innych plików zostało usuniętych.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation><numerusform>%1 i %n inny plik został pobrany.</numerusform><numerusform>%1 i %n inne pliki zostały pobrane.</numerusform><numerusform>%1 i %n innych plików zostało pobranych.</numerusform><numerusform>%1 i %n innych plików zostało pobranych.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation><numerusform>%1 i %n inny plik został zaktualizowany.</numerusform><numerusform>%1 i %n inne pliki zostały zaktualizowane.</numerusform><numerusform>%1 i %n innych plików zostało zaktualizowanych.</numerusform><numerusform>%1 i %n innych plików zostało zaktualizowanych.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation><numerusform>Zmieniono nazwę %1 na %2 oraz %n innemu plikowi została zmieniona nazwa.</numerusform><numerusform>Zmieniono nazwę %1 na %2 oraz %n innym plikom została zmieniona nazwa.</numerusform><numerusform>%1 has been renamed to %2 and %n other file(s) have been renamed.</numerusform><numerusform>%1 has been renamed to %2 and %n other file(s) have been renamed.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation><numerusform>Przeniesiono %1 do %2 oraz przeniesiono %n inny plik.</numerusform><numerusform>Przeniesiono %1 do %2 oraz przeniesiono %n inne pliki.</numerusform><numerusform>Przeniesiono %1 do %2 oraz przeniesiono %n innych plików.</numerusform><numerusform>Przeniesiono %1 do %2 oraz przeniesiono %n innych plików.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation><numerusform>%1 plik ma błąd synchronizacji</numerusform><numerusform>%1 i %n innych plików mają konflikt synchronizacji.</numerusform><numerusform>%1 i %n innych plików mają konflikt synchronizacji.</numerusform><numerusform>%1 i %n innych plików mają konflikt synchronizacji.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation>%1 ma konflikt synchronizacji. Sprawdź konfliktujący plik!</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation><numerusform>Plik %1 nie może zostać zsynchronizowany z powodu błędów. Sprawdź szczegóły w logu..</numerusform><numerusform>%1 i %n innych plików nie mogą zostać zsynchronizowane z powodu błędów. Sprawdź szczegóły w logu..</numerusform><numerusform>%1 i %n innych plików nie mogą zostać zsynchronizowane z powodu błędów. Sprawdź szczegóły w logu..</numerusform><numerusform>%1 i %n innych plików nie mogą zostać zsynchronizowane z powodu błędów. Sprawdź szczegóły w logu..</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 nie może zostać zsynchronizowany z powodu błędu. Zobacz szczegóły w logu.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Aktywności synchronizacji</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>Nie można przeczytać pliku wyłączeń</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation>Nowy folder większy niż %1MB został dodany: %2
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation>Folder z pamięci zewnętrznej został dodany .
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation>Przejdź do ustawień żeby go zaznaczyć i pobrać.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation>Folder %1 został utworzony ale poprzednio został wykluczony z synchronizacji. Dane wewnątrz folderu nie będą zsynchronizowane.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation>Plik %1 został utworzony ale poprzednio został wykluczony z synchronizacji. Nie będzie zsynchronizowany.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -774,46 +845,46 @@ Jeśli zdecydujesz się zatrzymać pliki i posiadasz odpowiednie uprawnienia, zo
Jeśli zdecydujesz je usunąć, nie będą więcej dostępne. </translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Usunąć wszystkie pliki?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Usuń wszystkie pliki</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Pozostaw pliki</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>Wykryto kopię zapasową.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>Normalna synchronizacja.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>Zatrzymaj pliki lokalne i ustaw status konfliktu.</translation>
</message>
@@ -821,115 +892,105 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>Nie udało się zresetować stanu folderu</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>Stary sync journal &apos;%1&apos; został znaleziony, lecz nie mógł być usunięty. Proszę się upewnić, że żaden program go obecnie nie używa.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation>(kopia zapasowa)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation>(kopia zapasowa %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Niezdefiniowany stan</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>Poczekaj na rozpoczęcie synchronizacji.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Przygotowuję do synchronizacji</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>Synchronizacja w toku</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>Ostatnia synchronizacja zakończona powodzeniem.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>Ostatnia synchronizacja udana, ale istnieją ostrzeżenia z pojedynczymi plikami.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>Ostatnia synchronizacja zakończona powodzeniem.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Błąd ustawień.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Użytkownik anulował.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>Synchronizacja wstrzymana</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation> %1 (Synchronizacja jest zatrzymana)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>Nie wybrano poprawnego folderu.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>Wybrana ścieżka nie jest katalogiem!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Nie masz uprawnień, aby zapisywać w tym katalogu!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Lokalny folder %1 już zawiera folder użyty na potrzeby synchronizacji. Proszę wybrać inny folder lokalny.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Lokalny folder %1 już zawiera folder użyty na potrzeby synchronizacji. Proszę wybrać inny folder lokalny.</translation>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -939,7 +1000,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Dodaj folder połączenia synchronizacji</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>Synchronizacja z folderem lokalnym.</translation>
</message>
@@ -974,7 +1035,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Wystąpił błąd podczas pobierania listy folderów z serwera.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Odłączony</translation>
</message>
@@ -986,118 +1047,136 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<message>
<location filename="../src/gui/folderstatusmodel.cpp" line="209"/>
<source>There are unresolved conflicts. Click for details.</source>
+ <translation>Istnieją nierozwiązane konflikty. Kliknij aby poznać szczegóły.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Sprawdzanie zmian na &apos;%1&apos;</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation>Sprawdzanie zmian w lokalizacji zdalnej &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation>Sprawdzanie zmian w lokalizacji lokalnej &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>Synchronizowanie %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>pobieranie %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>wysyłanie %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 z %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>Plik %3 z %4, pozostało czasu %5 (%1 z %2)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 z %2, plik %3 z %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>plik %1 z %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>Czekaj...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>Oczekiwanie na %n inny folder...</numerusform><numerusform>Oczekiwanie na %n inne foldery...</numerusform><numerusform>Oczekiwanie na %n innych folderów...</numerusform><numerusform>Oczekiwanie na %n innych folderów...</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>Przygotowanie do synchronizacji ...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>Dodaj folder połączenia synchronizacji</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>Dodaj połączenie synchronizacji</translation>
</message>
@@ -1105,17 +1184,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Kliknij, aby wybrać folder lokalny do synchronizacji.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Wpisz ścieżkę do folderu lokalnego.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Wybierz katalog źródłowy</translation>
</message>
@@ -1123,60 +1202,68 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Dodaj zdalny katalog</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>Wpisz nazwę dla nowego katalogu, utworzonego poniżej &apos;%1&apos;:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>Folder został utworzony pomyślnie na %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>Błąd autentykacji w dostępie do %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>Nie udało się utworzyć folderu na %1. Proszę sprawdzić ręcznie.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>Nie udało się wyświetlić folderu. Błąd: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Wybierz to, aby zsynchronizować całe konto</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Ten katalog jest już synchronizowany.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Synchronizujesz już &lt;i&gt;%1&lt;/i&gt;, który jest folderem nadrzędnym &lt;i&gt;%2&lt;/i&gt;.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Ostrzeżenie:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Ostrzeżenie:&lt;/b&gt;</translation>
</message>
@@ -1184,22 +1271,22 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>Nie otrzymano E-Tag z serwera, sprawdź Proxy/Bramę</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>Otrzymaliśmy inny E-Tag wznowienia. Spróbuje ponownie następnym razem.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>Serwer zwrócił błędną zakres zawartości</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Limit czasu połączenia</translation>
</message>
@@ -1222,23 +1309,38 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>W zasobniku systemowym</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation>stable</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation>beta</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Zaawansowane</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation>Zapytaj o potwierdzenie przed synchronizacją folderów większych niż</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation>Zapytaj o potwierdzenie przed synchronizacją zewnętrznych skladowisk plikow</translation>
</message>
@@ -1258,31 +1360,67 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Używaj &amp;monochromatycznych ikon</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>Edytuj pliki &amp;ignorowane (pomijane)</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>Pokaż &amp;raport awarii</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>O aplikacji</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>Aktualizacje</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>&amp;Zrestartuj &amp;&amp; Aktualizuj</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation>Czy zmienić kanał aktualizacji?</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation>Zmiana kanału aktualizacji</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Anuluj</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation>Błąd udostępniania</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1304,7 +1442,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<message>
<location filename="../src/gui/creds/httpcredentialsgui.cpp" line="157"/>
<source>&lt;a href=&quot;%1&quot;&gt;Click here&lt;/a&gt; to request an app password from the web interface.</source>
- <translation type="unfinished"/>
+ <translation>&lt;a href=&quot;%1&quot;&gt;Kliknij tutaj&lt;/a&gt;aby zażądać hasła do aplikacji w przeglądarce.</translation>
</message>
</context>
<context>
@@ -1350,7 +1488,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Usuń</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1359,27 +1497,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
Pozycje, dla których usuwanie jest dozwolone zostaną usunięte, jeżeli uprawnienia katalogu dopuszczają usuwanie.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Nie można otworzyć plików</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>Nie mogę zapisać zmian do &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Dodaj ignorowany</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Dodaj nowy ignorowany:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Ten wpis jest podawany przez system w &apos;%1&apos; i nie może być zmieniony w tym widoku.</translation>
</message>
@@ -1394,7 +1532,7 @@ Pozycje, dla których usuwanie jest dozwolone zostaną usunięte, jeżeli uprawn
<message>
<location filename="../src/gui/issueswidget.ui" line="20"/>
<source>List of issues</source>
- <translation type="unfinished"/>
+ <translation>Lista zdarzeń</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="34"/>
@@ -1409,49 +1547,59 @@ Pozycje, dla których usuwanie jest dozwolone zostaną usunięte, jeżeli uprawn
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Folder</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="73"/>
<source>Show warnings</source>
- <translation type="unfinished"/>
+ <translation>Pokaż ostrzeżenia</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="83"/>
<source>Show ignored files</source>
- <translation type="unfinished"/>
+ <translation>Pokaż ignorowane pliki</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
- <translation type="unfinished"/>
+ <translation>Wystąpiło bardzo wiele zdarzeń. Nie wszystkie będą tu widoczne</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation>Powstały konflikty. Sprawdź dokumentację żeby dowiedzieć się jak je rozwiązać.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
- <translation type="unfinished"/>
+ <translation>Skopiuj listę zdarzeń do schowka</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Kopiuj</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Czas</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Plik</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
- <translation type="unfinished"/>
+ <translation>Zdarzenie</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation>Powstały konflikty. &lt;a href=&quot;%1&quot;&gt;Sprawdź dokumentację żeby dowiedzieć się jak je rozwiązać.&lt;/a&gt;</translation>
</message>
</context>
<context>
@@ -1478,36 +1626,48 @@ Pozycje, dla których usuwanie jest dozwolone zostaną usunięte, jeżeli uprawn
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Wyczyść</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Wyczyść wyświetlane dzienniki.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>Z&amp;apisz</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Zapisz plik dziennika do pliku na dysku w celu debugowania.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Zapisz plik dziennika</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Błąd</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>Błąd zapisu pliku logu %1</translation>
</message>
@@ -1515,12 +1675,12 @@ Pozycje, dla których usuwanie jest dozwolone zostaną usunięte, jeżeli uprawn
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Błąd</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;Plik &apos;%1&apos;&lt;br&gt;nie może zostać otwarty do zapisu.&lt;br/&gt;&lt;br/&gt;Dane wyjściowe dziennika &lt;b&gt;nie&lt;/b&gt; mogą być zapisane!&lt;/nobr&gt;</translation>
</message>
@@ -1528,27 +1688,27 @@ Pozycje, dla których usuwanie jest dozwolone zostaną usunięte, jeżeli uprawn
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Nowa wersja dostępna</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;Nowa wersja klienta %1 jest dostępna.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt;jest dostępna do pobrania. Zainstalowana wersja to %3.&lt;p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Pomiń tą wersję</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Pomiń tym razem</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Uaktualnij</translation>
</message>
@@ -1636,27 +1796,27 @@ Pozycje, dla których usuwanie jest dozwolone zostaną usunięte, jeżeli uprawn
<translation>Limit automatyczniy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Nazwa hosta serwera proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Nazwa użytkownika serwera proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Hasło użytkownika serwera proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>HTTP(S) proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>SOCKS5 proxy</translation>
</message>
@@ -1664,23 +1824,23 @@ Pozycje, dla których usuwanie jest dozwolone zostaną usunięte, jeżeli uprawn
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>Utworzono o %1</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>Za kilka sekund nastąpi zamknięcie...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation type="unfinished"/>
@@ -1689,32 +1849,32 @@ Pozycje, dla których usuwanie jest dozwolone zostaną usunięte, jeżeli uprawn
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
- <translation type="unfinished"/>
+ <translation>Błąd zwrócony przez serwer: &lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;h1&gt;Błąd logowania&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -1722,59 +1882,59 @@ Pozycje, dla których usuwanie jest dozwolone zostaną usunięte, jeżeli uprawn
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Nowe %1 uaktualnienie jest gotowe</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>Nowe ualtualnienie dla %1 jest gotowe do instalacji. Aktualizator może zapytać
o dodatkowe uprawnienia podczas procesu aktualizacji.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>Pobieranie wersji %1. Proszę czekać...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>Nie można pobrać aktualizacji. Proszę kliknąć &lt;a href=&apos;%1&apos;&gt;tutaj&lt;/a&gt;, aby ściągnąć aktualizację ręcznie</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Nie można sprawdzić dostępności nowych aktualizacji.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>%1 wersja %2 jest dostępna. Zrestartuj aplikację aby rozpocząć aktualizację.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>Nowa %1 wersja %2 jest dostępna.Użyj systemowego narzędzia aby ją zainstalować.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Sprawdzanie aktualizacji serwera...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>Status aktualizacji nieznany. Nie sprawdzono nowych aktualizacji.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>Brak dostępnych aktualizacji. Twoja instalacja jest w najnowszej wersji.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Sprawdź aktualizację</translation>
</message>
@@ -1782,43 +1942,43 @@ o dodatkowe uprawnienia podczas procesu aktualizacji.</translation>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Podłącz do %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Ustawienia opcji lokalnych katalogów</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Połącz...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1 katalog &apos;%2&apos; jest zsynchronizowany do katalogu lokalnego &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>Synchronizuj folder &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Uwaga:&lt;/strong&gt; katalog lokalny nie jest pusty. Bądź ostrożny !&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Folder lokalnej synchronizacji</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1877,14 +2037,19 @@ o dodatkowe uprawnienia podczas procesu aktualizacji.</translation>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Podłącz do %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
- <translation type="unfinished"/>
+ <translation>Zaloguj się w przeglądarce.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation>Skopuj link to schowka</translation>
</message>
</context>
<context>
@@ -1916,153 +2081,163 @@ Niezalecane jest jego użycie.</translation>
<source>&amp;Next &gt;</source>
<translation>Następny</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>Błędny adres url.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation>Nie mogę załadować certyfikatu. Może hasło jest nieprawidłowe?</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Udane połączenie z %1: %2 wersja %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Nie udało się połączyć do %1 w %2:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>Upłynął czas podczas próby połączenia do %1 na %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Próba połączenia z %1 w %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>Dostęp zabroniony przez serwer. Aby sprawdzić, czy masz odpowiednie uprawnienia, kliknij &lt;a href=&quot;%1&quot;&gt;tutaj&lt;/a&gt;, aby połączyć się z usługą poprzez przeglądarkę.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>Błędny adres url.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
- <translation type="unfinished"/>
+ <translation>Serwer zgłosił następujący błąd:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>Lokalny folder synchronizacji %1 już istnieje. Ustawiam go do synchronizacji.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>Tworzenie lokalnego folderu synchronizacji %1...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>Błąd.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>Nie udało się utworzyć lokalnego folderu %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>Nie określono folderu zdalnego!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Błąd: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>tworzę folder na ownCloud: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>Zdalny folder %1 został utworzony pomyślnie.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>Zdalny folder %1 już istnieje. Podłączam go do synchronizowania.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>Tworzenie folderu spowodowało kod błędu HTTP %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>Nie udało się utworzyć zdalnego folderu ponieważ podane dane dostępowe są nieprawidłowe!&lt;br/&gt;Wróć i sprawdź podane dane dostępowe.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Tworzenie folderu zdalnego nie powiodło się. Prawdopodobnie dostarczone poświadczenia są błędne.&lt;/font&gt;&lt;br/&gt;Wróć i sprawdź poświadczenia.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>Tworzenie folderu zdalnego %1 nie powiodło się z powodu błędu &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>Połączenie synchronizacji z %1 do katalogu zdalnego %2 zostało utworzone.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Udane połączenie z %1!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>Połączenie z %1 nie może być nawiązane. Sprawdź ponownie.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Zmiana nazwy folderu nie powiodła się</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>Nie można usunąć i zarchiwizować folderu ponieważ znajdujący się w nim plik lub folder jest otwarty przez inny program. Proszę zamknąć folder lub plik albo kliknąć ponów lub anuluj setup.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Utworzenie lokalnego folderu synchronizowanego %1 zakończone pomyślnie!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2070,14 +2245,31 @@ Niezalecane jest jego użycie.</translation>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>%1 Kreator połączeń</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Pomiń konfigurację folderów</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation>Włączyć funkcje eksperymentalne?</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation>Włączenie trybu eksperymentalnego</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2101,7 +2293,7 @@ Niezalecane jest jego użycie.</translation>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation type="unfinished"/>
</message>
@@ -2109,7 +2301,7 @@ Niezalecane jest jego użycie.</translation>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>Błąd podczas zapisu metadanych do bazy</translation>
</message>
@@ -2117,47 +2309,47 @@ Niezalecane jest jego użycie.</translation>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>Nie można pobrać pliku %1 ze względu na konflikt nazwy pliku lokalnego!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>Wolne miejsce na dysku jest mniejsze niż %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>Plik został usunięty z serwera</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>Ten plik nie mógł być całkowicie pobrany.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation>Pobrany plik jest pusty pomimo tego, że według zapowiedzi serwera powinien mieć %1.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>Błąd podczas zapisu metadanych do bazy</translation>
</message>
@@ -2165,12 +2357,12 @@ Niezalecane jest jego użycie.</translation>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation type="unfinished"/>
</message>
@@ -2178,22 +2370,22 @@ Niezalecane jest jego użycie.</translation>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>nie można skasować pliku %1, błąd: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>Uwaga, możliwa niezgodność związana z wielością liter w %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>nie można utworzyć folderu %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>Błąd podczas zapisu metadanych do bazy</translation>
</message>
@@ -2201,17 +2393,17 @@ Niezalecane jest jego użycie.</translation>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>Błąd usuwania &apos;%1&apos;: %2; </translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>Nie można usunąć folderu &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>Nie można usunąć %1 z powodu kolizji z lokalną nazwą pliku</translation>
</message>
@@ -2219,13 +2411,13 @@ Niezalecane jest jego użycie.</translation>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>Plik %1 nie może być nazwany %2 z powodu kolizji z lokalną nazwą pliku</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>Błąd podczas zapisu metadanych do bazy</translation>
</message>
@@ -2233,12 +2425,7 @@ Niezalecane jest jego użycie.</translation>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>Plik został usunięty z zasobu z prawem tylko do odczytu. Został przywrócony.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation type="unfinished"/>
</message>
@@ -2246,12 +2433,12 @@ Niezalecane jest jego użycie.</translation>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>Błąd podczas zapisu metadanych do bazy</translation>
</message>
@@ -2259,28 +2446,13 @@ Niezalecane jest jego użycie.</translation>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Folder ten nie może być zmieniony. Został zmieniony z powrotem do pierwotnej nazwy.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Nie wolno zmieniać nazwy tego folderu. Proszę zmień nazwę z powrotem na Shared.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>Plik był edytowany lokalnie ale jest częścią udziału z prawem tylko do odczytu. Przywrócono oryginalny plik</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>Błąd podczas zapisu metadanych do bazy</translation>
</message>
@@ -2288,33 +2460,33 @@ Niezalecane jest jego użycie.</translation>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Usunięto plik</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>Lokalny plik uległ zmianie w trakcie synchronizacji. Zostanie wznowiony.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>Lokalny plik zmienił się podczas synchronizacji.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>Błąd podczas zapisu metadanych do bazy</translation>
</message>
@@ -2322,27 +2494,27 @@ Niezalecane jest jego użycie.</translation>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>Pliki lokalny został usunięty podczas synchronizacji.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>Lokalny plik zmienił się podczas synchronizacji.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation type="unfinished"/>
</message>
@@ -2350,27 +2522,22 @@ Niezalecane jest jego użycie.</translation>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>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</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>Pliki lokalny został usunięty podczas synchronizacji.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>Lokalny plik zmienił się podczas synchronizacji.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation type="unfinished"/>
</message>
@@ -2388,42 +2555,47 @@ Niezalecane jest jego użycie.</translation>
<translation>Etykieta</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Otwórz w przeglądarce</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Czas</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Plik</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Folder</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Akcja</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Rozmiar</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>Lokalny protokół synchronizacji</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Kopiuj</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Kopiuj listę aktywności do schowka.</translation>
</message>
@@ -2464,7 +2636,7 @@ Niezalecane jest jego użycie.</translation>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Wybierz co synchronizować</translation>
</message>
@@ -2472,33 +2644,33 @@ Niezalecane jest jego użycie.</translation>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Wczytuję ...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation>Odznacz foldery zdalne, których nie chcesz synchronizować.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Nazwa</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Rozmiar</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>Na serwerze nie ma w tej chwili żadnych podkatalogów.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation>Wystąpił błąd podczas wczytywania listy podfolderów</translation>
</message>
@@ -2519,22 +2691,22 @@ Niezalecane jest jego użycie.</translation>
<translation>Ustawienia</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Aktywność</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Ogólne</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Sieć</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Konto</translation>
</message>
@@ -2542,28 +2714,28 @@ Niezalecane jest jego użycie.</translation>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Aktywność</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Ogólne</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Sieć</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Konto</translation>
</message>
@@ -2578,7 +2750,7 @@ Niezalecane jest jego użycie.</translation>
<message>
<location filename="../src/gui/sharedialog.ui" line="28"/>
<source>share label</source>
- <translation type="unfinished"/>
+ <translation>etykieta udostępniania</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="14"/>
@@ -2591,42 +2763,42 @@ Niezalecane jest jego użycie.</translation>
<translation>Ścieżka ownCloud:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>%1 udostępnione</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Folder: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>Serwer nie zezwala na współdzielenie</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
- <translation type="unfinished"/>
+ <translation>Plik nie może być udostępniony, ponieważ został udostępniony bez uprawnień.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>Użytkownicy i grupy</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>Linki publiczne</translation>
</message>
@@ -2639,7 +2811,17 @@ Niezalecane jest jego użycie.</translation>
<translation>Udostępnij NewDocument.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation>Tylko wysyłanie (upuszczanie pliku)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>Etykieta</translation>
</message>
@@ -2651,7 +2833,7 @@ Niezalecane jest jego użycie.</translation>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="35"/>
<source>Enter a name to create a new public link...</source>
- <translation type="unfinished"/>
+ <translation>Wprowadź nazwę dla tworzonego nowego linku publicznego...</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="42"/>
@@ -2669,19 +2851,24 @@ Niezalecane jest jego użycie.</translation>
<translation>Ustaw hasło</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
- <translation type="unfinished"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
+ <translation>Odbiorcy mogą otwierać lub pobierać zawartość.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation>Pobierz / Podgląd</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>Pokaż kolejno listę plików</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation>Pobieranie / Podgląd / Wysyłanie</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Pozwól na edycję</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation>Odbiorcy mogą otwierać, pobierać, zmieniać, kasować i wysyłać zawartość.</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2689,95 +2876,95 @@ Niezalecane jest jego użycie.</translation>
<translation>Każdy posiadający link ma dostęp do pliku/katalogu.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Zabezpieczone hasłem</translation>
+ <translation>Z&amp;abezpieczenie hasłem</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
- <translation type="unfinished"/>
+ <translation>Plik nie może być udostępniony, ponieważ został udostępniony bez uprawnień.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
- <translation type="unfinished"/>
+ <translation>Link udostępniania został wyłączony</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
- <translation type="unfinished"/>
+ <translation>Utwórz publiczny link do udostępnienia</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Usuń</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
- <translation type="unfinished"/>
+ <translation>Otwórz link w przeglądarce</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
- <translation type="unfinished"/>
+ <translation>Skopuj link to schowka</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
- <translation type="unfinished"/>
+ <translation>Skopiuj link do schowa (pobieranie bezpośrednie)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Wyślij link mailem</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
- <translation type="unfinished"/>
+ <translation>Wyślij link e-mailem (pobieranie bezpośrednie)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation>Udostępniłem Tobie %1</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
- <translation type="unfinished"/>
+ <translation>Potwierdź usunięcie linku do udostępniania</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;p&gt;Czy na pewno chcesz usunąć publiczny link do udostępnienia &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Uwaga: Tej operacji nie można cofnąć.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Anuluj</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
- <translation type="unfinished"/>
+ <translation>Link publiczny</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
- <translation type="unfinished"/>
+ <translation>Usuń link udostępniania</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
- <translation type="unfinished"/>
+ <translation>Publiczne udostępni&amp;anie wymaga hasła</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Proszę podać hasło</translation>
</message>
@@ -2797,37 +2984,37 @@ Niezalecane jest jego użycie.</translation>
<message>
<location filename="../src/gui/shareusergroupwidget.ui" line="108"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;You can direct people to this shared file or folder &lt;a href=&quot;private link menu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;by giving them a private link&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Możesz skierować innych do tego udostępnionego pliku lub folderu &lt;a href=&quot;private link menu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;dając im link prywatny&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
- <translation type="unfinished"/>
+ <translation>Ten element nie jest udostępniony żadnemu użytkownikowi ani grupie.</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
- <translation type="unfinished"/>
+ <translation>Otwórz link w przeglądarce</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
- <translation type="unfinished"/>
+ <translation>Skopuj link to schowka</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Wyślij link mailem</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>Brak wyników dla &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
- <translation type="unfinished"/>
+ <translation>Udostępniam Tobie</translation>
</message>
</context>
<context>
@@ -2838,37 +3025,38 @@ Niezalecane jest jego użycie.</translation>
<translation>Formularz</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>Etykieta</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>może edytować</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>może współdzielić</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>utwórz</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>zmiany</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>usuń</translation>
</message>
@@ -2912,143 +3100,176 @@ Niezalecane jest jego użycie.</translation>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>Współdzielone z %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
- <source>I shared something with you</source>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
+ <source>I shared something with you</source>
+ <translation>Udostępniam Tobie</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
- <translation type="unfinished"/>
+ <translation>Udostępnij...</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
- <translation type="unfinished"/>
+ <translation>Kopiuj link prywatny do schowka</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
+ <translation>Wyślij link prywatny przez e-mail</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation>Kopiuj link publiczny do schowka</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Otwórz w przeglądarce</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Szczegóły certyfikatu&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Nazwa (CN):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>Alternatywna nazwa tematu:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Organizacja (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Jednostka organizacyjna (OU):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Województwo </translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>Kraj:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Numer seryjny:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Wystawca&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Emitent:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Data wydania:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Wygasa:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Odciski palców&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;Uwaga:&lt;/b&gt; Ten certyfikat został ręcznie zaakceptowany&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (własnoręcznie podpisany)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>o połączenie jest szyfrowane przy użyciu %1 bit %2.
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Informacje Certyfikatu:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>To połączenie NIE jest bezpieczne, ponieważ jest nieszyfrowane.
@@ -3075,7 +3296,7 @@ Niezalecane jest jego użycie.</translation>
<message>
<location filename="../src/gui/sslerrordialog.cpp" line="132"/>
<source>Cannot connect securely to &lt;i&gt;%1&lt;/i&gt;:</source>
- <translation type="unfinished"/>
+ <translation>Brak możliwości bezpiecznego połączenia z &lt;i&gt;%1&lt;/i&gt;:</translation>
</message>
<message>
<location filename="../src/gui/sslerrordialog.cpp" line="166"/>
@@ -3136,305 +3357,270 @@ Niezalecane jest jego użycie.</translation>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Sukces.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>CSync nie udało się wczytać pliku dziennika. Plik dziennika jest uszkodzony.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;Wtyczka %1 do csync nie może być załadowana.&lt;br/&gt;Sprawdź poprawność instalacji!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>Krytyczny błąd parametru CSync.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>Aktualizacja procesu przetwarzania CSync nie powiodła się.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>Scalenie w procesie przetwarzania CSync nie powiodło się.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync nie mógł się uwierzytelnić przez proxy.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSync nie mógł odnaleźć serwera proxy.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync nie mógł uwierzytelnić się na serwerze %1.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync nie mógł połączyć się z siecią.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>Upłynął limit czasu połączenia.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>Wystąpił błąd transmisji HTTP.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation>Chwilowy brak dostępu do serwera, z którego montowany jest folder.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>Wystąpił błąd podczas otwierania katalogu</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>Błąd podczas odczytu katalogu.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>Plik / katalog zostanie zignorowany, ponieważ jest ukryty.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
- <translation type="unfinished"/>
+ <translation>Hierarchia katalogów jest zbyt głęboka</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
- <translation type="unfinished"/>
+ <translation>Konflikt: Pobrano wersję z serwera, lokalna kopia została zapisana z nową nazwą pliku i nie została wysłana na serwer.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
- <translation type="unfinished"/>
+ <translation>Tylko %1 są dostępne, potrzebujesz przynajmniej %2 aby rozpocząć</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation>Niedozwolone, ponieważ nie masz uprawnień do dodawania katalogu nadrzędnego</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation>Niedozwolone, ponieważ nie masz uprawnień do dodawania plików w tym katalogu</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: Brak dostępnego miejsca na serwerze %1.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>Nieokreślony błąd CSync.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Anulowane przez użytkownika</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
- <translation type="unfinished"/>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation>Dostęp zabroniony.</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
+ <translation>Plik lub katalog nie został znaleziony:</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation>Brak dostępnego miejsca na serwerze %1.</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>Usługa jest czasowo niedostępna</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>Dostęp zabroniony</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>Wystąpił błąd wewnętrzny %1</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>Linki symboliczne nie są wspierane przy synchronizacji. </translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>Plik jest na liście plików ignorowanych.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation>Nazwy plików zawierające znaki &apos;%1&apos; nie są wspierane </translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation>Nazwa pliku jest zarezerwowana dla plików systemowych</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation>Nazwa pliku zawiera spacje</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>Nazwa pliku zbyt długa</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
- <translation type="unfinished"/>
+ <translation>Nierozwiązany konfilkt.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>Błąd statystyk.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
+ <translation>Nieprawidłowe znaki, zmień nazwę &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation>Nie można odczytać czarnej listy z lokalnej bazy danych</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation>Nie można czytać z dziennika synchronizacji.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>Nie można otworzyć dziennika synchronizacji</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>Nazwa pliku zawiera co najmniej jeden nieprawidłowy znak</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation>Niedozwolone, ponieważ nie masz uprawnień do dodawania podkatalogów w tym katalogu</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>Wgrywanie niedozwolone, ponieważ plik jest tylko do odczytu na serwerze, przywracanie</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>Brak uprawnień by usunąć, przywracanie</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>Lokalne pliki i udostępniane foldery zostały usunięte.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>Przenoszenie niedozwolone, obiekt przywrócony</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>Przenoszenie niedozwolone, ponieważ %1 jest tylko do odczytu</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>docelowy</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>źródło</translation>
</message>
@@ -3458,17 +3644,17 @@ Niezalecane jest jego użycie.</translation>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Wersja %1. Aby uzyskać więcej informacji prosimy odwiedzić &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -3499,81 +3685,81 @@ Niezalecane jest jego użycie.</translation>
<translation>Proszę się zalogować</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Folder %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Nie skonfigurowano żadnych folderów synchronizacji.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Otwórz w przeglądarce</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Zaloguj...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Wyloguj</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Ostatnie zmiany</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Sprawdzanie zmian na &apos;%1&apos;</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Zarządzane foldery:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Otwórz katalog &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Otwórz %1 w przeglądarce</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Nieznany status</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Ustawienia...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Szczegóły...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Pomoc</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>Wyjdź %1</translation>
</message>
@@ -3588,11 +3774,6 @@ Niezalecane jest jego użycie.</translation>
<translation>Nie wspierana wersja serwera</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation>Serwer dla konta %1 uruchomiony jest na starej i niewspieranej wersji %2. Używanie klienta z niewspieranym serwerem nie zostało przetestowane i jest potencjalnie niebezpieczne. Kontynuujesz na własne ryzyko. </translation>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Rozłączony</translation>
@@ -3600,7 +3781,7 @@ Niezalecane jest jego użycie.</translation>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="240"/>
<source>Disconnected from some accounts</source>
- <translation type="unfinished"/>
+ <translation>Rozłącz od wybranych kont</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="251"/>
@@ -3624,116 +3805,129 @@ Niezalecane jest jego użycie.</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
- <translation type="unfinished"/>
+ <translation>Synchronizacja wstrzymana</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation>Nierozwiązane konfilkty</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
- <translation type="unfinished"/>
+ <translation>Błąd podczas synchronizacji</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
- <translation type="unfinished"/>
+ <translation>Nie ustawiono katalogów do synchronizacji</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation>Wznów wszystkie katalogi</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>Wstrzymaj wszystkie katalogi</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>Wznów wszystkie synchronizacje</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>Wznów synchronizację</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>Wstrzymaj wszystkie synchronizacje</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>Wstrzymaj synchronizację</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Wyloguj się się ze wszystkich kont</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Zaloguj się do wszystkich kont</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>Nowe konto...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>O %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Brak ostatnich synchronizacji</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation>Sprawdzanie zmian w lokalizacji zdalnej &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation>Sprawdzanie zmian w lokalizacji lokalnej &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Synchronizacja %1 z %2 (%3 pozostało)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation>Synchronizowanie %1 of %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Synchronizuję %1 (%2 pozostało)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>Synchronizowanie %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Aktualne</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation type="unfinished"/>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3745,9 +3939,9 @@ Niezalecane jest jego użycie.</translation>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>Etykieta</translation>
</message>
@@ -3783,11 +3977,22 @@ Niezalecane jest jego użycie.</translation>
<translation>Pytaj o potwierdzenie przed synchronizacją napędów zewnętrznych</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Wybierz co synchronizować</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>&amp;Lokalny folder</translation>
@@ -3804,11 +4009,16 @@ Niezalecane jest jego użycie.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>S&amp;ynchronizuj wszystko z serwera</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Status wiadomości</translation>
</message>
@@ -3845,8 +4055,8 @@ Niezalecane jest jego użycie.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
- <translation>Podczas połączenia wystąpił problem. Proszę spróbować ponownie. </translation>
+ <source>An error occurred while connecting. Please try again.</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="56"/>
@@ -4026,7 +4236,7 @@ Kliknij</translation>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -4124,52 +4334,52 @@ Kliknij</translation>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Stan niezdefiniowany</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Trwa oczekiwanie na uruchomienie synchronizacji</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>Synchronizacja uruchomiona</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Udana synchronizacja</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Synchronizacja ukończona, niektóre pliki zostały zignorowane.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Błąd synchronizacji</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Błąd ustawień</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Przygotowuję do synchronizacji</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Anuluję...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>Synchronizacja wstrzymana</translation>
</message>
@@ -4177,22 +4387,22 @@ Kliknij</translation>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation>Nie można otworzyć przeglądarki</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation>Podczas uruchamiania przeglądarki aby przejść do adresu URL %1 wystąpił problem. Czy skonfigurowano domyślną przeglądarkę?</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation>Nie można uruchomić klienta email</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation>Podczas uruchamiania klienta poczty wystąpił problem. Czy skonfigurowano domyślnego klienta pocztowego?</translation>
</message>
diff --git a/translations/client_pt.ts b/translations/client_pt.ts
index 9bceb1e06..beed9e5dd 100644
--- a/translations/client_pt.ts
+++ b/translations/client_pt.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="pt_PT" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation>Não foi possível mover &apos;%1&apos; para &apos;%2&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,17 +95,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>A ligação expirou</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation>O Servidor respondeu &quot;%1 %2&quot; até &quot;%3 %4&quot;</translation>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Cancelar</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Conta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Escolher o que sincronizar</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Forçar a sincronização</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>Retomar sincronização</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>Remover ligação de sincronização de pasta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Não foi possível criar a pasta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;Não foi possível criar a pasta local&lt;i&gt;%1&lt;/i&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>Confirmar Remoção da Ligação de Sincronização de Pasta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>Remover Ligação da Sincronização de Pasta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Sincronização em Execução</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>A operação de sincronização está em execução.&lt;br/&gt;Deseja terminá-la?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 em utilização</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 como &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>A versão %1 do servidor é antiga e não é suportada! Prossiga por sua conta e risco.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Ligado a %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>O servidor %1 está temporariamente indisponível.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation>O Servidor %1 encontra-se em manutenção</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>Terminou a sessão de %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation>A Conectar a %1...</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>Sem ligação para %1 em %2.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Iniciar Sessão</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>Existem pastas que não foram sincronizadas por serem demasiado grandes:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>Existem pastas que não foram sincronizadas por serem armazenamento externo:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation>Existem pastas que não foram sincronizadas por serem demasiado grandes ou armazenamento externo:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Confirmar Remoção da Conta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Deseja mesmo remover a ligação da conta &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Nota:&lt;/b&gt; isto &lt;b&gt;não&lt;/b&gt; irá eliminar quaisquer ficheiros.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Remover ligação</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Abrir pasta</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Terminar sessão</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Retomar sincronização</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Pausar sincronização</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Deseja mesmo parar a sincronização da pasta &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Nota:&lt;/b&gt; isto &lt;b&gt;não&lt;/b&gt; irá eliminar qualquer ficheiro.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1 (%3%) de %2 em utilização. Algumas pastas, incluindo a rede montada ou as pastas partilhadas, podem ter limites diferentes.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%1 de %2 em utilização</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Atualmente não está disponível nenhuma informação da utilização do armazenamento.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>%1 sem ligação configurada.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Sessão terminada</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Desligado</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Ligado</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Serviço indisponível</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation>Modo de Manutenção</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Erro de rede</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Erro de configuração</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Estado de conta desconhecido</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Atividade do Servidor</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Protocolo de Sincronização</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>Não Sincronizado</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>Não Sincronizado (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>A lista de atividades do servidor foi copiada para a área de transferência.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>A lista de atividades de sincronização foi copiada para a área de transferência.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>A lista de itens não sincronizados foi copiada para a área de transferência.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Copiado para a área de transferência</translation>
</message>
@@ -469,47 +488,47 @@
<translation>EtiquetaTexto</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Atividades do Servidor</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Copiar</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Copiar a lista de actividades para a área de transferência.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Ação necessária: Notificações</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;A conta %1 não tem atividades ativadas.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation><numerusform>Recebeu %n nova notificação de %2.</numerusform><numerusform>Recebeu %n novas notificações de %2.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation><numerusform>Recebeu %n nova notificação de %1 e %2.</numerusform><numerusform>Recebeu %n novas notificações de %1 e %2.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>Recebeu novas notificações de %1, %2 e outras contas.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>%1 Notificações - Ação Necessária</translation>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Sair</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Continuar</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation>Erro a aceder ao ficheiro de configuração</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation>Ocorreu um erro enquanto se acedia ao ficheiro de configuração em %1.</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>Sair do ownCloud</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>Erro ao gravar os metadados para a base de dados</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>Não foi configurada nenhuma conta ownCloud</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>O servidor configurado para este cliente é muito antigo</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Por favor, atualize para a ultima versão do servidor e reinicie o cliente.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Erro de autenticação: o nome de utilizador ou a palavra-passe estão errados.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>tempo expirado</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>As credenciais fornecidas não estão corretas</translation>
</message>
@@ -637,133 +681,160 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Abortado pelo utilizador</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>A pasta local %1 não existe.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 deveria ser uma pasta, mas não é.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 não é legível.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 foi removido.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 foi transferido.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 foi atualizado.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 foi renomeado para %2</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 foi movido para %2</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation><numerusform>&apos;%1&apos; e %n outro(s) ficheiro(s) foram removidos</numerusform><numerusform>&apos;%1&apos; e %n outros ficheiros foram removidos.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation><numerusform>%1 e %n outro ficheiro foram transferidos.</numerusform><numerusform>%1 e %n outros ficheiros foram transferidos.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation><numerusform>%1 e %n outro ficheiro foram actualizados.</numerusform><numerusform>%1 e %n outros ficheiros foram actualizados.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation><numerusform>%1 foi renomeado para %2 e %n outro ficheiro foi renomeado.</numerusform><numerusform>%1 foi renomeado para %2 e %n outros ficheiros foram renomeados.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation><numerusform>%1 foi movido para %2 e %n outro ficheiro foi movido.</numerusform><numerusform>%1 foi movido para %2 e %n outros ficheiros foram movidos.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation><numerusform>%1 tem e %n outro ficheiro têm problemas de sincronização.</numerusform><numerusform>%1 tem e %n outros ficheiros têm problemas de sincronização.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation>%1 tem um problema de sincronização. Por favor, verifique o ficheiro com conflito!</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation><numerusform>%1 e %n outro ficheiro não podem ser sincronizados devido a erros. Consulte o registo de eventos para mais detalhes.</numerusform><numerusform>%1 e %n outros ficheiros não podem ser sincronizados devido a erros. Consulte o registo de eventos para mais detalhes.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>Não foi possível sincronizar %1 devido a um erro. Consulte o registo para detalhes.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Atividade de Sincronização</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>Não foi possível ler o ficheiro excluir do sistema</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation>Foi adicionada uma nova pasta maior que %1 MB: %2.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation>Foi adicionada uma pasta vinda de armazenamento externo.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation>Por favor, vá às configurações para a selecionar se a desejar transferir.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -774,7 +845,7 @@ Se decidir manter os ficheiros, eles serão sincronizados novamento para o servi
Se decidir apagar os ficheiros, eles ficaram indisponíveis para si, a não ser que seja o seu proprietário.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
@@ -783,22 +854,22 @@ Tem a certeza que deseja sincronizar essas ações com o servidor?
Se foi acidental e decidir manter os seus ficheiros, eles serão sincronizados novamente apartir do servidor.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Remover todos os ficheiros?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Remover todos os ficheiros</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Manter ficheiros</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
@@ -807,17 +878,17 @@ Isto pode ser porque um backup foi restaurado no servidor.
Continuando a sincronização fará com que todos os seus ficheiros sejam substituídos por um ficheiro mais velho num estado anterior. Deseja manter os seus ficheiros locais mais recentes como ficheiros de conflito?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>Detetada cópia de segurança</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>Sincronização Normal</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>Manter Ficheiros Locais como Conflito</translation>
</message>
@@ -825,115 +896,105 @@ Continuando a sincronização fará com que todos os seus ficheiros sejam substi
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>Não foi possível reiniciar o estado da pasta</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>Foi encontrado um &apos;journal&apos; de sincronização, mas não foi possível removê-lo. Por favor, certifique-se que nenhuma aplicação o está a utilizar.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation>(cópia de segurança)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation>(cópia de segurança %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Estado indefinido.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>A aguardar para iniciar a sincronização.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>A preparar para sincronizar.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>A sincronização está em execução.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>A última sincronização foi bem sucedida.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>A última sincronização foi bem sucedida, mas com avisos nos ficheiros individuais.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>A última sincronização foi bem sucedida.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Erro de instalação.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Abortado pelo utilizador.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>A sincronização está pausada.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (A sincronização está pausada)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>Não foi selecionada nenhuma pasta válida!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>O caminho selecionado não é uma pasta!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Não tem permissão para gravar para a pasta selecionada!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation>A pasta local %1 contém hiperligação simbólica. O destino da hiperligação já contém uma pasta sincronizada. Por favor, escolha outra!</translation>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation>Já existe uma sincronização do servidor para esta pasta local. Por favor escolha outra pasta local!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>A pasta local %1 já contém uma pasta utilizada numa ligação de sincronização de pasta. Por favor, escolha outra!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>A pasta local %1 já contém uma pasta usada numa ligação de sincronização de pasta. Por favor, escolha outra!</translation>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation>A pasta local %1 é uma hiperligação simbólica. A hiperligação de destino já contém uma pasta usada numa ligação de sincronização de pasta. Por favor, escolha outra!</translation>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -943,7 +1004,7 @@ Continuando a sincronização fará com que todos os seus ficheiros sejam substi
<translation>Adicionar Ligação de Sincronização de Pasta</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>A sincronizar com a pasta local</translation>
</message>
@@ -978,7 +1039,7 @@ Continuando a sincronização fará com que todos os seus ficheiros sejam substi
<translation>Erro durante o carregamento da lista de pastas a partir do servidor.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Sessão terminada</translation>
</message>
@@ -993,115 +1054,133 @@ Continuando a sincronização fará com que todos os seus ficheiros sejam substi
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>A procurar por alterações em &apos;%1&apos;</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>A sincronizar %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>transferir %s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>enviar %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 de %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%5 restante, %1 de %2, ficheiro %3 de %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 de %2, ficheiro %3 de %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>ficheiro %1 de %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>A aguardar...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>A aguardar por %n outra pasta...</numerusform><numerusform>A aguardar por %n outra(s) pasta(s)...</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>A preparar para sincronizar...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>Adicionar Ligação de Sincronização de Pasta</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>Adicionar Ligação de Sincronização</translation>
</message>
@@ -1109,17 +1188,17 @@ Continuando a sincronização fará com que todos os seus ficheiros sejam substi
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Clique para selecionar a pasta local para sincronizar.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Insira o caminho para a pasta local.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Selecione a pasta de origem</translation>
</message>
@@ -1127,60 +1206,68 @@ Continuando a sincronização fará com que todos os seus ficheiros sejam substi
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Criar Pasta Remota</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>Insira o nome da nova pasta para ser criada em baixo &apos;%1&apos;:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>A pasta foi criada com sucesso em %1.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>A autenticação falhou ao aceder %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>Não foi possível criar a pasta em %1. Por favor, verifique manualmente.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>Não foi possível listar uma pasta. Erro: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Escolha isto para sincronizar a conta completa</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Esta pasta já foi sincronizada.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Já está a sincronizar &lt;i&gt;%1&lt;/i&gt;, que é uma pasta de origem de &lt;i&gt;%2&lt;/i&gt;.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Aviso:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Aviso:&lt;/b&gt;</translation>
</message>
@@ -1188,22 +1275,22 @@ Continuando a sincronização fará com que todos os seus ficheiros sejam substi
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>Nenhum E-Tag recebida do servidor, verifique Proxy / Acesso</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>Nós recebemos uma E-Tag diferente para retomar. Tentar da próxima vez.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>O servidor devolveu o alcance-conteúdo errado</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>O tempo de ligação expirou</translation>
</message>
@@ -1226,23 +1313,38 @@ Continuando a sincronização fará com que todos os seus ficheiros sejam substi
<translation>Para a Bandeja do Sistema</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Avançada</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation>Pedir confirmação antes de sincronizar pastas maiores que</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation>Pedir confirmação antes de sincronizar armazenamentos externos</translation>
</message>
@@ -1262,31 +1364,67 @@ Continuando a sincronização fará com que todos os seus ficheiros sejam substi
<translation>Utilizar Ícones &amp;Monocromáticos</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>Editar Ficheiros &amp;Ignorados</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>M&amp;ostrar relatório de crache</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>Sobre</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>Atualizações</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>&amp;Reiniciar e Atualizar</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1354,7 +1492,7 @@ Continuando a sincronização fará com que todos os seus ficheiros sejam substi
<translation>Remover</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1363,27 +1501,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
Os itens onde é permitido a eliminação serão eliminados se estes impedirem a remoção de uma diretoria. Isto é útil para os metadados.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Não foi possível abrir o ficheiro</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>Não foi possível gravar as alterações para &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Adicione Padrão de ignorar</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Adicione um novo padrão de ignorar:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Esta entrada é fornecida pelo sistema em &apos;%1&apos; e não pode ser modificada nesta visualização.</translation>
</message>
@@ -1413,7 +1551,7 @@ Os itens onde é permitido a eliminação serão eliminados se estes impedirem a
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Pasta</translation>
</message>
@@ -1428,35 +1566,45 @@ Os itens onde é permitido a eliminação serão eliminados se estes impedirem a
<translation>Mostrar ficheiros ignorados</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation>Copiar a lista de situações para a área de transferência</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Copiar</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Tempo</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Ficheiro</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation>Situação</translation>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1482,36 +1630,48 @@ Os itens onde é permitido a eliminação serão eliminados se estes impedirem a
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Limpar</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Limpar a exibição de registo.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>&amp;Guardar</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Guarde o ficheiro de registo no disco para depuração.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Guardar ficheiro de registo</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Erro</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>Não foi possível gravar no ficheiro de registo %1</translation>
</message>
@@ -1519,12 +1679,12 @@ Os itens onde é permitido a eliminação serão eliminados se estes impedirem a
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Erro</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;O ficheiro &apos;%1&apos;&lt;br/&gt;não pode ser aberto para gravação.&lt;br/&gt;&lt;br/&gt;O ficheiro de registo de saída &lt;b&gt;não&lt;/b&gt; pode ser guardado!&lt;/nobr&gt;</translation>
</message>
@@ -1532,27 +1692,27 @@ Os itens onde é permitido a eliminação serão eliminados se estes impedirem a
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Disponível Nova Versão</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;Está disponível uma nova versão do Cliente %1.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; está disponível para transferência. A versão instalada é a %3.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Ignorar esta versão</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Ignorar desta vez</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Obter atualização</translation>
</message>
@@ -1640,27 +1800,27 @@ Os itens onde é permitido a eliminação serão eliminados se estes impedirem a
<translation>Limitar automaticamente</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Nome de anfitrião do servidor proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Nome de utilizador para o servidor proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Palavra-passe para o servidor proxy.</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>Proxy de HTTP(S)</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>Proxy de SOCKS5</translation>
</message>
@@ -1668,23 +1828,23 @@ Os itens onde é permitido a eliminação serão eliminados se estes impedirem a
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>Criado às %1</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>A fechar dentro de alguns segundos...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation>%1 pedido falhou a %2</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation>&apos;%1&apos; selecionado a %2</translation>
@@ -1693,32 +1853,32 @@ Os itens onde é permitido a eliminação serão eliminados se estes impedirem a
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation>Não foi possível processar a resposta JSON retornada pelo servidor: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation>&lt;h1&gt;Erro no login&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -1726,59 +1886,59 @@ Os itens onde é permitido a eliminação serão eliminados se estes impedirem a
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Nova Atualização %1 Pronta</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>Está prestes a ser instalada uma nova atualização para %1. O atualizador
poderá pedir por privilégios adicionais durante o processo.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>Por favor, aguarde - a transferir a versão %1...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>Não foi possível transferir a atualização. Por favor, clique &lt;a href=&apos;%1&apos;&gt;aqui&lt;/a&gt; para a transferir manualmente.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Não foi possível procurar por novas atualizações.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>Disponível %1 versão %2. Reinicie a aplicação para iniciar a atualização.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>Disponível nova %1 versão %2. Por favor, utilize a ferramenta de atualização do sistema para a instalar.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>A procurar por atualizações no servidor...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>O estado de atualização é desconhecido: não foi possível procurar por novas atualizações.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>Não estão disponíveis atualizações. A sua instalação já está com a última versão.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Procurar por Atualizações</translation>
</message>
@@ -1786,43 +1946,43 @@ poderá pedir por privilégios adicionais durante o processo.</translation>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Ligar a %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Configurar as opções de pasta local</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Ligar...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1 pasta &apos;%2&apos; é sincronizada para pasta local &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>Sincronizar a pasta &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Aviso:&lt;/strong&gt; a pasta local não está vazia. Escolha uma resolução!&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Pasta de Sincronização Local</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1881,15 +2041,20 @@ poderá pedir por privilégios adicionais durante o processo.</translation>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Ligar a %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation>Faça login através do browser</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1920,153 +2085,163 @@ Não é aconselhada a sua utilização.</translation>
<source>&amp;Next &gt;</source>
<translation>&amp;Seguinte &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>URL inválido</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Ligado com sucesso a %1: %2 - versão: %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Não foi possível ligar a %1 em %2:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>Tempo expirou enquanto tentava ligar a %1 em %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>A tentar ligar a %1 em %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>O pedido de autenticação para o servidor foi redirecionado para &apos;%1&apos;. O URL é mau, o servidor está mal configurado. </translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>Houve uma resposta inválida para o pedido de autenticação webdav</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>Acesso proibido pelo servidor. Para verificar que tem o acesso adequado, &lt;a href=&quot;%1&quot;&gt;clique aqui&lt;/a&gt; para aceder ao serviço com o seu navegador.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>URL inválido</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
- <translation type="unfinished"/>
+ <translation>O servidor retornou o seguinte erro:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>A pasta de sincronização local %1 já existe, a configurar para sincronizar.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>A criar a pasta de sincronização local %1...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>ok</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>Falhou.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>Não foi possível criar a pasta local %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>Não foi indicada a pasta remota!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Erro: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>a criar a pasta na ownCloud: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>Criação da pasta remota %1 com sucesso!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>A pasta remota %1 já existe. Ligue-a para sincronizar.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>A criação da pasta resultou num erro HTTP com o código %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>A criação da pasta remota falhou, provavelmente por ter introduzido as credenciais erradas.&lt;br/&gt;Por favor, verifique as suas credenciais.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;A criação da pasta remota falhou, provavelmente por ter introduzido as credenciais erradas.&lt;/font&gt;&lt;br/&gt;Por favor, verifique as suas credenciais.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>A criação da pasta remota %1 falhou com o erro &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>A sincronização de %1 com a pasta remota %2 foi criada com sucesso.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Conectado com sucesso a %1!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>Não foi possível ligar a %1 . Por Favor verifique novamente.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Erro ao renomear a pasta</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>Não é possível remover e fazer backup à pasta porque a pasta ou um ficheiro nesta está aberto em outro programa. Por favor, feche a pasta ou o ficheiro e clique novamente ou cancele a configuração.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Pasta de sincronização local %1 criada com sucesso!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2074,14 +2249,31 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>Assistente de ligação %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Saltar a configuração das pastas</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2105,7 +2297,7 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>Resposta JSON inválida do URL poll</translation>
</message>
@@ -2113,7 +2305,7 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>Erro ao escrever a meta-informação par a base de dados</translation>
</message>
@@ -2121,47 +2313,47 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>Não foi possível transferir o ficheiro %1 devido a um conflito com o nome de ficheiro local!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>O Espaço livre no disco é inferior a %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>O ficheiro foi eliminado do servidor</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>Não foi possível transferir o ficheiro na totalidade.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation>O ficheiro transferido está vazio, apesar do servidor indicar que este deveria ter %1.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>Ficheiro %1 não pode ser guardado devido à existência de um ficheiro local com o mesmo nome.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>O ficheiro alterou-se desde a sua descoberta</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>Erro ao gravar os metadados para a base de dados</translation>
</message>
@@ -2169,12 +2361,12 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; Restauro Falhou: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation>Um ficheiro ou pasta foi removido de uma partilha só de leitura, mas o restauro falhou: %1</translation>
</message>
@@ -2182,22 +2374,22 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>Não foi possivel eliminar o ficheiro %1, erro: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>Atenção, possível sensibilidade a maiúsculas em conflito com %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>Não foi possivel criar a pasta %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>Erro ao escrever a meta-informação par a base de dados</translation>
</message>
@@ -2205,17 +2397,17 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>Erro ao remover &apos;%1&apos;: %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>Não foi possível remover a pasta &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>Nao foi possivel remover %1 devido a conflito local com nome de ficheiro</translation>
</message>
@@ -2223,13 +2415,13 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>O ficheiro %1 nao pode ser renomeado para %2 devido a conflito com nome de ficheiro local</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>Erro ao escrever a meta-informação par a base de dados</translation>
</message>
@@ -2237,12 +2429,7 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>O ficheiro havia sido removido de uma partilha apenas de leitura. Ficheiro restaurado. </translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>Código HTTP errado devolvido pelo servidor. Esperado 204, mas foi recebido &quot;%1 %2&quot;.</translation>
</message>
@@ -2250,12 +2437,12 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Código HTTP errado devolvido pelo servidor. Esperado 201, mas foi recebido &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>Erro ao escrever a meta-informação par a base de dados</translation>
</message>
@@ -2263,28 +2450,13 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Esta pasta não pode ser renomeada. A alterar para nome original.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Esta pasta não pode ser renomeada. Por favor renomeie para o seu nome original: Shared.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>O ficheiro foi renomeado mas faz parte de uma partilha só de leitura. O ficheiro original foi restaurado.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Código HTTP errado devolvido pelo servidor. Esperado 201, mas foi recebido &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>Erro ao escrever a meta-informação par a base de dados</translation>
</message>
@@ -2292,33 +2464,33 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation>Não foi possível transferir o ficheiro %1 devido a existir um ficheiro com o mesmo nome, diferenciando apenas as maiúsculas ou minúsculas.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Ficheiro Eliminado</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>O ficheiro local foi alterado durante a sincronização. Vai ser finalizado.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>Ficheiro local alterado durante a sincronização.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>Erro ao gravar os metadados para a base de dados</translation>
</message>
@@ -2326,27 +2498,27 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>O arquivo local foi removido durante a sincronização.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>Ficheiro local alterado durante a sincronização.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation>Código de resposta inesperado do servidor (%1)</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation>ID do ficheiro no servidor em falta</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation>ETag do servidor em falta</translation>
</message>
@@ -2354,27 +2526,22 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>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.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>URL poll em falta</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>O arquivo local foi removido durante a sincronização.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>Ficheiro local alterado durante a sincronização.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation>O servidor não reconheceu a última parte. (Nenhuma e-tag estava presente)</translation>
</message>
@@ -2392,42 +2559,47 @@ Não é aconselhada a sua utilização.</translation>
<translation>TextLabel</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Abrir no navegador</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Tempo</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Ficheiro</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Pasta</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Ação</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Tamanho</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>Protocolo de sincronização local</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Copiar</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Copiar lista de actividades para a área de transferência.</translation>
</message>
@@ -2468,7 +2640,7 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Escolher o Que Sincronizar</translation>
</message>
@@ -2476,33 +2648,33 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>A carregar...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation>Desmarcar pastas remotas que não deseja sincronizar.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Nome</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Tamanho</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>Atualmente não há sub-pastas no servidor.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation>Ocorreu um erro ao carregar a lista das sub pastas.</translation>
</message>
@@ -2523,22 +2695,22 @@ Não é aconselhada a sua utilização.</translation>
<translation>Definições</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Atividade</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Geral</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Rede</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Conta</translation>
</message>
@@ -2546,28 +2718,28 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Atividade</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Geral</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Rede</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Conta</translation>
</message>
@@ -2595,42 +2767,42 @@ Não é aconselhada a sua utilização.</translation>
<translation>Caminho OwnCloud:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>%1 Partilhando</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Pasta: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>O servidor não permite partilhas</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation>A obter do servidor as permissões máximas de partilha...</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>O ficheiro não pode ser partilhado porque foi partilhado sem permissão de partilha.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>Utilizadores e Grupos</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>Ligações públicas</translation>
</message>
@@ -2643,7 +2815,17 @@ Não é aconselhada a sua utilização.</translation>
<translation>Partilhar NovoDocumento.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>TextLabel</translation>
</message>
@@ -2673,19 +2855,24 @@ Não é aconselhada a sua utilização.</translation>
<translation>Defina a senha</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>Mostrar listagem de ficheiros</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Permitir edição</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2693,95 +2880,95 @@ Não é aconselhada a sua utilização.</translation>
<translation>Qualquer pessoa com a hiperligação terá acesso ao ficheiro/pasta</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>Protegida por senha</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Protegido com Senha</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>O ficheiro não pode ser partilhado porque foi partilhado sem permissão de partilha.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Eliminar</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
- <translation type="unfinished"/>
+ <translation>Abrir ligação no navegador</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
- <translation>Enviar hiperligação por e-mail</translation>
+ <translation>Enviar hiperligação por correio eletrónico</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Cancelar</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation>Hiperligação Pública</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>A pa&amp;rtilha pública requer uma palavra-passe:</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Por favor, Definir Senha</translation>
</message>
@@ -2804,32 +2991,32 @@ Não é aconselhada a sua utilização.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
- <translation type="unfinished"/>
+ <translation>Abrir ligação no navegador</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
- <translation>Enviar hiperligação por e-mail</translation>
+ <translation>Enviar hiperligação por correio eletrónico</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>Sem resultados para &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
@@ -2842,37 +3029,38 @@ Não é aconselhada a sua utilização.</translation>
<translation>Formulário</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>EtiquetaTexto</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>pode editar</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>pode partilhar</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>criar</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>alterar</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>eliminar</translation>
</message>
@@ -2916,143 +3104,176 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>Partilhar com %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation>Partilhar...</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
+ <translation>Enviar hiperligação privada por correio eletrónico...</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Abrir no navegador</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Detalhes do Certificado&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Nome Comum (NC):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>Nomes alternativos</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Organização (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Unidade Organizacional (UO):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Estado/Distrito:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>País:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Serial:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Emissor&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Emissor:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Emitido em:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Expira em:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Impressões digitais&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;Nota:&lt;/b&gt; Este certificado foi aprovado manualmente&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (auto-assinado)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>Esta ligação é encriptada a %1 bit %2.
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation>Nenhum suporte para tickets/identificadores de sessão SSL</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Informação do certificado:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>Esta ligação NÃO é segura uma vez que não está encriptada.
@@ -3140,305 +3361,270 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Sucesso</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>CSync falhou a carregar o ficheiro do jornal. O ficheiro do jornal está corrupto.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;O plugin %1 para o CSync não foi carregado.&lt;br/&gt;Por favor verifique a instalação!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>Parametro errado, CSync falhou</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>O passo de processamento do CSyn falhou</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>CSync: Processo de reconciliação falhou.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync: não foi possível autenticar no servidor proxy.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSync: não conseguiu contactar o proxy ou o servidor.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync: Erro a autenticar no servidor %1</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync: Erro na conecção à rede</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>Houve um erro de timeout de rede.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>Ocorreu um erro de transmissão HTTP</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation>O pasta montada está temporariamente indisponível no servidor</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>Ocorreu um erro ao abrir uma pasta</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>Erro ao ler o ficheiro.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>O ficheiro/pasta foi ignorado porque está oculto.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation>Apenas %1 estão disponíveis, é preciso um mínimo de %2 para começar</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation>Não permitido, porque não tem permissão para adicionar a pasta fonte</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation>Não permitido, porque não tem permissão para adicionar os ficheiros nessa pasta</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: Não ha espaço disponível no servidor %1</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>CSync: erro não especificado</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Cancelado pelo utilizador</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>CSync falhou o acesso</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
- <translation>CSync falhou no carregamento ou criação do ficheiro jornal. Certifique-se de que tem permissões de gravação e leitura na pasta de sincronização local.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
- <translation>CSync falhou devido a permissão não tratada negada.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
- <translation>O CSync tentou criar uma pasta que já existe.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>O serviço está temporariamente indisponível</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>O acesso é proibido</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>Ocorreu o erro interno número %1.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>Hiperligações simbólicas não são suportadas em sincronização.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>O ficheiro está na lista de ficheiros a ignorar.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation>Nomes de ficheiros acabados com um ponto final não são suportados neste sistema de ficheiros.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation>Nomes de ficheiros que contêm o caractér &apos;%1&apos; não são suportados neste sistema de ficheiros.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation>O nome de ficheiro é um nome reservado neste sistema de ficheiros.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation>Nome de ficheiro contém espaços em branco seguidos.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>O nome do ficheiro é muito grande</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation>Conflito por resolver.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>Estado falhou.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>Codificação de nome de ficheiro não é válida</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>Carateres inválidos, por favor, renomeie &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation>Não foi possível ler a lista negra a partir da base de dados local</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation>Não foi possível ler a partir do jornal de sincronização.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>Impossível abrir o jornal de sincronismo</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>O nome de ficheiro contém pelo menos um caráter inválido</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>Ignorado devido à blacklist de escolha para sincronização</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation>Não permitido, porque não tem permissão para adicionar as subpastas nessa pasta</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>Não é permitido enviar este ficheiro porque este é só de leitura no servidor, a restaurar</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>Não autorizado para remoção, restaurando</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>Ficheiros locais e pasta partilhada removidos.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>Mover não foi permitido, item restaurado</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>Mover não foi autorizado porque %1 é só de leitura</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>o destino</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>a origem</translation>
</message>
@@ -3462,17 +3648,17 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Versão %1. Para mais informações visite &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation>&lt;p&gt;Todos os direitos reservados ownCloud GmbH&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;Distribuído por %1 e licenciado sob a GNU General Public License (GPL) Versão 2.0.&lt;br/&gt;%2 e o logótipo %2 são marcas registadas da %1 nos Estados Unidos, outros países, ou ambos &lt;/p&gt;</translation>
</message>
@@ -3503,81 +3689,81 @@ Não é aconselhada a sua utilização.</translation>
<translation>Por favor inicie a sessão</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Pasta %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Não há pastas de sincronização configurado.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Abrir no navegador</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Iniciar sessão...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Terminar sessão</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Alterações recentes</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Procurando por alterações em &apos;%1&apos;</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Pastas Geridas:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Abrir pasta &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Abrir %1 no navegador</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Estado desconhecido</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Configurações...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Detalhes...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Ajuda</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>Sair do %1</translation>
</message>
@@ -3592,11 +3778,6 @@ Não é aconselhada a sua utilização.</translation>
<translation>Versão de servidor não suportada</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation>O servidor na conta %1 está a correr uma versão %2 antiga e não suportada. O uso deste cliente com versões de servidor não suportadas não está testado e é potencialmente perigos. Prossiga por sua conta e risco.</translation>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Desligado</translation>
@@ -3628,116 +3809,129 @@ Não é aconselhada a sua utilização.</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation>Erro durante a sincronização</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation>Continuar todas as pastas</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>Pausar todas as pastas</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>Continuar toda a sincronização</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>Continuar sincronização</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>Pausar toda a sincronização</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>Pausar sincronização</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Sair de todas as contas</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Entrar em todas as contas...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>Nova conta...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>Sobre %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>Crash agora</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Sem itens sincronizados recentemente</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Sincronizar %1 de %2 (%3 faltando)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation>A sincronizar %1 de %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>A sincronizar %1 (%2 em falta)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>A sincronizar %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Atualizado</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Versão %2. Para mais informação visite &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Para problemas conhecidos e ajuda, por favor, visite: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;por Por Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, e outros.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Direitos de Autor - ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licenciado sob a Licença Pública Geral GNU (GPL), versão 2.0&lt;br/&gt;ownCloud e o logótipo ownCloud são marcas registadas de ownCloud GmbH nos Estados Unidos, outros países, ou ambos.&lt;/p&gt;</translation>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3749,9 +3943,9 @@ Não é aconselhada a sua utilização.</translation>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>TextLabel</translation>
</message>
@@ -3787,11 +3981,22 @@ Não é aconselhada a sua utilização.</translation>
<translation>Pedir confirmação antes de sincronizar armazenamentos e&amp;xteriores</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Escolher o que sincronizar</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>Pasta Local</translation>
@@ -3808,11 +4013,16 @@ Não é aconselhada a sua utilização.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>Sincronizar tudo do servidor</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Mensagem de estado</translation>
</message>
@@ -3849,7 +4059,7 @@ Não é aconselhada a sua utilização.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
+ <source>An error occurred while connecting. Please try again.</source>
<translation type="unfinished"/>
</message>
<message>
@@ -4029,7 +4239,7 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;Construído a partir da revisão Git &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; em %3, %4 usando Qt %5, %6&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4127,52 +4337,52 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Estado indefinido</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>A aguardar o início da sincronização.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>A sincronização está a decorrer</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>A sincronização foi efectuada com sucesso</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Sincronizado com suceso, alguns ficheiros foram ignorados.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Erro de sincronização</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Erro na configuração</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>A preparar para sincronizar</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>A cancelar...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>Sincronização em pausa</translation>
</message>
@@ -4180,22 +4390,22 @@ Não é aconselhada a sua utilização.</translation>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation>Não foi possível abrir o browser</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation>Não foi possivel abrir o cliente de email</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation>Ocorreu um erro ao lançar o cliente de email para criar uma nova mensagem. Talvez nenhum cliente de email esteja configurado?</translation>
</message>
diff --git a/translations/client_pt_BR.ts b/translations/client_pt_BR.ts
index 886cec6a2..f95e3c7e1 100644
--- a/translations/client_pt_BR.ts
+++ b/translations/client_pt_BR.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="pt_BR" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation>Não foi possível criar diretórios na lixeira</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation>Não foi possível mover &apos;%1&apos; para &apos;%2&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation>Mover para o lixo não está implementado nesta plataforma</translation>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,17 +95,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Conexão expirou</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation>Erro desconhecido: a resposta da rede foi excluída</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation>Resposta do servidor &quot;%1 %2&quot; to &quot;%3 %4&quot;</translation>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Cancelar</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Conta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Escolha o que quer sincronizar</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Forçar sincronização agora</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>Reiniciar a sincronização</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>Remover a conexão de sincronização de pastas</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Falha na criação de pasta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;Não foi possível criar pasta local &lt;i&gt;%1&lt;/i&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>Confirme a Remoção de Sincronização de Pasta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>Remover a Conexão de Sincronização de pasta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Sincronização Acontecendo</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>A operação de sincronização está acontecendo.&lt;br/&gt;Você deseja finaliza-la?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 em uso</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 como &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>A versão do servidor %1 é antiga e não suportada! Prossiga por conta própria.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Conectado a %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>O Servidor %1 está temporariamente indisponível.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation>Servidor %1 está atualmente em modo de manutenção.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>Desconectado de %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation>Obtendo autorização do navegador. &lt;a href=&apos;%1&apos;&gt;Clique aqui&lt;/a&gt; para reabrir o navegador.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation>Conectando a %1...</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>Sem conexão para %1 em %2.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Entrar</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>Existem pastas que não foram sincronizadas porque são muito grandes:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>Existem pastas que não foram sincronizadas porque são armazenamentos externos:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation>Existem pastas que não foram sincronizadas porque são muito grandes ou armazenamentos externos:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Confirmar a Remoção da Conta</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Você realmente deseja remover a conexão desta conta&lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Nota:&lt;/b&gt; Isto &lt;b&gt;não&lt;/b&gt; irá deletar nenhum arquivo.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Remover conexão</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Abrir pasta</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Sair</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Resumir sincronização</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Pausar sincronização</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Você realmente deseja para a sincronização desta pasta &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Nota:&lt;/b&gt; Isto &lt;b&gt;não&lt;/b&gt; vai deletar qualquer arquivo.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1 (%3%) de%2 em uso. Algumas pastas, incluindo montadas na rede ou pastas compartilhadas, podem ter limites diferenes.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%1 de %2 em uso</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Atualmente, não há informações de uso de armazenamento disponível.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation>A versão do servidor %1 não é suportada! Prossiga por sua conta e risco.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>Nenhuma %1 conexão configurada.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Desconectado</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Desconectado</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Conectado</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Serviço indisponível</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation>Modo de manutenção</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Erro de rede</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Erro de configuração</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation>Solicitando Credenciais</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Estado da conta desconhecido</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Atividade do Servidor</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Protocolo de Sincronização</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>Não Sincronizado</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>Não sincronizada (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>A lista de atividades do servidor tem sido copiados para o clipboard.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>A lista de atividades do servidor foi copiada para a área de transferência.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>A lista de itens não sincronizados foi copiada para a área de transferência.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Copiado para área de transferência</translation>
</message>
@@ -469,47 +488,47 @@
<translation>RótuloTexto</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Atividades do Servidor</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Copiar</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Copiar a lista de atividades para a área de transferência.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Ação Requerida: Notificações</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;A conta %1 não tem atividades ativadas.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation><numerusform>Você recebeu %n nova notificação de %2.</numerusform><numerusform>Você recebeu %n notificações de %2.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation><numerusform>Você recebeu %n nova notificação de %1 e %2.</numerusform><numerusform>Você recebeu %n novas notificações de %1 e %2.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>Você recebeu novas notificações de %1, %2 e outras contas.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>%1 Notificações - Ação Requerida</translation>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation>Continuar significa &lt;b&gt;excluir essas configurações&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation>Continuar significa &lt;b&gt;ignorar essas configurações&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation>Algumas configurações foram realizadas em versões mais recentes deste cliente e usam recursos que não estão disponíveis nesta versão.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;O arquivo de configuração atual já foi feito backup em &lt;i&gt;%2&lt;/i&gt;.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Sair</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Continuar</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation>Erro acessando o arquivo de configuração</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation>Ocorreu um erro ao acessar o arquivo de configuração em %1.</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>Sair do ownCloud</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>Ocorreu um erro ao escrever metadados ao banco de dados</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>Nenhuma conta ownCloud configurada</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>O servidor configurado para este cliente é muito antigo</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Por favor, atualize para o último servidor e reinicie o cliente.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Erro de autenticação. Ou nome de usuário ou senha está errada.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>tempo limite</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>As credenciais fornecidas não estão corretas</translation>
</message>
@@ -637,133 +681,164 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Abortado pelo usuário</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation>A resposta do servidor para descoberta do arquivo é que está faltando dados.</translation>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>A pasta local %1 não existe.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 deve ser uma pasta, mas não é.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 não pode ser lido.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 foi removido.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 foi baixado.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 foi atualizado.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 foi renomeado para %2.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 foi movido para %2.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation><numerusform>%1 e %n outro arquivo foi removido.</numerusform><numerusform>%1 e %n outros arquivos foram removidos.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation><numerusform>%1 e %n outro(s) arquivo(s) foi(foram) baixados.</numerusform><numerusform>%1 e %n outro(s) arquivo(s) foi(foram) baixados.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation><numerusform>%1 e %n outro arquivo foi atualizado.</numerusform><numerusform>%1 e %n outros arquivos foram atualizados.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation><numerusform>%1 foi renomeado para %2 e %n outro arquivo foi renomeado.</numerusform><numerusform>%1 foi renomeado para %2 e %n outros arquivos foram renomeados.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation><numerusform>%1 foi movido para %2 e %n outro arquivo foi movido.</numerusform><numerusform>%1 foi movido para %2 e %n outros arquivos foram movidos.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation><numerusform>%1 tem e %n outro arquivo tem conflito na sincronização.</numerusform><numerusform>%1 tem e %n outros arquivos teem conflito na sincronização.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation>%1 tem um conflito na sincronização. Por favor verifique o arquivo de conflito!</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation><numerusform>%1 e %n outro arquivo não pode ser sincronizado devido a erros. Veja o log para detalhes.</numerusform><numerusform>%1 e %n outros arquivo(s) não puderam ser sincronizados devido a erros. Veja o log para detalhes.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 não pode ser sincronizado devido a um erro. Veja o log para obter detalhes.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Atividade de Sincronização</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>Não foi possível ler o sistema de arquivo de exclusão</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation>Uma nova pasta maior que %1 MB foi adicionada: %2
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation>Uma pasta de um armazenamento externo foi adicionada.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation>Por favor, vá nas configurações para selecioná-lo se você deseja baixá-lo.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation>A pasta %1 foi criada, mas foi excluída da sincronização anteriormente. Os dados dentro dela não serão sincronizados.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation>A arquivo %1 foi criado, mas foi excluído da sincronização anteriormente. Ele não será sincronizado.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation>As alterações nas pastas sincronizadas não puderam ser rastreadas de maneira confiável.
+
+Isso significa que o cliente de sincronização pode não fazer envios de alterações locais imediatamente e, em vez disso, só varre as alterações locais e as carrega ocasionalmente (a cada duas horas, por padrão).
+
+%1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -774,29 +849,29 @@ If you decide to delete the files, they will be unavailable to you, unless you a
Se você decidir excluir os arquivos, eles não estarão disponíveis para você, a menos que você seja o proprietário.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
<translation>Todos os arquivos na pasta de sincronização local &apos;%1&apos; foram excluídos. Essas exclusões serão sincronizadas com o servidor, tornando tais arquivos indisponíveis, a menos que restaurados.Tem certeza de que deseja sincronizar essas ações com o servidor?Se isso foi um acidente e você decidir manter seus arquivos, eles serão re-sincronizados a partir do servidor.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Deseja Remover Todos os Arquivos?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Remover todos os arquivos</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Manter arquivos</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
@@ -805,17 +880,17 @@ Isso pode ser porque um backup foi restaurado no servidor.
Continuar a sincronização como normal fará com que todos os seus arquivos sejam substituídos por um arquivo antigo em um estado anterior. Deseja manter seus arquivos mais recentes locais como arquivos de conflito?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>Backup detectado</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>Sincronização Normal</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>Manter Arquivos Locais como Conflito</translation>
</message>
@@ -823,115 +898,105 @@ Continuar a sincronização como normal fará com que todos os seus arquivos sej
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>Não foi possível redefinir o estado da pasta</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>Uma velha revista de sincronização &apos;%1&apos; foi encontrada, mas não pôde ser removida. Por favor, certifique-se de que nenhuma aplicação está a usá-la.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation> (backup)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation> (backup %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Estado indefinido.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>À espera do início da sincronização.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Preparando para sincronização.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>A sincronização está ocorrendo.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>A última sincronização foi feita com sucesso.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation>A sincronização foi bem-sucedida, conflitos não resolvidos.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>A última sincronização foi executada com sucesso, mas com advertências em arquivos individuais.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>A última sincronização foi feita com sucesso.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Erro de Configuração.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Usuário Abortou.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>Sincronização pausada.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Pausa na Sincronização) </translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>Nenhuma pasta válida selecionada!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>O caminho selecionado não é uma pasta!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Voce não tem permissão para escrita na pasta selecionada!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation>A pasta local %1 contém um link simbólico. O destino do link contém uma pasta já sincronizados. Por favor, escolha uma outra!</translation>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation>Já existe uma sincronização do servidor para esta pasta local. Por favor, escolha uma outra pasta local!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>A pasta local %1 já contém uma pasta utilizada numa ligação de sincronização de pasta. Por favor, escolha outra!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>A pasta local %1 já está contida em uma pasta usada em uma conexão de sincronização de pastas. Por favor, escolha outra!</translation>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation>A pasta local %1 é um link simbólico. O destino do link já está contido em uma pasta usada em uma conexão de sincronização de pastas. Por favor, escolha outra!</translation>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -941,7 +1006,7 @@ Continuar a sincronização como normal fará com que todos os seus arquivos sej
<translation>Adicionar Pasta a Sincronizar</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>Sincronizando com a pasta local</translation>
</message>
@@ -976,7 +1041,7 @@ Continuar a sincronização como normal fará com que todos os seus arquivos sej
<translation>Erro enquanto carregava a lista de pastas do servidor.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Desconectado</translation>
</message>
@@ -991,115 +1056,133 @@ Continuar a sincronização como normal fará com que todos os seus arquivos sej
<translation>Existem conflitos não resolvidos. Clique para detalhes.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Verificando alterações em &apos;%1&apos;</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation>Novos arquivos estão sendo criados como arquivos virtuais.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation>Verificando alterações remotamente &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation>Verificação de alterações no local &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation>Reconciliando mudanças</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>Sincronizando %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>,</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>baixar %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>enviar %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 de %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%5 restando, %1 de %2, arquivo %3 de %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 de%2, arquivo %3 de %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>arquivo %1 de %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>Esperando...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>Esperando por %n outra pasta...</numerusform><numerusform>Esperando por %n outras pastas...</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>Preparando para sincronizar...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation>Esse problema geralmente acontece quando o inotify esgotou as notificações. Verifique o FAQ para mais detalhes.</translation>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>Adicionar Conexão de Sincronização de pasta</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>Adicionar Conexão de Sincronização</translation>
</message>
@@ -1107,17 +1190,17 @@ Continuar a sincronização como normal fará com que todos os seus arquivos sej
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Clique para selecionar uma pasta local para sincronização.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Entre com o caminha para a pasta local.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Selecione a pasta de origem</translation>
</message>
@@ -1125,60 +1208,68 @@ Continuar a sincronização como normal fará com que todos os seus arquivos sej
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Criar uma Pasta Remota</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>Entre com o nome da nova pasta a ser criada abaixo &apos;%1&apos;:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>Pasta foi criada com sucesso em %1.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>Falha na autenticação acessando %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>Falha ao criar a pasta em %1. Por favor, verifique manualmente.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>Falha ao listar uma pasta. Erro: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Escolha esta opção para sincronizar a conta inteira</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Esta pasta já está sendo sincronizada.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Você já está sincronizando &lt;i&gt;%1&lt;/i&gt;, que é uma pasta mãe de &lt;i&gt;%2&lt;/i&gt;.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation>Use arquivos virtuais em vez de baixar conteúdo imediatamente (experimental)</translation>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Alerta:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Alerta:&lt;/b&gt;</translation>
</message>
@@ -1186,22 +1277,22 @@ Continuar a sincronização como normal fará com que todos os seus arquivos sej
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>Nenhuma E-Tag recebida do servidor, verifique Proxy / gateway</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>Recebemos um e-Tag diferente para resumir. Tente uma próxima vez.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>O servidor retornou erro numa série-de-conteúdo</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Conexão Finalizada</translation>
</message>
@@ -1224,23 +1315,38 @@ Continuar a sincronização como normal fará com que todos os seus arquivos sej
<translation>Para Bandeja do Sistema</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation>&amp;Canal</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation>estável</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation>beta</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Avançado</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation>Solicite confirmação antes de sincronizar pastas maiores que</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation>Pedir confirmação antes de sincronizar os armazenamentos externos</translation>
</message>
@@ -1260,32 +1366,69 @@ Continuar a sincronização como normal fará com que todos os seus arquivos sej
<translation>Usar Icones &amp;Monocromáticos</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>Editar Arquivos &amp;Ignorados</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation>Mostrar pastas de sincronização no &amp;Painel de navegação do Explorer</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>M&amp;ostrar relatório de acidente</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>Sobre</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>Atualizações</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>&amp;Reiniciar &amp;&amp; Atualização
</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation>Alterar canal de atualização?</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation>O canal de atualização determina quais atualizações de cliente serão oferecidas para instalação. O canal &quot;estável&quot; contém apenas atualizações consideradas confiáveis, enquanto as versões no canal &quot;beta&quot; podem conter recursos e correções de bugs mais recentes, mas ainda não foram totalmente testados.
+Observe que isso seleciona apenas de qual conjunto de atualizações são retiradas e que não há rebaixamentos: Portanto, voltar do canal beta para o canal estável geralmente não pode ser feito imediatamente e significa esperar por uma versão estável que seja mais recente do que a versão beta atualmente instalada.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation>Alterar canal de atualização</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation>Compartilhando erro</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation>Não foi possível recuperar ou criar o linque de compartilhamento publico. Erro: %1</translation>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1353,7 +1496,7 @@ Continuar a sincronização como normal fará com que todos os seus arquivos sej
<translation>Remover</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1362,27 +1505,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
Itens onde a eliminação é permitida serão excluídos se eles evitarem que um diretório seja removido. Isso é útil para metadados.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Não foi possível abrir o arquivo</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>Não é possível gravar as alterações em &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Adicionar Ignorar Padrão</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Adicionar um novo padrão ignorar:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Esta entrada é fornecida pelo sistema em &apos;%1&apos; e não pode ser modificado aqui.</translation>
</message>
@@ -1412,7 +1555,7 @@ Itens onde a eliminação é permitida serão excluídos se eles evitarem que um
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Pasta</translation>
</message>
@@ -1427,35 +1570,45 @@ Itens onde a eliminação é permitida serão excluídos se eles evitarem que um
<translation>Mostrar arquivos ignorados</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation>Havia muitos problemas. Nem todos serão visíveis aqui.</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation>Houve conflitos. Verifique a documentação sobre como resolvê-los.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation>Copie a lista de problemas para a área de transferência.</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Copiar</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Horário</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Arquivo</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation>Problemas</translation>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation>Houve conflitos.&lt;a href=&quot;%1&quot;&gt;Verifique a documentação sobre como resolvê-los.&lt;/a&gt;</translation>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1481,36 +1634,49 @@ Itens onde a eliminação é permitida serão excluídos se eles evitarem que um
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation>Salvar registros permanentemente</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation>Quando essa opção está ativada e nenhum outro log está configurado, os logs serão gravados em uma pasta temporária e expiram após algumas horas. Essa configuração persiste nas reinicializações do cliente.
+Os registros serão gravados em %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Limpar</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Limpar exibição de log.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>&amp;Salvar</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Salvar arquivo de log para um arquivo no disco para depuração.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Salvar arquivo de log</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Erro</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>Não foi possível escrever no arquivo de log %1</translation>
</message>
@@ -1518,12 +1684,12 @@ Itens onde a eliminação é permitida serão excluídos se eles evitarem que um
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Erro</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;Arquivo &apos;%1&apos;&lt;br/&gt;não pode ser aberto para escrita.&lt;br/&gt;&lt;br/&gt;A saída de log &lt;b&gt;não&lt;/b&gt; pode ser salva!&lt;/nobr&gt;</translation>
</message>
@@ -1531,27 +1697,27 @@ Itens onde a eliminação é permitida serão excluídos se eles evitarem que um
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Nova Versão Disponínel</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;Uma nova versão %1 de Ciente está disponível.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; está disponível para baixar. A versão instalada é a %3.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Pule esta versão</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Pular desta vez</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Atualizar</translation>
</message>
@@ -1639,27 +1805,27 @@ Itens onde a eliminação é permitida serão excluídos se eles evitarem que um
<translation>Limite automático</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Hostname do servidor proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Nome de usuário para servidor proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Senha para servidor proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>HTTP(S) proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>SOCKS5 proxy</translation>
</message>
@@ -1667,23 +1833,23 @@ Itens onde a eliminação é permitida serão excluídos se eles evitarem que um
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>Criada em %1</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>Fechando em poucos segundos...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation>requisição %1 falhou em %2</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation>&apos;%1&apos; selecionada em %2</translation>
@@ -1692,32 +1858,32 @@ Itens onde a eliminação é permitida serão excluídos se eles evitarem que um
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation>Erro retornado do servidor: &lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation>Ocorreu um erro ao acessar o ponto final do token: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation>Não foi possível analisar o JSON retornado do servidor: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation>A resposta do servidor não continha todos os campos esperados</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation>&lt;h1&gt;Erro de Login&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation>&lt;h1&gt;Usuário errado&lt;/h1&gt;&lt;p&gt;Você fez logon com o usuário &lt;em&gt;%1&lt;/em&gt;, mas deve fazer login com o usuário &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Faça o logout de %3 em outra guia, então&lt;a href=&apos;%4&apos;&gt;clique aqui&lt;/a&gt; e faça o login como usuário%2&lt;/p&gt;</translation>
</message>
@@ -1725,58 +1891,58 @@ Itens onde a eliminação é permitida serão excluídos se eles evitarem que um
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Nova Atualização %1 Pronta</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>Uma nova atualização para %1 está para ser instalada. O atualizador pode solicitar por privilégios adicionais durante o processo.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>Baixando a versão %1. Por favor aguarde...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>Não foi possível baixar atualização. Por favor, clique &lt;a href=&apos;%1&apos;&gt;aqui&lt;/ a&gt; para baixar a atualização manualmente.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Não foi possível verificar a existência de novas atualizações.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>%1 versão %2 disponível. Reinicie a aplicação para iniciar a atualização.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>Nova %1 versão %2 disponível. Por favor, use a ferramenta de atualização do sistema para instalar.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Verificando servidor de atualização...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>Status de atualização é desconhecida: Não verifique para novas atualizações.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>Não há atualizações disponíveis. Sua instalação é a versão mais recente.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Verificação de Atualização</translation>
</message>
@@ -1784,43 +1950,43 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Conectar a %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Configurar opções de pastas locais</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Conectar...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1 Pasta &apos;%2&apos; está sincronizada com pasta local &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>Sincronizar a pasta &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Aviso:&lt;/strong&gt; A pasta local não está vazia. Escolha uma resolução!&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Sincronizar Pasta Local</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1879,15 +2045,20 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Conectar a %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation>Faça login no seu navegador</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation>Copiar o linque para a área de transferência</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1917,153 +2088,163 @@ It is not advisable to use it.</source>
<source>&amp;Next &gt;</source>
<translation>&amp;Póximo &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>URL inválida</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation>Não foi possível carregar o certificado. Talvez a senha esteja errada?</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Conectado com sucesso a %1: %2 versão %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Falha ao conectar a %1 em %2:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>O tempo expirou ao tentar contactar %1 e %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Tentando conectar a %1 em %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>A solicitação de autenticação ao servidor foi direcionada para &apos;%1&apos;. A URL está errada, a configuração do servidor está errada.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>Houve uma resposta inválida a um pedido de autenticação WebDAV</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>Acesso proibido pelo servidor. Para verificar se você tem acesso adequado, &lt;a href=&quot;%1&quot;&gt;clique aqui&lt;/a&gt; para acessar o serviço com o seu navegador.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>URL inválida</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation>O servidor informou o seguinte erro:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>Pasta local de sincronização %1 já existe, configurando para sincronização. &lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>Criação de pasta de sincronização local %1...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>ok</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>falhou.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>Não foi possível criar pasta local %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>Nenhuma pasta remota foi especificada!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Erro: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>criar pasta no ownCloud: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>Pasta remota %1 criada com sucesso.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>Pasta remota %1 já existe. Conectando para sincronizar.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>A criação da pasta resultou em um erro do código HTTP %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>A criação da pasta remota falhou porque as credenciais fornecidas estão erradas!&lt;br/&gt;Por favor, volte e verifique suas credenciais.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;A criação remota de pasta falhou provavelmente as causas da falha na criação da pasta remota são credenciais erradas&lt;/font&gt;&lt;br/&gt;Volte e verifique suas credenciais, por favor.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>Falha na criação da pasta remota %1 com erro &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>Uma conexão de sincronização de %1 para o diretório remoto %2 foi realizada.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Conectado com sucesso a %1!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>Conexão à %1 não foi estabelecida. Por favor, verifique novamente.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Falha no nome da pasta</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>Não é possível remover e fazer backup da pasta porque a pasta ou um arquivo que está nesta pasta está aberto em outro programa. Por favor, feche a pasta ou arquivo e clique tentar novamente ou cancelar a operação.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Pasta de sincronização local %1 criada com sucesso!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2071,14 +2252,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>Assistente de Conexões do %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Pular etapa de configuração de pastas</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation>Ativar recurso experimental?</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation>Quando o modo &quot;arquivos virtuais&quot; estiver habilitado, nenhum arquivo será baixado inicialmente. Em vez disso, um pequeno arquivo &quot;%1&quot; será criado para cada arquivo existente no servidor. O conteúdo pode ser baixado executando esses arquivos ou usando seu menu de contexto.
+
+Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer problemas que surjam.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation>Ativar o modo experimental</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation>Fique seguro</translation>
</message>
</context>
<context>
@@ -2102,7 +2302,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>Resposta JSON inválida a partir do conjunto de URL</translation>
</message>
@@ -2110,7 +2310,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>Ocorreu um erro ao escrever metadados ao banco de dados</translation>
</message>
@@ -2118,47 +2318,47 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>O arquivo %1 não pode ser baixado devido a um confronto local no nome do arquivo!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation>O download reduziria o espaço livre no disco local abaixo do limite</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>O espaço livre no disco é inferior a %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>O arquivo foi eliminado do servidor</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>O arquivo não pode ser baixado completamente.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation>O arquivo baixado está vazio apesar do servidor anunciou que deveria ter %1.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>O arquivo %1 não pode ser salvo devido a um confronto com um nome de arquivo local!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>Arquivo foi alterado desde a descoberta</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>Ocorreu um erro ao escrever metadados ao banco de dados</translation>
</message>
@@ -2166,12 +2366,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; Falha na Restauração: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation>Um arquivo ou pasta foi removido de um compartilhamento de somente leitura, mas a restauração falhou: %1</translation>
</message>
@@ -2179,22 +2379,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>não foi possível apagar o arquivo %1, erro: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>Atenção, possível caso de sensibilidade de minúscula/maiúscula, choque com %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>não foi possível criar a pasta %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>Ocorreu um erro ao escrever metadados ao banco de dados</translation>
</message>
@@ -2202,17 +2402,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>Erro removendo &apos;%1&apos;: %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>Não foi possível remover a pasta &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>Não foi possível remover %1 por causa de um choque de nomes de arquivos locais</translation>
</message>
@@ -2220,13 +2420,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>O arquivo %1 não pode ser renomeado para %2 por causa de um choque com nome de arquivo local</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>Ocorreu um erro ao escrever metadados ao banco de dados</translation>
</message>
@@ -2234,12 +2434,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>O arquivo foi removido de um compartilhamento somente de leitura. Ele foi restaurado.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>Código HTTP retornado errado pelo servidor. 204 esperado, mas recebeu &quot;%1 %2&quot;.</translation>
</message>
@@ -2247,12 +2442,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Código HTTP retornado errado pelo servidor. 201 esperado, mas recebeu &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>Ocorreu um erro ao escrever metadados ao banco de dados</translation>
</message>
@@ -2260,28 +2455,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Esta pasta não pode ser renomeada. Ela será renomeado de volta ao seu nome original.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Esta pasta não pode ser renomeada. Por favor, nomeie-a de volta para Compartilhada.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>O arquivo foi renomeado mas faz parte de compartilhamento só de leitura. O arquivo original foi restaurado.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Código HTTP retornado errado pelo servidor. 201 esperado, mas recebeu &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>Ocorreu um erro ao escrever metadados ao banco de dados</translation>
</message>
@@ -2289,33 +2469,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation>O arquivo %1 não pode ser enviado porque um outro arquivo com o mesmo nome, diferenciando apenas letras maiúsculas e minúsculas, existe</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Arquivo Removido</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>Arquivo local alterado durante a sincronização. Ele será retomado.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>Arquivo local modificado durante a sincronização.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation>O envio de %1 excede a quota da pasta</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>Ocorreu um erro ao escrever metadados ao banco de dados</translation>
</message>
@@ -2323,27 +2503,27 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>O arquivo local foi removido durante a sincronização.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>Arquivo local modificado durante a sincronização.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation>Código de retorno inesperado do servidor (%1)</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation>Falta ID do arquivo do servidor</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation>Falta ETag do servidor</translation>
</message>
@@ -2351,27 +2531,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>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.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>Faltando conjunto de URL</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>O arquivo local foi removido durante a sincronização.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>Arquivo local modificado durante a sincronização.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation>O servidor não reconheceu o último pedaço. (Nenhuma e-tag estava presente)</translation>
</message>
@@ -2389,42 +2564,47 @@ It is not advisable to use it.</source>
<translation>RótuloTexto</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Abrir no navegador</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Tempo</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Arquivo</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Pasta</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Ação</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Tamanho</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>Protocolo de sincronização local</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Copiar</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Copiar a lista de atividades para a área de transferência.</translation>
</message>
@@ -2465,7 +2645,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Escolher o que Sincronizar</translation>
</message>
@@ -2473,33 +2653,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Carregando...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation>Desmarque as pastas remotas que não deseja sincronizar.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Nome</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Tamanho</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>Nenhuma sub-pasta atualmente no servidor.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation>Ocorreu um erro enquanto carregava a lista de subpastas.</translation>
</message>
@@ -2520,22 +2700,22 @@ It is not advisable to use it.</source>
<translation>Configurações</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Atividade</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Geral</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Rede</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Conta</translation>
</message>
@@ -2543,28 +2723,28 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Atividade</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Geral</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Rede</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Conta</translation>
</message>
@@ -2592,42 +2772,42 @@ It is not advisable to use it.</source>
<translation>Caminho ownCloud:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>Compartilhamento %1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Pasta: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>O servidor não permitir o compartilhamento</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation>Recuperando máximo possível de permissões de compartilhamento do servidor...</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>O arquivo não pode ser partilhado, pois foi compartilhado sem permissão de compartilhamento.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>Usuários e Grupos</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>Linques Públicos</translation>
</message>
@@ -2640,7 +2820,17 @@ It is not advisable to use it.</source>
<translation>Compartilhar NewDocument.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation>Apenas enviar (Deixar um Arquivo)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation>Receba arquivos de outros sem revelar o conteúdo da pasta.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>RótuloTexto</translation>
</message>
@@ -2670,19 +2860,24 @@ It is not advisable to use it.</source>
<translation>Configurar senha</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
- <translation>Propriedades do linque:</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
+ <translation>Os destinatários podem visualizar ou baixar o conteúdo.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation>Baixar / Visualizar</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>Mostrar lista de arquivos</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation>Baixar / Visualizar / Enviar</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Permitir edição</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation>Os destinatários podem visualizar, baixar, editar, excluir e enviar conteúdos.</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2690,95 +2885,95 @@ It is not advisable to use it.</source>
<translation>Qualquer pessoa com o link tem acesso ao arquivo/pasta</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>S&amp;enha de proteção</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Protegido por Senha</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>O arquivo não pode ser partilhado, pois foi compartilhado sem permissão de compartilhamento.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation>Os compartilhamentos de linque foram desativados</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation>Criar linque de compartilhamento público</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Excluir</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation>Abrir linque no navegador</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation>Copiar o linque para a área de transferência</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation>Copiar o linque para a área de transferência (download direto)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Enviar linque por e-mail</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation>Enviar linque por e-mail (download direto)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation>Eu compartilhei %1 com você</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation>Confirmar o Link de Eliminação de Compartilhamento</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation>&lt;p&gt;Você realmente deseja excluir o compartilhamento de links públicos &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Nota: Esta ação não pode ser desfeita.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Cancelar</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation>Linque público</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation>Excluir linque de compartilhamento</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>Comp&amp;artilhamento público requer uma senha</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Por favor, Definir senha</translation>
</message>
@@ -2801,32 +2996,32 @@ It is not advisable to use it.</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Você pode direcionar as pessoas para esse arquivo ou pasta compartilhada&lt;a href=&quot;private link menu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;dando-lhes um linque privado&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation>O item não está compartilhado com usuários ou grupos</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation>Abrir linque no navegador</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation>Copiar o linque para a área de transferência</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Enviar linque por e-mail</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>Sem resultados para &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation>Eu compartilhei algo com você</translation>
</message>
@@ -2839,37 +3034,38 @@ It is not advisable to use it.</source>
<translation>Formulário</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>RótuloTexto</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>pode editar</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>pode compartilhar</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>criar</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>mudar</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>excluir</translation>
</message>
@@ -2913,143 +3109,176 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>Compartilhar com %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation>Compartilhar contexto do menu</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation>Eu compartilhei algo com você</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation>Compartilhar...</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation>Copie o linque privado para a área de transferência</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation>Envie o linque privado por e-mail...</translation>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation>Não é permitido compartilhar novamente este arquivo</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation>Copiar linque público para a área de transferência</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Abrir no navegador</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation><numerusform>Baixar arquivo(s)</numerusform><numerusform>Baixar arquivo(s)</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation><numerusform>Substituir arquivo(s) por arquivo virtual</numerusform><numerusform>Substituir arquivo(s) por arquivo virtual</numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt; Detalhes do Certificado &lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Nome Comum (CN):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>Assunto Nomes Alternativos:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Organização (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Unidade Organizacional (OU):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Estado/Província:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>País:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Série:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Emissor&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Emissor:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Emitido em:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Expira em:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Impressões Digitais&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt; Nota:&lt;/b&gt;Este certificado foi aprovado manualmente&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (auto-assinado)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>Esta conexão é criptografada usando %1 bit %2.
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation>Não há suporte para sessão SSL tickets/identificadores</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Informações do certificado:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>Esta conexão não é segura, uma vez que não é criptografada.
@@ -3137,305 +3366,270 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Sucesso.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>CSync não conseguiu carregar o arquivo journal. O arquivo journal está corrompido.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;O plugin %1 para csync não foi carregado.&lt;br/&gt;Por favor verifique a instalação!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>Erro fatal de parametro do CSync.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>Processamento da atualização do CSync falhou.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>Processamento da conciliação do CSync falhou.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>Csync não conseguiu autenticação no proxy.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSync falhou ao localizar o proxy ou servidor.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync falhou ao autenticar no servidor %1.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync falhou ao conectar à rede.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>Ocorreu uma desconexão de rede. </translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>Houve um erro na transmissão HTTP.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation>A pasta montada não está temporariamente disponível no servidor</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>Ocorreu um erro ao abrir uma pasta</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>Erro ao ler pasta.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation>%1 (ignorado devido a um erro anterior, tentando novamente em %2)</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>Arquivo/pasta ignorado porque porque está escondido.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation>A hierarquia de pastas é muito profunda</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation>Conflito: Versão do servidor baixada, cópia local renomeada e não carregada.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation>Apenas %1 estão disponíveis, precisamos de pelo menos %2 para começar</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation>Não é possível abrir ou criar o banco de dados de sincronização local. Certifique-se de ter acesso de gravação na pasta de sincronização.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation>Não permitido porque você não tem permissão para adicionar pasta mãe</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation>Não permitido porque você não tem permissão para adicionar arquivos na pasta</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation>O espaço em disco é pequeno: Os downloads que reduzam o espaço livre abaixo de %1 foram ignorados.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation>Há espaço disponível no servidor para alguns envios.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: Sem espaço disponível no servidor %1.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>Erro não especificado no CSync.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Abortado pelo usuário</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>CSync não conseguiu o acesso</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation>Falha ao carregar ou criar o arquivo de diário. Certifique-se de ter permissões de leitura e gravação na pasta de sincronização local.</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation>A etapa de descoberta falhou.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
- <translation>CSync falhou ao carregar ou criar o arquivo de diário. Certifique-se de ter permissão de ler e escrever na pasta de sincronização local.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation>Permissão negada.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
- <translation>CSync falhou devido a permissão de não manipulação negada.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
+ <translation>Arquivo ou diretório não encontrado:</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
- <translation>CSync tentou criar uma pasta que já existe.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
+ <translation>Tentativa de criar uma pasta que já existe.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation>Nenhum espaço no servidor %1 está disponível.</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>O serviço está temporariamente indisponível</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>Acesso proibido</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>Um erro interno de número %1 ocorreu.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>Linques simbólicos não são suportados em sincronização.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>O arquivo está listado na lista de ignorados.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation>Os nomes de arquivos que terminam com um ponto não são suportados neste sistema de arquivos.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation>Os nomes de arquivos que contêm o caractere &apos;%1&apos; não são suportados neste sistema de arquivos.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation>O nome do arquivo é um nome reservado neste sistema de arquivos.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation>O nome do arquivo contém espaços deixados para trás.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>O nome do arquivo é muito longo.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation>O nome do arquivo não pode ser codificado em seu sistema de arquivos.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation>Conflito não solucionado.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>Stat falhou.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>A codificação do nome do arquivo não é válida</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>Caracteres inválidos, por favor renomear &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation>Usando arquivos virtuais, mas o sufixo não está definido</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation>Não é possível ler a lista negra a partir do banco de dados local</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation>Não é possível ler a partir do relatório de sincronização.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>Não é possível abrir o arquivo de sincronização</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>O nome do arquivo contem pelo menos um caractere inválido </translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>Ignorado por causa da lista negra &quot;escolher o que sincronizar&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation>Não permitido porque você não tem permissão para adicionar subpastas para essa pasta</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>Não é permitido fazer o upload deste arquivo porque ele é somente leitura no servidor, restaurando</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>Não é permitido remover, restaurando</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>Arquivos locais e pasta compartilhada removida.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>Não é permitido mover, item restaurado</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>Não é permitido mover porque %1 é somente para leitura</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>o destino</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>a fonte</translation>
</message>
@@ -3459,17 +3653,18 @@ It is not advisable to use it.</source>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Versão %1. Para mais informações por favor visite &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Versão %2. Para mais informações visite
+ &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Para problemas e ajuda conhecidos, visite: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation>&lt;p&gt;Direitos autorais ownCloud GmbH&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;Distribuído por %1 e licenciado sobre a GNU General Public License (GPL) Versão 2.0.&lt;br/&gt;%2 e o %2 logo são marcas registradas de %1 nos Estados Unidos, outros países ou ambos.&lt;/p&gt;</translation>
</message>
@@ -3500,81 +3695,81 @@ It is not advisable to use it.</source>
<translation>Favor conectar</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Pasta %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Não há pastas de sincronização configuradas.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Abrir no navegador</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Entrar...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Sair</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Alterações Recentes</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Verificando por alterações em &apos;%1&apos;</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Pastas Gerenciadas:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Abrir pasta &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Abrir %1 no navegador</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation>O servidor na conta %1 executa uma versão não suportada %2. A utilização deste cliente com versões de servidor não suportadas não foi testada e é potencialmente perigosa. Prossiga por sua conta e risco.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Status desconhecido</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Configurações...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Detalhes...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Ajuda</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>Sair %1</translation>
</message>
@@ -3589,11 +3784,6 @@ It is not advisable to use it.</source>
<translation>Versão do Servidor Não Suportada</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation>O servidor da conta %1 está executando uma versão %2 antiga e não suportada. Usar esse cliente junto com versões não suportadas e não testadas é potencialmente perigoso. Prossiga por conta própria.</translation>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Desconectado</translation>
@@ -3625,116 +3815,129 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation>A sincronização está pausada</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation>Conflitos não resolvidos</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation>Erro durante a sincronização</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation>Nenhuma pasta de sincronização configurada</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation>Retomar todas as pastas</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>Pausar todas as pastas</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>Retomar toda a sincronização</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>Retomar sincronização</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>Dar uma pausa em toda a sincronização</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>Dar uma pausa na sincronização</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Desconectar todas as contas</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Conectar todas as contas...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>Nova conta...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>Sobre %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>Quebrar agora</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Não há itens sincronizados recentemente</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation>Verificando alterações remotamente &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation>Verificação de alterações local &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Sincronizar %1 de %2 (%3 faltando)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation>Sincronizando %1 de %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Sincronizando %1 (%2 faltando)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>Sincronizando %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Até a data</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Versão %2. Para mais informações visite &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Para saber sobre problemas e ajuda, por favor visite: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;Por Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, e outros.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Direitos Autorais ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licenciado sob a GNU General Public License (GPL) Versão 2.0&lt;br/&gt;ownCloud e o Logo ownCloud são marcas registradas da ownCloud GmbH nos United States, e outros países, ou ambos.&lt;/p&gt;</translation>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3746,9 +3949,9 @@ It is not advisable to use it.</source>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>TextLabel</translation>
</message>
@@ -3784,11 +3987,22 @@ It is not advisable to use it.</source>
<translation>Solicitar confirmação antes de sincronizar os armazenamentos e&amp;xternos</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Escolha o que quer sincronizar</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Quando esta opção é selecionada, o assistente será fechado sem sincronizar nada. Você pode usar a &amp;quot; Adicionar conexão de sincronização de pastas &amp;quot; botão das configurações da conta para escolher qual par de pasta local e remota você deseja sincronizar&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation>Criar manualmente conexões de sincronização de pasta</translation>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>&amp;Pasta Local</translation>
@@ -3805,11 +4019,16 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>S&amp;ync tudo do servidor</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation>S&amp;incronizar tudo do servidor (recomendado)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation>Use arquivos virtuais em vez de baixar conteúdo imediatamente (e&amp;xperimental)</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Mensagem de status</translation>
</message>
@@ -3846,8 +4065,8 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
- <translation>Ocorreu um erro durante a conexão. Tente novamente.</translation>
+ <source>An error occurred while connecting. Please try again.</source>
+ <translation>Ocorreu um erro durante a conexão. Por favor, tente novamente.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="56"/>
@@ -4026,7 +4245,7 @@ It is not advisable to use it.</source>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;Construído a partir de revisão Git &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; em %3, %4 usando Qt %5, %6&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4124,52 +4343,52 @@ It is not advisable to use it.</source>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Status indefinido</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Aguardando para iniciar sincronização</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>Sincronização em andamento</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Sucesso na Sincronização</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Sincronizado com Sucesso, alguns arquivos foram ignorados.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Erro de sincronização</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Erro na Configuração</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Preparando para sincronização</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Abortando...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>Sincronização em pausa</translation>
</message>
@@ -4177,22 +4396,22 @@ It is not advisable to use it.</source>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation>Não foi possível abrir o navegador</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation>Ocorreu um erro ao iniciar o navegador para ir ao endereço URL %1. Talvez nenhum navegador padrão esteja configurado?</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation>Não foi possível abrir o cliente de e-mail</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation>Ocorreu um erro ao iniciar o cliente de e-mail para criar uma nova mensagem. Talvez nenhum cliente de e-mail padrão esteja configurado?</translation>
</message>
diff --git a/translations/client_ru.ts b/translations/client_ru.ts
index 266b36c5d..e496eda95 100644
--- a/translations/client_ru.ts
+++ b/translations/client_ru.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="ru" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation>Не удалось создать каталоги в корзине</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation>Не удалось переместить &apos;%1&apos; в &apos;%2&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation>Перемещение в корзину не реализовано на данной платформе</translation>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,17 +95,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Время ожидания соединения превышено</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation>Неизвестная ошибка: сетевой ответ был удален</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation>Сервер ответил от &quot;%1 %2&quot; до &quot;%3 %4&quot;</translation>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Отмена</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Уч.запись</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Выбрать объекты для синхронизации</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Принудительно синхронизовать сейчас</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>Перезапустить синхронизацию</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>Удалить подключение синхронизации каталога</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Ошибка создания каталога</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;Не удалось создать локальный каталог &lt;i&gt;%1&lt;/i&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>Подтвердите удаление подключения синхронизации каталога</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>Удалить подключение синхронизации каталога</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Синхронизация запущена</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>Выполняется синхронизация.&lt;br/&gt;Вы хотите её остановить?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 используется</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 как &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>Сервер версии %1 устарел и не поддерживается! Продолжайте на свой страх и риск.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Соединен с %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>Сервер %1 временно недоступен.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation>Сервер %1 в настоящее время находится в режиме технического обслуживания.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>Успешно вышли из %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation>Получение авторизации из браузера. &lt;a href=&apos;%1&apos;&gt;Нажмите здесь&lt;/a&gt;, чтобы повторно открыть браузер.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation>Соединение с %1...</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>Нет соединения с %1 в %2.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Войти</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>Есть каталоги, которые не были синхронизированы, так как они слишком большие:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>Есть каталоги, которые не были синхронизированы, так как они являются внешними хранилищами:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation>Есть каталоги, которые не были синхронизированы, так как они слишком велики или являются внешними хранилищами:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Подтверждение удаления учетной записи</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Вы действительно желаете удалить подключение к учетной записи &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Примечание:&lt;/b&gt; Это действие &lt;b&gt;НЕ&lt;/b&gt; удалит ваши файлы.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Удалить подключение</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Открыть папку</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Выйти</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Возобновить синхронизацию</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Приостановить синхронизацию</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Вы действительно желаете остановить синхронизацию папки &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Примечание:&lt;/b&gt; Это действие &lt;b&gt;НЕ&lt;/b&gt; удалит ваши файлы.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1 (%3%) из %2 используется. Некоторые папки, включая сетевые или общие, могут иметь свои собственные ограничения.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%1 из %2 используется</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>В данный момент информация о заполненности хранилища недоступна.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>Нет настроенного подключения %1.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Вышли из аккаунта</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Отключено</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Подключено</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Сервис недоступен</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation>Режим технического обслуживания.</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Ошибка сети</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Ошибка конфигурации</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation>Запросить учётных данных</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Неизвестное состояние учетной записи</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Действия Сервера</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Протокол синхронизации</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>Не синхронизировано</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>Не синхронизировано (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>Список активности сервера скопирован в буфер обмена.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>Список активности синхронизации скопирован в буфер обмена.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>Список несинхронизированных элементов скопирован в буфер обмена.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Скопировано в буфер обмена</translation>
</message>
@@ -469,47 +488,47 @@
<translation>TextLabel</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Действия Сервера</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Копировать</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Скопировать журнал синхронизации в буфер обмена.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Требуется действие: уведомления</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;У учетной записи %1 не включены события.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation><numerusform>Вы получили %n новое уведомление от %2.</numerusform><numerusform>Вы получили %n новых уведомления от %2.</numerusform><numerusform>Вы получили %n новых уведомлений от %2.</numerusform><numerusform>Вы получили %n новых уведомлений от %2.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation><numerusform>Вы получили %n новое уведомление от %1 и %2.</numerusform><numerusform>Вы получили %n новых уведомления от %1 и %2.</numerusform><numerusform>Вы получили %n новых уведомлений от %1 и %2.</numerusform><numerusform>Вы получили %n новых уведомлений от %1 и %2.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>Для Вас получено %n новых уведомлений из %1, %2 и других уч.записей.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>%1 уведомлений - требуются действия.</translation>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation>Продолжение будет означать &lt;b&gt;удаление этих настроек&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation>Продолжение будет означать &lt;b&gt;игнорирование этих настроек&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation>Некоторые настройки были сделаны в клиенте более новой версии, чем данный, и используют возможности, которые не доступны в этой версии.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Резервная копия текущей конфигурации уже сохранена в &lt;i&gt;%2&lt;/i&gt;.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Выход</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Продолжить</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation>Ошибка при доступе к файлу конфигурации</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation>При обращении к файлу конфигурации %1 произошла ошибка.</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>Выйти из ownCloud</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>Ошибка записи метаданных в базу данных</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>Учётная запись OwnCloud не настроена</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>Настроенный сервер слишком стар для этого клиента</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Обновите сервер до последней версии и перезапустите клиент.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Ошибка авторизации: Имя пользователя или пароль не верны.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>тайм-аут</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>Введённые учётные данные не верны</translation>
</message>
@@ -637,133 +681,164 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Прервано пользов</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation>Отсутствуют данные в ответе сервера на обнаружение файла.</translation>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>Локальный каталог %1 не существует.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 должен быть папкой, но ей не является.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 не может быть прочитан.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>&apos;%1&apos; был удалён.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 был загружен.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 был обновлён.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 был переименован в %2.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 был перемещён в %2.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation><numerusform>%1 и ещё %n другой файл был удалён.</numerusform><numerusform>%1 и ещё %n других файла было удалено.</numerusform><numerusform>%1 и ещё %n других файлов были удалены.</numerusform><numerusform>%1 и ещё %n других файлов были удалены.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation><numerusform>%1 и ещё %n другой файл были скачаны.</numerusform><numerusform>%1 и ещё %n других файла были скачаны.</numerusform><numerusform>%1 и ещё %n других файлов были скачаны.</numerusform><numerusform>%1 и ещё %n других файлов были скачаны.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation><numerusform>%1 и ещё %n другой файл были обновлены.</numerusform><numerusform>%1 и ещё %n других файла были обновлены.</numerusform><numerusform>%1 и ещё %n других файлов были обновлены.</numerusform><numerusform>%1 и ещё %n других файлов были обновлены.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation><numerusform>%1 был переименован в %2, и ещё %n другой файл был переименован.</numerusform><numerusform>%1 был переименован в %2, и ещё %n других файла были переименованы.</numerusform><numerusform>%1 был переименован в %2, и ещё %n других файлов были переименованы.</numerusform><numerusform>%1 был переименован в %2, и ещё %n других файлов были переименованы.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation><numerusform>%1 был перемещён в %2, и ещё %n другой файл был перемещён.</numerusform><numerusform>%1 был перемещён в %2, и ещё %n других файла были перемещены.</numerusform><numerusform>%1 был перемещён в %2, и ещё %n других файла были перемещены.</numerusform><numerusform>%1 был перемещён в %2, и ещё %n других файла были перемещены.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation><numerusform>У %1 и ещё у %n другого файла есть конфликты синхронизации.</numerusform><numerusform>У %1 и ещё у %n других файлов есть конфликты синхронизации.</numerusform><numerusform>У %1 и ещё у %n других файлов есть конфликты синхронизации.</numerusform><numerusform>У %1 и ещё у %n других файлов есть конфликты синхронизации.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation>У %1 есть конфликт синхронизации. Пожалуйста, проверьте конфликтный файл!</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation><numerusform>%1 и ещё %n другой файл не удалось синхронизировать из-за ошибок. Подробности смотрите в журнале.</numerusform><numerusform>%1 и ещё %n других файла не удалось синхронизировать из-за ошибок. Подробности смотрите в журнале.</numerusform><numerusform>%1 и ещё %n других файлов не удалось синхронизировать из-за ошибок. Подробности смотрите в журнале.</numerusform><numerusform>%1 и ещё %n других файлов не удалось синхронизировать из-за ошибок. Подробности смотрите в журнале.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 не может быть синхронизирован из-за ошибки. Подробности смотрите в журнале.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Журнал синхронизации</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>Невозможно прочесть системный файл исключений</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation>Был добавлен новый каталог размером более %1 МБ: %2.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation>Добавлен каталог из внешнего хранилища.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation>Пожалуйста, перейдите в настройки, чтобы выбрать его, если вы хотите его скачать.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation>Каталог %1 был создан, но ранее исключён из синхронизации. Данные внутри него не буду синхронизироваться.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation>Файл %1 был создан, но был ранее исключён из синхронизации. Он не будет синхронизироваться.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation>Невозможно надёжно отслеживать изменения в синхронизируемых каталогах.
+
+Это означает, что клиент синхронизации возможно не сможет сразу закачать локальные изменения, и вместо этого будет периодически проверять локальные изменения и закачивать их по мере возможности (по умолчанию каждые два часа).
+
+%1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -774,7 +849,7 @@ If you decide to delete the files, they will be unavailable to you, unless you a
Если вы решили удалить файлы, они станут вам недоступны, крмое случая, когда вы сам владелец.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
@@ -783,39 +858,39 @@ If this was an accident and you decide to keep your files, they will be re-synce
Если это произошло случайно и вы решите сохранить файлы, они будут перезакачаны с сервера.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Удалить все файлы?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Удалить все файлы</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Сохранить файлы</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
<translation>Эта синхронизация собирается сбросить файлы в катлоге &apos;%1&apos; в более ранее состояние. Такое может случиться, если на сервере восстановлена резервная копия. Если продолжать синхронизацию как обычно, то ваши файлы будут перетёрты более старыми версиями. Хотите сохранить ваши локальные свежие файлы в качестве конфликтных?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>Обнаружена резервная копия</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>Обычная синхронизация</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>Сохранить локальные файлы как конфликтующие</translation>
</message>
@@ -823,115 +898,105 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>Невозможно сбросить состояние каталога</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>Найден старый журнал синхронизации &apos;%1&apos;, и он не может быть удалён. Убедитесь что он не открыт в другом приложении.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation>(резервная копия)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation>(резервная копия %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Неопределенное состояние.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>Ожидание запуска синхронизации.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Подготовка к синхронизации.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>Идет синхронизация.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>Последняя синхронизация прошла успешно.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation>Синхронизация успешна, есть неразрешённые конфликты.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>Последняя синхронизация прошла успешно, но были предупреждения для некоторых файлов.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>Последняя синхронизация прошла успешно.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Ошибка установки.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Отмена пользователем.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>Синхронизация приостановлена.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%! (синхронизация приостановлена)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>Не выбран валидный каталог!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>Выбранный путь не является каталогом!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>У вас недостаточно прав для записи в выбранный каталог!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation>Локальный каталог %1 содержит символьную ссылку. Место, на которое указывает ссылка, уже содержит засинхронизированный каталог. Пожалуйста, выберите другой!</translation>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation>Уже есть синхронизация с сервера в этот локальный каталог. Пожалуйста, выберите другой локальный каталог!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Локальная директория %1 уже содержит папку, которая используется для синхронизации. Пожалуйста выберите другую!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Локальная директория %1 уже содержит директорию, которая используется для синхронизации. Пожалуйста выберите другую!</translation>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation>Локальная директория %1 является символьной ссылкой. Эта ссылка указывает на путь, находящийся внутри директории, уже используемой для синхронизации. Пожалуйста укажите другую!</translation>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -941,7 +1006,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Добавить папку для синхронизации</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>Синхронизация с локальным каталогом</translation>
</message>
@@ -976,7 +1041,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Ошибка загрузки списка папок с сервера.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Вышли из аккаунта</translation>
</message>
@@ -991,115 +1056,133 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Есть неразрешенные конфликты. Нажми для просмотра подробностей.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Проверка изменений в &apos;%1&apos;</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation>Проверяю измененеия в удалённом &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation>Проверяю изменения в локальном &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation>Согласование изменений</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>Синхронизация %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>,</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>скачивание %1/с</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/сjavascript:;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>загрузка %1/с</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/с</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 из %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>Осталось %5, %1 из %2, файл %3 из %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 из %2, файл %3 из %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>файл %1 из %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>Ожидание...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>Ожидание %n директории...</numerusform><numerusform>Ожидание %n директорий...</numerusform><numerusform>Ожидание %n директорий...</numerusform><numerusform>Ожидание %n директорий...</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>Подготовка к синхронизации...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation>Эта проблема обычно связана с механизмом оповещений inotify. Подробнее - см. FAQ.</translation>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>Добавить папку для синхронизации</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>Добавить подключение для синхронизации</translation>
</message>
@@ -1107,17 +1190,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Кликните, чтобы выбрать локальный каталог для синхронизации.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Укажите путь к локальному каталогу.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Выберите исходный каталог</translation>
</message>
@@ -1125,60 +1208,68 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Создать Удалённый Каталог</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>Введите имя каталога, который должен быть создан под &apos;%1&apos;:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>Каталог успешно создан на %1.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>Ошибка авторизации при доступе к %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>Невозможно создать каталог по пути %1. Попробуйте создать его вручную.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>Ошибка просмотра папки. Ошибка: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Нажмите здесь для синхронизации всей учётной записи</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Этот каталог уже выбран для синхронизации.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Каталог &lt;i&gt;%1&lt;/i&gt; уже настроен для синхронизации, и он является родительским для каталога &lt;i&gt;%2&lt;/i&gt;.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation>Использовать виртуальные файлы вместо немедленного скачивания содержимого (экспериментальное)</translation>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Предупреждение:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Предупреждение:&lt;/b&gt;</translation>
</message>
@@ -1186,22 +1277,22 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>E-Tag от сервера не получен, проверьте настройки прокси/шлюза.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>Мы получили другой E-Tag для возобновления. Повторите попытку позже.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>Сервер вернул неверный диапазон содержимого</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Время ожидания подключения истекло</translation>
</message>
@@ -1224,23 +1315,38 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Для системного Трея</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation>&amp;Канал</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation>стабильный</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation>бета</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Дополнительно</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation>Спрашивать подтверждение перед синхронизацией каталогов размером больше чем</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>МБ</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation>Спрашивать подтверждение перед синхронизацией внешних хранилищ</translation>
</message>
@@ -1260,31 +1366,71 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Использовать черно-белые иконки</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>Редактировать &amp;Ignored файлы</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation>Показать папки синхронизации в навигационной панели Проводника</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>Показать отчёты об ошибках</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>О программе</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>Обновления</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>&amp;Перезапуск и обновление</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation>Изменить канал обновлений?</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation>Канал обновлений задаёт, какие обновления клиента будут предлагаться для установки. «Стабильный» канал содержит только обновления, считающиеся надёжными, в то время как версии в канале «бета» могут содержать более новые возможности и исправления ошибок, которые ещё не были тщательно протестированы.
+
+Заметьте, что это задаёт лишь место, откуда берутся обновления, нет возможности их отката назад. Таким образом, переключение канала с беты на стабильный не будет выполнено немедленно, оно подразумевает ожидание, когда выйдет стабильная версия, которая будет более свежей, чем установленная в данный момент бета-версия.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation>Изменить канал обновлений</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation>Ошибка предоставления доступа</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation>Не удалось извлечь или создать доступ по общей ссылке. Ошибка:
+
+%1</translation>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1352,7 +1498,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Удалить</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1360,27 +1506,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
Элементы, где это разрешается, будут удалены, в случае если они помешают удалению папки. Используется для метаданных.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Невозможно открыть файл</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>Невозможно записать изменения в &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Добавить шаблон игнорирования</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Добавить новый шаблон игнорирования:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Эта запись сделана системой в &apos;%1&apos; и не может быть изменена в этом представлении.</translation>
</message>
@@ -1410,7 +1556,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Папка</translation>
</message>
@@ -1425,35 +1571,45 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation>Показать игнорируемые файлы</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation>Было слишком много проблем. Не все будут видны здесь.</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation>Имеются конфликты. См. документацию по их разрешению.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation>Скопировать список проблем в буфер обмена.</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Копировать</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Время</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Файл</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation>Проблема</translation>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation>Имеются конфликты. &lt;a href=&quot;%1&quot;&gt;См. документацию по их разрешению.&lt;/a&gt;</translation>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1479,36 +1635,50 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation>Сохранить журналы на совсем</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation>Если эта настройка включена и не настроено никакого другого журналирования, то журналы будут записаны во временный файл и устареют через несколько часов. Эта настройка сохраняется при перезапусках клиента.
+
+Журналы будут записаны в %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Очистить</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Очистить журнал.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>С&amp;охранить</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Сохранить файл журнала на диск для отладки.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Сохранить файл журнала</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Ошибка</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>Файл журнала не может быть записан: %1</translation>
</message>
@@ -1516,12 +1686,12 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Ошибка</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;Файл &apos;%1&apos;&lt;br/&gt;не может быть открыт на запись.&lt;br/&gt;&lt;br/&gt;Журнал &lt;b&gt;не может&lt;/b&gt; быть сохранён!&lt;/nobr&gt;</translation>
</message>
@@ -1529,27 +1699,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Доступна новая версия</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;Доступна новая версия приложения %1.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; доступна для загрузки. Установленная версия: %3.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Пропустить эту версию</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Пропустить в этот раз</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Получить обновление</translation>
</message>
@@ -1637,27 +1807,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation>Ограничивать автоматически</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Адрес прокси сервера</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Пользователь прокси-сервера</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Пароль прокси-сервера</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>HTTP(S)-прокси</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>SOCKS5-прокси</translation>
</message>
@@ -1665,23 +1835,23 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>Создано %1</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>Закроется через несколько секунд…</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation>%1: запрос выполнен неудачно в %2</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation>&apos;%1&apos; выбрано в %2</translation>
@@ -1690,32 +1860,32 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation>Сервер вернул ошибку: &lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation>При доступе к конечной точке &apos;токена&apos; произошла ошибка: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation>Не удалось разобрать JSON, пришедший с сервера: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation>В ответе сервера содержатся не все ожидаемые поля</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation>&lt;h1&gt;Ошибка входа&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation>&lt;h1&gt;Неверный пользователь&lt;/h1&gt;&lt;p&gt;Вы вошли, как пользователь &lt;em&gt;%1&lt;/em&gt;, но нужно войти под пользователем &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Пожалуйста, выйдите из %3 в другой вкладке, а затем &lt;a href=&apos;%4&apos;&gt;кликните здесь&lt;/a&gt; и войдите, как пользователь %2&lt;/p&gt;</translation>
</message>
@@ -1723,59 +1893,59 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Доступно обновление %1</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>Новое обновление %1 в процессе установки. Установщик может запросить
дополнительные разрешения во время обновления.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>Загрузка версии %1. Пожалуйста, подождите...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>Не удалось загрузить обновление. Для скачивания файлов вручную, нажмите &lt;a href=&apos;%1&apos;&gt;здесь&lt;/a&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Не удалось проверить наличие новых обновлений.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>%1 версия %2 доступна. Перезагрузите приложение, чтобы запустить обновление.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>Новая %1 версия %2 доступна. Пожалуйста используйте утилиту обновления системы для установки.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Проверка наличия обновлений на сервере...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>Статус обновления неизвестен: Не удалось проверить наличие обновлений.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>Обновлений в настоящий момент нет. У вас установлена самая последняя версия программы.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Проверка Обновлений</translation>
</message>
@@ -1783,43 +1953,43 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Подключиться к %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Изменить настройки локальных каталогов</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Соединение...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1 каталог &apos;%2&apos; синхронизирован с локальным каталогом &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>Синхронизация папки &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Внимание:&lt;/strong&gt; Локальная папка не пуста. Выберите действие!&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Локальный каталог синхронизации</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1878,15 +2048,20 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Подключиться к %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation>Вход в ваш браузер</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation>Копировать ссылку в буфер обмена</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1917,153 +2092,163 @@ It is not advisable to use it.</source>
<source>&amp;Next &gt;</source>
<translation>&amp;Далее &gt; </translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>Неверная ссылка</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation>Не удалось загрузить сертификат. Возможно, неверен пароль?</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Успешное подключение к %1: %2 версия %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Не удалось подключиться к %1 в %2:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>Превышено время ожидания соединения к %1 на %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Попытка соединиться с %1 на %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>Запрос авторизации с сервера перенаправлен на &apos;%1&apos;. Ссылка не верна, сервер не настроен.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>Обнаружен не верный ответ на авторизованный запрос WebDAV</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>Доступ запрещён сервером. Чтобы доказать, что у Вас есть права доступа, &lt;a href=&quot;%1&quot;&gt;нажмите здесь&lt;/a&gt; для входа через Ваш браузер.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>Неверная ссылка</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation>Сервер выдал следующую ошибку:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>Локальный каталог синхронизации %1 уже существует, используем его для синхронизации.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>Создание локальной папки синхронизации %1... </translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>ок</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>не удалось.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>Не удалось создать локальный каталог синхронизации %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>Не указан удалённый каталог!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Ошибка: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>создание каталога на ownCloud: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>Удалённый каталог %1 успешно создан.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>Удалённый каталог %1 уже существует. Подключение к нему для синхронизации.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>Создание каталога завершилось с HTTP-ошибкой %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>Не удалось создать удаленный каталог, так как представленные параметры доступа неверны!&lt;br/&gt;Пожалуйста, вернитесь назад и проверьте учетные данные.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Не удалось создать удаленный каталог, возможно, указанные учетные данные неверны.&lt;/font&gt;&lt;br/&gt;Вернитесь назад и проверьте учетные данные.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>Удаленный каталог %1 не создан из-за ошибки &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>Установлено соединение синхронизации %1 к удалённому каталогу %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Соединение с %1 установлено успешно!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>Не удалось соединиться с %1. Попробуйте снова.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Ошибка переименования каталога</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>Невозможно удалить каталог и создать его резервную копию, каталог или файл в ней открыт в другой программе. Закройте каталог или файл и нажмите &quot;Повторить попытку&quot;, либо прервите мастер настройки.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Локальный каталог синхронизации %1 успешно создан!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2071,14 +2256,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>Мастер подключения %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Пропустить настройку каталогов</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation>Включить экспериментальную возможность?</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation>Когда режим виртуальных файлов включён, никакие файлы сначала не скачиваются. Вместо этого для каждого файла, существующего на сервере, создаётся маленький файл &quot;%1&quot;. Содержимое можно скачать, запустив эти файлы, или через их контекстное меню.
+
+Это новый экспериментальный режим. Если вы решите использовать его, пожалуйста сообщайте обо всех выявляемых проблемах.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation>Включить экспериментальный режим</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation>Отказаться от эксперимента</translation>
</message>
</context>
<context>
@@ -2102,7 +2306,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>Не правильный JSON ответ на сформированный URL</translation>
</message>
@@ -2110,7 +2314,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>Ошибка записи метаданных в базу данных</translation>
</message>
@@ -2118,47 +2322,47 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>Файл %1 не может быть загружен из-за локального конфликта имен!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation>Скачивание сократит доступное пространство на локальном диске ниже допустимого предела</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>Свободное место на диске меньше, чем %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>Файл был удален с сервера</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>Невозможно полностью загрузить файл.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation>Скачанный файл пуст, хотя сервер заявил, что он должен быть %1.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>Файл %1 не может быть сохранён из-за локального конфликта имен!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>После обнаружения файл был изменен</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>Ошибка записи метаданных в базу данных</translation>
</message>
@@ -2166,12 +2370,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; Восстановление не удалось: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation>Файл или папка была удалена из доступа только для чтения, восстановление завершилось с ошибкой: %1</translation>
</message>
@@ -2179,22 +2383,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>не удалось удалить файл %1, ошибка: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>Внимание, возможен конфликт чувствительности к регистру с %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>не удается создать папку %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>Ошибка записи метаданных в базу данных</translation>
</message>
@@ -2202,17 +2406,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>Ошибка при удалении &apos;%1&apos;: %2; </translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>Не удается удалить папку &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>Не удается удалить %1 из-за локального конфликта имен</translation>
</message>
@@ -2220,13 +2424,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>Файл %1 не может быть переименован в %2 из-за локального конфликта имен</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>Ошибка записи метаданных в базу данных</translation>
</message>
@@ -2234,12 +2438,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>Файл удалён с удаленного общего ресурса только для чтения. Файл был восстановлен.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>Сервер ответил не правильным HTTP кодом. Ожидался 204, но получен &quot;%1 %2&quot;.</translation>
</message>
@@ -2247,12 +2446,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Сервер ответил не правильным HTTP кодом. Ожидался 201, но получен &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>Ошибка записи метаданных в базу данных</translation>
</message>
@@ -2260,28 +2459,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Этот каталог не должен переименовываться. Ему будет присвоено изначальное имя. </translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Этот каталог не должен переименовываться. Присвойте ему изначальное имя: Shared. </translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>Файл переименован на удаленном общем ресурсе только для чтения. Файл был восстановлен.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Сервер ответил не правильным HTTP кодом. Ожидался 201, но получен &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>Ошибка записи метаданных в базу данных</translation>
</message>
@@ -2289,33 +2473,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation>Невозможно загрузить файл %1, так как уже есть другой файл с тем же именем, отличающимся только регистром символов</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Файл Перемещён</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>Локальный файл изменился в процессе синхронизации. Операция будет возобновлена.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>Локальный файл изменился в процессе синхронизации.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation>Закачка %1 превышает квоту для каталога</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>Ошибка записи метаданных в базу данных</translation>
</message>
@@ -2323,27 +2507,27 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>Локальный файл был удалён в процессе синхронизации.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>Локальный файл изменился в процессе синхронизации.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation>Неожиданный код завершения от сервера (%1)</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation>Отсутствует код файла от сервера</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation>Отсутствует ETag с сервера</translation>
</message>
@@ -2351,27 +2535,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>Измененный файл принадлежит удаленному общему ресурсу только для чтения. Файл был восстановлен, ваши правки доступны в файле конфликтов.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>Не хватает сформированного URL</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>Локальный файл был удалён в процессе синхронизации.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>Локальный файл изменился в процессе синхронизации.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation>Сервер не смог подтвердить последнюю часть данных.(Отсутствовали теги e-tag)</translation>
</message>
@@ -2389,42 +2568,47 @@ It is not advisable to use it.</source>
<translation>TextLabel</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Открыть в браузере</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Время</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Файл</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Каталог</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Действие</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Размер</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>Локальный протокол синхронизации</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Копировать</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Скопировать журнал синхронизации в буфер обмена.</translation>
</message>
@@ -2465,7 +2649,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Уточнить объекты</translation>
</message>
@@ -2473,33 +2657,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Загрузка ...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation>Снимите выбор с удалённых папок, котрые вы не хотите синхронизировать.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Название</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Размер</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>Нет подкаталогов на сервере на данный момент.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation>Произошла ошибка во время загрузки списка подпапок.</translation>
</message>
@@ -2520,22 +2704,22 @@ It is not advisable to use it.</source>
<translation>Настройки</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>События</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Основные</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Сеть</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Уч.запись</translation>
</message>
@@ -2543,28 +2727,28 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>События</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Основные</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Сеть</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Уч.запись</translation>
</message>
@@ -2592,42 +2776,42 @@ It is not advisable to use it.</source>
<translation>Путь к OwnCloud:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>Вы поделились %1 </translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Папка: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>Сервер не разрешает обмен</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation>Запрос максимально возможных прав для предоставления доступа с сервера…</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Невозможно предоставить общий доступ к файлу: нет разрешения на предоставление общего доступа.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>Пользователи и группы</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>Общедоступные ссылки</translation>
</message>
@@ -2640,7 +2824,17 @@ It is not advisable to use it.</source>
<translation>Поделиться NewDocument.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation>Только закачка (закинуть файл)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation>Получение файлов от других без раскрытия содержимого каталога.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>TextLabel</translation>
</message>
@@ -2670,19 +2864,24 @@ It is not advisable to use it.</source>
<translation>Установить пароль</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
- <translation>Свойства ссылки:</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
+ <translation>Получатели могут просматривать или скачивать содержимое.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation>Скачивание / Просмотр</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>Показать список файлов</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation>Скачивание / Просмотр / Закачка</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Разрешить редактирование</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation>Получатели могут просматривать, скачивать, править, удалять и закачивать содержимое.</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2690,95 +2889,95 @@ It is not advisable to use it.</source>
<translation>Каждый, у кого есть эта ссылка, имеет доступ к файлу/каталогу</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>Защитить паролем</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Защищено Паролем</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Невозможно предоставить общий доступ к файлу: нет разрешения на предоставление общего доступа.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation>Доступ по ссылкам был отключён</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation>Создать ссылку общего доступа</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Удалить</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation>Открыть ссылку в браузере</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation>Копировать ссылку в буфер обмена</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation>Скопировать ссылку в буфер обмена (прямое скачивание)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Отправить ссылку по email</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation>Отправить ссылку по почте (прямое скачивание)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation>Я даю вам доступ к %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation>Подтвердите удаление доступа по ссылке</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation>&lt;p&gt;Вы действтиельно хотите удалить доступ по общей ссылке &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Внимание: это действие будет невозможно отменить.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Отмена</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation>Общедоступная ссылка</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation>Удалить доступ по ссылке</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>Публичные ссылки требуют пароля</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Пожалуйста, установите пароль</translation>
</message>
@@ -2801,32 +3000,32 @@ It is not advisable to use it.</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Вы можете направить людей в файл или каталог, к которому предоставлен доступ, &lt;a href=&quot;private link menu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;передав им личную ссылку&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation>К этому элементу не предоставлен доступ никаким пользователям или группам</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation>Открыть ссылку в браузере</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation>Копировать ссылку в буфер обмена</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Отправить ссылку по email</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>Нет результатов для &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation>Я поделился с тобой</translation>
</message>
@@ -2839,37 +3038,38 @@ It is not advisable to use it.</source>
<translation>Форма</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>TextLabel</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>можно редактировать</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>можно поделиться</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>создать</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>изменить</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>удалить</translation>
</message>
@@ -2913,143 +3113,176 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>Поделиться с %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation>Доступ через контекстное меню</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation>Я поделился с тобой</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation>Поделиться...</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation>Копировать приватную ссылку в буфер обмена...</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation>Отправить приватную ссылку по email...</translation>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation>Повторное предоставление доступа к этому файлу не разрешено</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation>Копировать общую ссылку в буфер обмена</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Открыть в браузере</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation><numerusform>Скачать файл</numerusform><numerusform>Скачать файлы</numerusform><numerusform>Скачать файлы</numerusform><numerusform>Скачать файл(ы)</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Данные сертификата:&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Общее имя (CN):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>Альтернативное имя субъекта:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Организация (О):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Организационное подразделение (OU):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Область/район:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>Страна:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Номер:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Выдан:&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Издатель:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Выдан:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Истекает:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Отпечаток&lt;/ h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;Заметка:&lt;/b&gt; Этот сертификат был одобрен вручную&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (самоподписанный)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>Это соединение зашифровано %1-битным %2.
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation>Нет поддержки для тикетов/идентификаторов SSL сессии</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Информация о TLS-сертификатах:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>Это соединение НЕ безопасно, используется протокол без шифрования.
@@ -3137,305 +3370,270 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Успешно.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>CSync не удалось загрузить файл журнала. Файл журнала повреждён.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;Не удается загрузить плагин 1% для csync.&lt;br/&gt;Проверьте установку!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>Критическая ошибка параметра CSync.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>Процесс обновления CSync не удался.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>Процесс согласования CSync не удался.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync не удалось авторизоваться на прокси сервере.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSync не удалось найти прокси сервер.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync не удалось авторизоваться на сервере %1.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync не удалось подключиться к сети.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>Вышло время ожидания подключения к сети.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>Произошла ошибка передачи HTTP.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation>Смонтированная папка временно недоступна на сервере</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>Произошла ошибка во время открытия папки</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>Произошла ошибка во время чтения папки.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation>%1 (пропущено из-за предыдущей ошибки, повторная попытка через %2)</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>Файл/папка проигнорированы, так как являются скрытыми.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation>Иерархия каталогов слишком глубока</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation>Конфликт: Серверная версия скачана, локальная копия переименована и не закачана.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation>Только %1 доступно, нужно как минимум %2 чтобы начать</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation>Не могу открыть или создать локальную базу данных синхронизации. Удостоверьтесь, что у вас есть доступ на запись в каталог синхронизации.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation>Не разрешается, так как у вас нет полномочий на добавление родительской папки</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation>Не разрешается, так как у вас нет полномочий на добавление файлов в эту папку</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation>Мало места на диске: Скачивания, которые сократят свободное место ниже %1, будут пропущены.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation>На сервере недостаточно места для некоторых закачек.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: Нет свободного пространства на сервере %1.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>Неизвестная ошибка CSync.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Прервано пользователем</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>CSync отказано в доступе</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation>Не удалось загрузить или создать файл журнала. Удостоверьтесь, что у вас есть права на чтение и запись в локальном каталоге синхронизации.</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation>Шаг обнаружения не удался.</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation>Доступ запрещён.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
- <translation>CSync не удалось загрузить файл журнала. Убедитесь в наличии прав на чтение и запись в локальную папку.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
+ <translation>Не найден файл или каталог:</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
- <translation>CSync не выполнен из-за отказа в доступе для необработанного разрешения.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
+ <translation>Попытка создать каталог, который уже существует.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
- <translation>CSync попытался создать папку, которая уже существует.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation>Нет доступного места на сервере %1.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>Сервис временно недоступен</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>Доступ запрещен</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>Произошла внутренняя ошибка номер %1.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>Синхронизация символических ссылок не поддерживается.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>Файл присутствует в списке игнорируемых.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation>Эта файловая система не поддерживает имена файлов, оканчивающиеся на точку.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation>Эта файловая система не поддерживает имена файлов, содержащие символ &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation>Данное имя файла зарезервировано в данной файловой системе.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation>Имя файла содержит пробелы на конце.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>Имя файла слишком длинное.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation>Невозможно перекодировать имя файла для вашей системы.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation>Неразрешённый конфликт.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>Не удалось загрузить статистику.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>Кодировка имени файла не верна</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>Недопустимые символы, пожалуйста, переименуйте &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation>Используются виртуальные файлы, но суффикс не задан</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation>Не удалось прочитать файл чёрного списка из локальной базы данных.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation>Не удалось прочитать из журнала синхронизации.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>Не удаётся открыть журнал синхронизации</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>Имя файла содержит по крайней мере один некорректный символ</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>Игнорируется из-за черного списка в &quot;что синхронизировать&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation>Не разрешается, так как у вас нет полномочий на добавление подпапок в папку.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>Не допускается загрузка этого файла, так как на сервере он помечен только для чтения, восстанавливаем</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>Не допускается удаление, восстанавливаем</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>Локальные файлы и общий каталог удалены.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>Перемещение не допускается, элемент восстановлен</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>Перемещение не допускается, поскольку %1 помечен только для чтения</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>назначение</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>источник</translation>
</message>
@@ -3459,17 +3657,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Версия %1. Для получения дополнительной информации посетите &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Версия %2. Для более подробной информации посетите &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;По поводу известных проблем и помощи, пожалуйста посетите: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;Авторы: Клаас Фрейтаг, Дэниель Молкентен, Оливье Гоффар, Маркус Гётц, Жан-Кристоф Бошар, и другие.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Авторские права принадлежат ownCloud GmbH&lt;/p&gt;&lt;p&gt;Лицензировано под GNU General Public License (GPL) версии 2.0&lt;br/&gt;ownCloud и логотип ownCloud — зарегистрированные торговые марки ownCloud GmbH в Соединённых Штатах, и/или других странах.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation>&lt;p&gt;Все права принадлежат ownCloud GmbH&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;Распространяется %1 и лицензировано под GNU General Public License (GPL) Версии 2.0.&lt;br/&gt;Логотипы %2 и %2 являются зарегистрированной торговой маркой %1 в США и/или других странах.&lt;/p&gt;</translation>
</message>
@@ -3500,81 +3698,81 @@ It is not advisable to use it.</source>
<translation>Пожалуйста войдите в систему</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Каталог %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Нет настроенных каталогов для синхронизации</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Открыть в браузере</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Вход...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Выйти</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Недавние изменения</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Проверка изменений в &apos;%1&apos;</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Управляемые каталоги:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Открыть каталог &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Открыть %1 в браузере</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Неизвестный статус</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Настройки...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Детали...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Помощь</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>Закрыть %1</translation>
</message>
@@ -3589,11 +3787,6 @@ It is not advisable to use it.</source>
<translation>Версия сервера не поддерживается</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation>Сервер для учетной записи %1 использует старую не поддерживаемую версию %2. Использование этого клиента совместно с не поддерживаемым сервером не тестировалось и является потенциально небезопасным. Вы продолжаете на свой страх и риск.</translation>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Отключено</translation>
@@ -3625,116 +3818,129 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation>Синхронизация приостановлена</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation>Неразрешённые конфликты</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation>Ошибка во время синхронизации</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation>Не настроено ни одного каталога для синхронизации</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation>Снять с паузы все папки</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>Поставить на паузу все папки</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>Возобновить все синхронизации</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>Возобновить синхронизацию</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>Приостановить все синхронизации</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>Приостановить синхронизацию</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Выйти из всех учетных записей</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Войти во все учетные записи...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>Новая учётная запись…</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>Про %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>Критическая ошибка!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Недавно ничего не синхронизировалось</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation>Проверяю измененеия в удалённом &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation>Проверяю изменения в локальном &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Синхронизация %1 из %2 (осталось %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation>Синхронизирую %1 из %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Синхронизация %1 (осталось %2)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>Синхронизация %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Актуальная версия</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Версия %2. Для более подробной информации посетите &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;По поводу известных проблем и помощи, пожалуйста посетите: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;Авторы: Клаас Фрейтаг, Дэниель Молкентен, Оливье Гоффар, Маркус Гётц, Жан-Кристоф Бошар, и другие.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Авторские права принадлежат ownCloud GmbH&lt;/p&gt;&lt;p&gt;Лицензировано под GNU General Public License (GPL) версии 2.0&lt;br/&gt;ownCloud и логотип ownCloud — зарегистрированные торговые марки ownCloud GmbH в Соединённых Штатах, и/или других странах.&lt;/p&gt;</translation>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3746,9 +3952,9 @@ It is not advisable to use it.</source>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>TextLabel</translation>
</message>
@@ -3784,11 +3990,22 @@ It is not advisable to use it.</source>
<translation>Спрашивать подтверждение перед синхронизацией вне&amp;шних хранилищ</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Уточнить объекты</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Если выбрать эту настройку, мастер закроется, ничего не синхроризируя. Вы можете использовать кнопку &amp;quot;Добавить папку для синхронизации&amp;quot; из настроек учётной записи, чтобы выбрать, какая пару локального и удалённого каталога нужно синхронизировать&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation>Создать синхронизации папок вруную</translation>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>&amp;Локальный каталог</translation>
@@ -3805,11 +4022,16 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>Синхронизировать всё с сервером</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation>С&amp;инхронизировать с сервера всё (рекомендуется)</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation>Использовать виртуальные файлы вместо немедленного скачивания содержимого (&amp;экспериментальное)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Сообщение о состоянии</translation>
</message>
@@ -3846,8 +4068,8 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
- <translation>В процессе соединения произошла ошибка. Пожалуйста, попробуйте ещё раз.</translation>
+ <source>An error occurred while connecting. Please try again.</source>
+ <translation>Во время соединения произошла ошибка. Пожалуйста попробуйте ещё раз.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="56"/>
@@ -4026,7 +4248,7 @@ It is not advisable to use it.</source>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;Собрано исходников Git версии &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; на %3, %4 используя Qt %5, %6&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4124,52 +4346,52 @@ It is not advisable to use it.</source>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Статус не определён</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Ожидание начала синхронизации</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>Синхронизация запущена</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Синхронизация прошла успешно</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Синхронизация прошла успешно, некоторые файлы были проигнорированы.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Ошибка синхронизации</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Ошибка установки</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Подготовка к синхронизации</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Прерывание...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>Синхронизация приостановлена</translation>
</message>
@@ -4177,22 +4399,22 @@ It is not advisable to use it.</source>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation>Невозможно открыть браузер</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation>При запуске браузера чтобы открыть адрес %1 произошла ошибка. Может быть не настроен браузер по умолчанию?</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation>Не удалось открыть почтового клиента</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation>При запуске почтового клиента для создания нового сообщения произошла ошибка. Возможно, почтовый клиент по умолчанию не настроен?</translation>
</message>
diff --git a/translations/client_sk.ts b/translations/client_sk.ts
index ac2ed2044..703d0e4af 100644
--- a/translations/client_sk.ts
+++ b/translations/client_sk.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="sk_SK" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,17 +95,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Pripojenie expirovalo</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation>Neznáma chyba: odpoveď siete bola odstránená</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation>Server odpovedal &quot;%1 %2&quot; na &quot;%3 %4&quot;</translation>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Zrušiť</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Účet</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Vybrať čo synchronizovať</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Vynútiť synchronizáciu teraz</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>Odstrániť prepojenie priečinka</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Vytvorenie priečinka zlyhalo</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;Nemožno vytvoriť lokálny priečinok &lt;i&gt;%1&lt;/i&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>Potvrdiť odstránenie prepojenia priečinka</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>Odstrániť prepojenie priečinka</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Prebiehajúca synchronizácia</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>Proces synchronizácie práve prebieha.&lt;br/&gt;Chcete ho ukončiť?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 sa používa</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 ako &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>Verzia servera %1 je stará a nepodporovaná. Pokračujte na vlastné nebezpečenstvo.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Pripojené k %1</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>Server %1 je dočasne nedostupný.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>Odhlásený z %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>Žiadne pripojenie k %1 na %2.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Prihlásiť sa</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Potvrďte ostránenie účtu</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Naozaj chcete odstrániť pripojenie k účtu &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Poznámka:&lt;/b&gt; Tým sa &lt;b&gt;nevymažú&lt;/b&gt; žiadne súbory.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Vymazať pripojenie</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Otvoriť priečinok</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Odhlásiť</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Obnoviť synchronizáciu</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Pozastaviť synchronizáciu</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Naozaj si prajete zastaviť synchronizácu priečinka &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Poznámka:&lt;/b&gt; Toto &lt;b&gt;nevymaže&lt;/b&gt; žiadne súbory.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1 (%3%) z %2 je využitých. Niektoré priečinky, vrátane sieťových a zdieľaných, môžu mať iné limity.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%1 z %2 je využitých</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Teraz nie sú k dispozícii žiadne informácie o využití úložiska.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>Žiadne nakonfigurované %1 spojenie</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Odhlásený</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Odpojený</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Pripojené</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Služba nedostupná</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Chyba siete</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Chyba nastavenia</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Neznámy stav účtu</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Aktivita servera</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Záznam synchronizácie</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>Nezosynchronizované</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>Nezosynchronizované (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>Zoznam aktivít servera bol skopírovaný do schránky.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>Zoznam aktivít synchronizácie bol skopírovaný do schránky.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Skopírované do schránky</translation>
</message>
@@ -469,47 +488,47 @@
<translation>Štítok</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Aktivita servera</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Kopírovať</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Skopírovať zoznam aktivít do schránky.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Požaduje sa činnosť: oznámenia</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;Účet %1 nemá zapnuté aktivity.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation type="unfinished"/>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Koniec</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Pokračovať</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation type="unfinished"/>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>Chyba pri zápise metadát do databázy</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>Žiadny účet v ownCloude nie je nastavený</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>Server nakonfigurovaný pre tohto klienta je príliš starý</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Prosím aktualizujte na najnovšiu verziu servera a reštartujte klienta.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Chyba overenia: Používateľské meno alebo heslo nie je správne.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>vypršal časový limit</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>Poskytnuté poverenia nie sú správne</translation>
</message>
@@ -637,131 +681,158 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Zrušené používateľom</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>Lokálny priečinok %1 neexistuje.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 by mal byť priečinok, avšak nie je.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 nie je čitateľný.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 bol zmazaný.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 bol stiahnutý.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 bol aktualizovaný.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 bol premenovaný na %2.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 bol presunutý do %2.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 nemôže byť synchronizovaný kvôli chybe. Pozrite sa do logu pre podrobnosti.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Aktivita synchronizácie</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>Nemožno čítať systémový exclude file</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -769,46 +840,46 @@ If you decide to delete the files, they will be unavailable to you, unless you a
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Odstrániť všetky súbory?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Odstrániť všetky súbory</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Ponechať súbory</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>Záloha je dostupná</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>Bežná synchronizácia</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>Ponechať lokálne súbory ako konfliktné</translation>
</message>
@@ -816,115 +887,105 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>Nemožno resetovať stav priečinka</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>Starý synchronizačný žurnál &apos;%1&apos; nájdený, avšak neodstrániteľný. Prosím uistite sa, že žiadna aplikácia ho práve nevyužíva.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation> (záloha)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation> (záloha %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Nedefinovaný stav.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>Čaká sa na začiatok synchronizácie</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Príprava na synchronizáciu.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>Synchronizácia prebieha.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>Posledná synchronizácia sa úspešne skončila.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>Posledná synchronizácia bola úspešná, ale s varovaniami pre individuálne súbory.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>Posledná synchronizácia sa úspešne skončila.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Chyba pri inštalácii.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Zrušené používateľom.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>Synchronizácia je pozastavená.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Synchronizácia je pozastavená)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>Nebol zvolený platný priečinok.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>Zvolená cesta nie je priečinok.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Nemáte oprávnenia pre zápis do daného priečinka!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -934,7 +995,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>Synchronizujem lokálny priečinok</translation>
</message>
@@ -969,7 +1030,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Odhlásený</translation>
</message>
@@ -984,115 +1045,133 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Kontrolujú sa zmeny v „%1“</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>Synchronizuje sa %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>stiahnuť %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>nahrať %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 of %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 z %2, súbor %3 z %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>súbor %1 z %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>Čakajte...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>Príprava na synchronizáciu...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation type="unfinished"/>
</message>
@@ -1100,17 +1179,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Kliknutím vyberte lokálny priečinok, ktorý chcete synchronizovať.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Zadajte cestu do lokálneho priečinka.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Vyberte zdrojový priečinok</translation>
</message>
@@ -1118,60 +1197,68 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Vytvoriť vzdialený priečinok</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>Zadajte názov nového priečinka, ktorý bude vytvorený v &apos;%1&apos;:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>Priečinok bol úspešne vytvorený na %1.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>Zlyhalo overenie pri pripojení %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>Na %1 zlyhalo vytvorenie priečinka. Skontrolujte to, prosím, ručne.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Zvoľte pre synchronizáciu celého účtu</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Tento priečinok sa už synchronizuje.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Priečinok &lt;i&gt;%1&lt;/i&gt; už synchronizujete a je nadradený priečinku &lt;i&gt;%2&lt;/i&gt;.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Upozornenie:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Upozornenie:&lt;/b&gt; </translation>
</message>
@@ -1179,22 +1266,22 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>Zo servera nebol prijatý E-Tag, skontrolujte proxy/bránu</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>Prijali sme iný E-Tag pre pokračovanie. Skúsim to neskôr znovu.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>Server vrátil nesprávnu hodnotu Content-range</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Spojenie vypršalo</translation>
</message>
@@ -1217,23 +1304,38 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Rozšírené</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation type="unfinished"/>
</message>
@@ -1253,31 +1355,67 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
- <source>S&amp;how crash reporter</source>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>O</translation>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
+ <source>S&amp;how crash reporter</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
+ <location filename="../src/gui/generalsettings.ui" line="53"/>
<source>Updates</source>
<translation>Aktualizácie</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>&amp;Restart &amp;&amp; aktualizácia</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Zrušiť</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1345,34 +1483,34 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Odobrať</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Nemožno otvoriť súbor</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>Nemožno zapísať zmeny do &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Pridať vzor ignorovaného súboru</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Pridať nový vzor ignorovaného súboru:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Táto položka je poskytovaná systémom na &apos;%1&apos; a nesmie byť modifikovaná v tomto zobrazení.</translation>
</message>
@@ -1402,7 +1540,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Priečinok</translation>
</message>
@@ -1417,35 +1555,45 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Kopírovať</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Čas</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Súbor</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1471,36 +1619,48 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Vyčistiť</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Vyčistiť zobrazenie záznamu (logu).</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>&amp;Uložiť</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Uložiť log súbor do súboru na disk pre proces debugovania.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Uložiť súbor so záznamami (log)</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Chyba</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>Nemožno zapísať do záznamového súboru - logu %1</translation>
</message>
@@ -1508,12 +1668,12 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Chyba</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;Súbor &apos;%1&apos;&lt;br/&gt;nesmie byť otvorený pre proces úprav.&lt;/br/&gt;&lt;br/&gt;Systémový záznam (log) &lt;b&gt;nemôže&lt;/b&gt; byť uložený!&lt;/nobr&gt;</translation>
</message>
@@ -1521,27 +1681,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Nová verzia je k dispozícii</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;Je dostupná nová verzia klienta %1.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; je dostupná na stiahnutie. Nainštalovaná verzia je %3.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Preskočiť túto verziu</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Tentoraz preskočiť</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Aktualizovať teraz</translation>
</message>
@@ -1629,27 +1789,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation>Limitovať automaticky</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Hostname (hostiteľské meno) proxy servera</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Používateľské meno pre proxy server</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Heslo pre proxy server</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>HTTP(S) proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>SOCKS5 proxy</translation>
</message>
@@ -1657,23 +1817,23 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>Vytvorený o %1</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>Ukončenie o pár sekúnd...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation>%1 požiadavka zlyhala o %2</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation type="unfinished"/>
@@ -1682,32 +1842,32 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -1715,59 +1875,59 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Pripravená je nová aktualizácia %1</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>Nainštaluje sa nová aktualizácia pre %1. V priebehu aktualizácie
môžu byť vyžadované dodatočné oprávnenia.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>Sťahujem verziu %1. Čakajte prosím...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>Nemôžem stiahnuť aktualizáciu. Kliknite, prosím, na &lt;a href=&apos;%1&apos;&gt;tento odkaz&lt;/a&gt; pre ručné stiahnutie aktualizácie.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Nemôžem skontrolovať dostupnosť aktualizácie.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Kontrolujem aktualizačný server...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>Stav aktualizácie nie je známy: Neboli skontrolované nové aktualizácie.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>Žiadne aktualizácie nie sú k dispozícii. Používate aktuálnu verziu.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Kontrola aktualizácií</translation>
</message>
@@ -1775,43 +1935,43 @@ môžu byť vyžadované dodatočné oprávnenia.</translation>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Pripojiť sa k %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Nastaviť možnosti lokálneho priečinka</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Pripojiť...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1 priečinok &apos;%2&apos; je zosynchronizovaný do lokálneho priečinka &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>Sychronizovať priečinok &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Lokálny synchronizačný priečinok</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1870,15 +2030,20 @@ môžu byť vyžadované dodatočné oprávnenia.</translation>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Pripojiť sa k %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1909,153 +2074,163 @@ Nie je vhodné ju používať.</translation>
<source>&amp;Next &gt;</source>
<translation>&amp;Ďalšia &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Úspešne pripojené k %1: %2 verzie %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Zlyhalo spojenie s %1 o %2:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>Časový limit vypršal pri pokuse o pripojenie k %1 na %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Pokúšam sa o pripojenie k %1 na %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>Overená požiadavka na server bola presmerovaná na &apos;%1&apos;. URL je zlá, server nie je správne nakonfigurovaný.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>Neplatná odpoveď na overenú webdav požiadavku</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>Prístup zamietnutý serverom. Po overení správnych prístupových práv, &lt;a href=&quot;%1&quot;&gt;kliknite sem&lt;/a&gt; a otvorte službu v svojom prezerači.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>Lokálny synchronizačný priečinok %1 už existuje, prebieha jeho nastavovanie pre synchronizáciu.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>Vytváranie lokálneho synchronizačného priečinka %1 ...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>v poriadku</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>neúspešné.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>Nemožno vytvoriť lokálny priečinok %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>Vzdialený priečinok nie je nastavený!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Chyba: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>vytváram priečinok v ownCloude: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>Vzdialený priečinok %1 bol úspešne vytvorený.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>Vzdialený priečinok %1 už existuje. Prebieha jeho pripájanie pre synchronizáciu.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>Vytváranie priečinka skončilo s HTTP chybovým kódom %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>Proces vytvárania vzdialeného priečinka zlyhal, lebo použité prihlasovacie údaje nie sú správne!&lt;br/&gt;Prosím skontrolujte si vaše údaje a skúste to znovu.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Vytvorenie vzdialeného priečinka pravdepodobne zlyhalo kvôli nesprávnym prihlasovacím údajom.&lt;/font&gt;&lt;br/&gt;Prosím choďte späť a skontrolujte ich.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>Vytvorenie vzdialeného priečinka %1 zlyhalo s chybou &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>Synchronizačné spojenie z %1 do vzdialeného priečinka %2 bolo práve nastavené.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Úspešne pripojené s %1!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>Pripojenie k %1 nemohlo byť iniciované. Prosím skontrolujte to znovu.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Premenovanie priečinka zlyhalo</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>Nemožno odstrániť a zazálohovať priečinok, pretože priečinok alebo súbor je otvorený v inom programe. Prosím zatvorte priečinok nebo súbor a skúste to znovu alebo zrušte akciu.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Lokálny synchronizačný priečinok %1 bol úspešne vytvorený!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2063,14 +2238,31 @@ Nie je vhodné ju používať.</translation>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>%1 Asistent pripojenia</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Preskočiť konfiguráciu priečinkov</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2094,7 +2286,7 @@ Nie je vhodné ju používať.</translation>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>Neplatná JSON odpoveď z URL adresy</translation>
</message>
@@ -2102,7 +2294,7 @@ Nie je vhodné ju používať.</translation>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>Chyba pri zápise metadát do databázy</translation>
</message>
@@ -2110,47 +2302,47 @@ Nie je vhodné ju používať.</translation>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>Súbor %1 nie je možné stiahnuť, pretože súbor s rovnakým menom už existuje!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>Súbor bol vymazaný zo servera</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>Súbor sa nedá stiahnuť úplne.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>Súbor %1 nie je možné uložiť, pretože jeho názov koliduje s názvom lokálneho súboru!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>Súbor sa medzitým zmenil</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>Chyba pri zápise metadát do databázy</translation>
</message>
@@ -2158,12 +2350,12 @@ Nie je vhodné ju používať.</translation>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; Obnovenie zlyhalo: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation type="unfinished"/>
</message>
@@ -2171,22 +2363,22 @@ Nie je vhodné ju používať.</translation>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>Pozor, možná kolízia z dôvodu veľkosti písmen s %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>nemožno vytvoriť priečinok %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>Chyba pri zápise metadát do databázy</translation>
</message>
@@ -2194,17 +2386,17 @@ Nie je vhodné ju používať.</translation>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>Chyba pri odstraňovaní &apos;%1&apos;: %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>Nemožno odstrániť %1 z dôvodu kolízie názvu súboru s lokálnym súborom</translation>
</message>
@@ -2212,13 +2404,13 @@ Nie je vhodné ju používať.</translation>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>Súbor %1 nemôže byť premenovaný na %2 z dôvodu, že tento názov je už použitý</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>Chyba pri zápise metadát do databázy</translation>
</message>
@@ -2226,12 +2418,7 @@ Nie je vhodné ju používať.</translation>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>Súbor bol odobratý zo zdieľania len na čítanie. Súbor bol obnovený.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>Server vrátil neplatný HTTP kód. Očakávaný bol 204, ale vrátený bol &quot;%1 %2&quot;.</translation>
</message>
@@ -2239,12 +2426,12 @@ Nie je vhodné ju používať.</translation>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Server vrátil neplatný HTTP kód. Očakávaný bol 201, ale vrátený bol &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>Chyba pri zápise metadát do databázy</translation>
</message>
@@ -2252,28 +2439,13 @@ Nie je vhodné ju používať.</translation>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Tento priečinok nemôže byť premenovaný. Prosím, vráťte mu pôvodné meno.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Tento priečinok nemôže byť premenovaný. Prosím, vráťte mu meno Shared.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>Súbor bol premenovaný, ale je súčasťou zdieľania len na čítanie. Pôvodný súbor bol obnovený.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Server vrátil neplatný HTTP kód. Očakávaný bol 201, ale vrátený bol &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>Chyba pri zápise metadát do databázy</translation>
</message>
@@ -2281,33 +2453,33 @@ Nie je vhodné ju používať.</translation>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Súbor zmazaný</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>Lokálny súbor bol zmenený počas synchronizácie. Bude obnovený.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>Lokálny súbor bol zmenený počas synchronizácie.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>Chyba pri zápise metadát do databázy</translation>
</message>
@@ -2315,27 +2487,27 @@ Nie je vhodné ju používať.</translation>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>Lokálny súbor bol odstránený počas synchronizácie.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>Lokálny súbor bol zmenený počas synchronizácie.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation type="unfinished"/>
</message>
@@ -2343,27 +2515,22 @@ Nie je vhodné ju používať.</translation>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>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.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>Chýba URL adresa</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>Lokálny súbor bol odstránený počas synchronizácie.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>Lokálny súbor bol zmenený počas synchronizácie.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation type="unfinished"/>
</message>
@@ -2381,42 +2548,47 @@ Nie je vhodné ju používať.</translation>
<translation>Štítok</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Otvoriť v prehliadači</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Čas</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Súbor</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Priečinok</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Akcia</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Veľkosť</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>Lokálny protokol synchronizácie</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Kopírovať</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Skopírovať zoznam aktivít do schránky.</translation>
</message>
@@ -2457,7 +2629,7 @@ Nie je vhodné ju používať.</translation>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Vybrať čo synchronizovať</translation>
</message>
@@ -2465,33 +2637,33 @@ Nie je vhodné ju používať.</translation>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Nahrávam...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Názov</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Veľkosť</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>Na serveri teraz nie sú žiadne podpriečinky.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation type="unfinished"/>
</message>
@@ -2512,22 +2684,22 @@ Nie je vhodné ju používať.</translation>
<translation>Nastavenia</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Aktivita</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Všeobecné</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Sieť</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Účet</translation>
</message>
@@ -2535,28 +2707,28 @@ Nie je vhodné ju používať.</translation>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Aktivita</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Všeobecné</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Sieť</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Účet</translation>
</message>
@@ -2584,42 +2756,42 @@ Nie je vhodné ju používať.</translation>
<translation>ownCloud cesta:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>%1 zdieľanie</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Priečinok: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Tento súbor nemožno zdieľať, lebo bol vyzdieľaný bez možnosti ďalšieho zdieľania.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation type="unfinished"/>
</message>
@@ -2632,7 +2804,17 @@ Nie je vhodné ju používať.</translation>
<translation>Zdieľať NewDocument.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>Štítok</translation>
</message>
@@ -2662,19 +2844,24 @@ Nie je vhodné ju používať.</translation>
<translation>Nastaviť heslo</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Povoliť úpravy</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2682,95 +2869,95 @@ Nie je vhodné ju používať.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>Ch&amp;rániť heslom</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Chránené heslom</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Tento súbor nemožno zdieľať, lebo bol vyzdieľaný bez možnosti ďalšieho zdieľania.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Zmazať</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Odoslať odkaz emailom</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Zrušiť</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>Verejné z&amp;dieľanie vyžaduje heslo</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Prosím nastavte si heslo</translation>
</message>
@@ -2793,32 +2980,32 @@ Nie je vhodné ju používať.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Odoslať odkaz emailom</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
@@ -2831,37 +3018,38 @@ Nie je vhodné ju používať.</translation>
<translation>Formulár</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>Štítok</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>môže upraviť</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>môže zdieľať</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>vytvoriť</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>zmeniť</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>vymazať</translation>
</message>
@@ -2905,143 +3093,176 @@ Nie je vhodné ju používať.</translation>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>Zdieľať s %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Otvoriť v prehliadači</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Podrobnosti certifikátu&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Bežné meno (CN):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>Alternatívne meno subjektu:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Organizácia (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Organizačná jednotka (OU):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Štát/Provincia:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>Krajina:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Sériové číslo:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Vydavateľ&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Vydavateľ:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Vydané:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Platí do:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Odtlačky&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;Poznámka:&lt;/b&gt; Tento certifikát bol ručne schválený&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (podpísaný sám sebou)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>Toto spojenie je šifrované pomocou %1 bitovej šifry %2.
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Informácie o certifikáte:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>Toto spojenie NIE JE bezpečné, pretože nie je šifrované.
@@ -3129,305 +3350,270 @@ Nie je vhodné ju používať.</translation>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Úspech.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>Nepodarilo sa načítanie žurnálovacieho súboru CSync. Súbor je poškodený.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;%1 zásuvný modul pre &quot;CSync&quot; nebolo možné načítať.&lt;br/&gt;Prosím skontrolujte inštaláciu!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>CSync kritická chyba parametrov.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>CSync sa nepodarilo spracovať krok aktualizácie.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>CSync sa nepodarilo spracovať krok zladenia.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync sa nemohol prihlásiť k proxy.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSync sa nepodarilo nájsť proxy alebo server.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync sa nepodarilo prihlásiť na server %1.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync sa nepodarilo pripojiť k sieti.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>Skončil časový limit sieťového spojenia.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>Chyba HTTP prenosu.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>Nastala chyba počas otvárania priečinka</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>Chyba pri čítaní adresára</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: Na serveri %1 nie je žiadne voľné miesto.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>CSync nešpecifikovaná chyba.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Zrušené používateľom</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>Prístup pre CSync zlyhal</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>Služba je dočasne nedostupná</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>Prístup odmietnutý</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>Vyskytla sa interná chyba číslo %1.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>Symbolické odkazy nie sú podporované pri synchronizácii.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>Súbor je zapísaný na zozname ignorovaných.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>Meno súboru je veľmi dlhé.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>Kódovanie znakov názvu súboru je neplatné</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>Neplatné znaky, premenujte prosím &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation>Nemožno čítať zo synchronizačného žurnálu</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>Nemožno otvoriť sync žurnál</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>Názov súboru obsahuje nevhodný znak</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>Ignorované podľa nastavenia &quot;vybrať čo synchronizovať&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation>Nie je dovolené, lebo nemáte oprávnenie pridávať podpriečinky do tohto priečinka</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>Nie je dovolené tento súbor nahrať, pretože je na serveri iba na čítanie. Obnovuje sa.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>Nie je dovolené odstrániť. Obnovuje sa.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>Lokálne súbory a zdieľaný priečinok boli odstránené.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>Presunutie nie je dovolené. Položka obnovená.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>Presunutie nie je dovolené, pretože %1 je na serveri iba na čítanie</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>cieľ</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>zdroj</translation>
</message>
@@ -3451,17 +3637,17 @@ Nie je vhodné ju používať.</translation>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Verzia %1. Pre viac informácií choďte na &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;Šíri %1 pod licenciou GNU General Public License (GPL) Verzia 2.0.&lt;br/&gt;%2 a %2 logo sú registrované známky %1 v USA, ostatných krajinách, alebo oboje.&lt;/p&gt;</translation>
</message>
@@ -3492,81 +3678,81 @@ Nie je vhodné ju používať.</translation>
<translation>Prihláste sa prosím</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Priečinok %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Nie sú nastavené žiadne priečinky na synchronizáciu.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Otvoriť v prehliadači</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Prihlásiť sa...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Odhlásiť</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Nedávne zmeny</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Kontrolujú sa zmeny v „%1“</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Spravované priečinky:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Otvoriť priečinok &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Otvoriť %1 v prehliadači</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Neznámy stav</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Nastavenia...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Podrobnosti...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Pomoc</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>Ukončiť %1</translation>
</message>
@@ -3581,11 +3767,6 @@ Nie je vhodné ju používať.</translation>
<translation>Nepodporovaná verzia servera</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Odpojený</translation>
@@ -3617,116 +3798,129 @@ Nie je vhodné ju používať.</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation>Zrušiť pozastavenie všetkých priečinkov</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>Pozastaviť všetky priečinky</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>Zrušiť pozastavenie všetkej synchronizácie</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>Zrušiť pozastavenie synchronizácie</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>Pozastaviť všetku synchronizáciu</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>Pozastaviť synchronizáciu</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Odhlásiť sa zo všetkých účtov</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Prihlásiť sa do všetkých účtov...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>O %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>Zlyhanie</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Žiadne nedávno synchronizované položky</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Synchronizuje sa %1 z %2 (zostáva %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Synchronizuje sa %1 (zostáva %2)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>Synchronizuje sa %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Až do dnešného dňa</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation type="unfinished"/>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3738,9 +3932,9 @@ Nie je vhodné ju používať.</translation>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>Štítok</translation>
</message>
@@ -3776,11 +3970,22 @@ Nie je vhodné ju používať.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Vybrať čo synchronizovať</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>&amp;Lokálny priečinok</translation>
@@ -3797,11 +4002,16 @@ Nie je vhodné ju používať.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>S&amp;ynchronizovať zo servera všetko</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Správa o stave</translation>
</message>
@@ -3838,7 +4048,7 @@ Nie je vhodné ju používať.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
+ <source>An error occurred while connecting. Please try again.</source>
<translation type="unfinished"/>
</message>
<message>
@@ -3910,12 +4120,12 @@ Nie je vhodné ju používať.</translation>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="438"/>
<source>%n day(s) ago</source>
- <translation><numerusform>pred %n dňom</numerusform><numerusform>pred %n dňami</numerusform><numerusform>pred %n dňami</numerusform></translation>
+ <translation><numerusform>pred %n dňom</numerusform><numerusform>pred %n dňami</numerusform><numerusform>pred %n dňami</numerusform><numerusform>pred %n dňami</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="446"/>
<source>%n hour(s) ago</source>
- <translation><numerusform>pred %n hodinou</numerusform><numerusform>pred %n hodinami</numerusform><numerusform>pred %n hodinami</numerusform></translation>
+ <translation><numerusform>pred %n hodinou</numerusform><numerusform>pred %n hodinami</numerusform><numerusform>pred %n hodinami</numerusform><numerusform>pred %n hodinami</numerusform></translation>
</message>
<message>
<location filename="../src/common/utility.cpp" line="451"/>
@@ -3930,7 +4140,7 @@ Nie je vhodné ju používať.</translation>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="456"/>
<source>%n minute(s) ago</source>
- <translation><numerusform>pred %n minútou</numerusform><numerusform>pred %n minútami</numerusform><numerusform>pred %n minútami</numerusform></translation>
+ <translation><numerusform>pred %n minútou</numerusform><numerusform>pred %n minútami</numerusform><numerusform>pred %n minútami</numerusform><numerusform>pred %n minútami</numerusform></translation>
</message>
<message>
<location filename="../src/common/utility.cpp" line="459"/>
@@ -3969,32 +4179,32 @@ Nie je vhodné ju používať.</translation>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="310"/>
<source>%n year(s)</source>
- <translation><numerusform>%n rok</numerusform><numerusform>%n roky</numerusform><numerusform>%n rokov</numerusform></translation>
+ <translation><numerusform>%n rok</numerusform><numerusform>%n roky</numerusform><numerusform>%n rokov</numerusform><numerusform>%n rokov</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="311"/>
<source>%n month(s)</source>
- <translation><numerusform>%n mesiac</numerusform><numerusform>%n mesiace</numerusform><numerusform>%n mesiacov</numerusform></translation>
+ <translation><numerusform>%n mesiac</numerusform><numerusform>%n mesiace</numerusform><numerusform>%n mesiacov</numerusform><numerusform>%n mesiacov</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="312"/>
<source>%n day(s)</source>
- <translation><numerusform>%n deň</numerusform><numerusform>%n dni</numerusform><numerusform>%n dní</numerusform></translation>
+ <translation><numerusform>%n deň</numerusform><numerusform>%n dni</numerusform><numerusform>%n dní</numerusform><numerusform>%n dní</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="313"/>
<source>%n hour(s)</source>
- <translation><numerusform>%n hodina</numerusform><numerusform>%n hodiny</numerusform><numerusform>%n hodín</numerusform></translation>
+ <translation><numerusform>%n hodina</numerusform><numerusform>%n hodiny</numerusform><numerusform>%n hodín</numerusform><numerusform>%n hodín</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="314"/>
<source>%n minute(s)</source>
- <translation><numerusform>%n minúta</numerusform><numerusform>%n minúty</numerusform><numerusform>%n minút</numerusform></translation>
+ <translation><numerusform>%n minúta</numerusform><numerusform>%n minúty</numerusform><numerusform>%n minút</numerusform><numerusform>%n minút</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="315"/>
<source>%n second(s)</source>
- <translation><numerusform>%n sekunda</numerusform><numerusform>%n sekundy</numerusform><numerusform>%n sekúnd</numerusform></translation>
+ <translation><numerusform>%n sekunda</numerusform><numerusform>%n sekundy</numerusform><numerusform>%n sekúnd</numerusform><numerusform>%n sekúnd</numerusform></translation>
</message>
<message>
<location filename="../src/common/utility.cpp" line="339"/>
@@ -4018,7 +4228,7 @@ Nie je vhodné ju používať.</translation>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;Zostavené z Git revízie &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; na %3, %4 s použitím Qt %5, %6&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4116,52 +4326,52 @@ Nie je vhodné ju používať.</translation>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Nedefinovaný status</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Čakanie na začiatok synchronizácie</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>Prebieha synchronizácia</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Úspešná synchronizácia</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Synchronizácia prebehla úspešne, niektoré súbory boli ignorované.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Chyba synchronizácie</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Chyba inštalácie</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Príprava na synchronizáciu</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Ruším...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>Synchronizácia je pozastavená</translation>
</message>
@@ -4169,22 +4379,22 @@ Nie je vhodné ju používať.</translation>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation type="unfinished"/>
</message>
diff --git a/translations/client_sl.ts b/translations/client_sl.ts
index 52657ec18..7d5cea1b0 100644
--- a/translations/client_sl.ts
+++ b/translations/client_sl.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="sl" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation>V smeteh ni mogoče ustvarjati imenikov</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation>Premik &apos;%1&apos; v &apos;%2&apos; ni mogoč</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation>Na tej platformi premik v smeti ni implementiran</translation>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,19 +95,19 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Povezava je časovno potekla</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation>Neznana napaka: odziv strežnika je bil izbrisan</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
- <translation type="unfinished"/>
+ <translation>Strežnik je odgovoril &quot;%1 %2&quot; v &quot;%3 %4&quot;</translation>
</message>
</context>
<context>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Prekliči</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Račun</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Izbor predmetov za usklajevanje</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Vsili takojšnje usklajevanje</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>Ponovno zaženi usklajevanje</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>Odstrani povezavo mape usklajevanja</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Ustvarjanje mape je spodletelo</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;Ni mogoče ustvariti krajevne mape &lt;i&gt;%1&lt;/i&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>Potrdi odstranjevanje povezave usklajevanja mape</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>Odstrani povezavo usklajevanja mape</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Usklajevanje je v teku</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>Izvaja se usklajevanje.&lt;br/&gt;Ali želite opravilo prekiniti?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 v uporabi</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 kot &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>Različica strežnika %1 je zastarela in ni več podprta! Nadaljujete na lastno odgovornost.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Povezano z %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>Strežnik %1 trenutno ni dosegljiv.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
- <translation type="unfinished"/>
+ <translation>Strežnik %1 je trenutno v vzdrževalnem načinu.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>Uspešno odjavljeno iz %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
- <translation type="unfinished"/>
+ <translation>Pridobivam pooblastilo brskalnika. &lt;a href=&apos;%1&apos;&gt;Kliknite&lt;/a&gt; za ponovno odprtje brskalnika.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation>Poteka vzpostavljanje povezave s strežnikom %1 ...</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>Ni povezave z %1 pri %2.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Prijava</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>Zaznane so mape, ki zaradi omejitve velikosti niso bile usklajene: </translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>Zaznane so mape, ki zaradi pripadnosti zunanji shrambi niso bile usklajene: </translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation>Zaznane so mape, ki zaradi omejitve velikosti ali pripadnosti zunanji shrambi niso bile usklajene: </translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Potrdi odstranitev računa</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Ali res želite odstraniti povezavo z računom &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Opomba:&lt;/b&gt; S tem &lt;b&gt;ne bo&lt;/b&gt; izbrisana nobena datoteka.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Odstrani povezavo</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Odpri mapo</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Odjava</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Nadaljuj z usklajevanjem</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Premor usklajevanja</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Ali res želite zaustaviti usklajevanje mape &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Opomba:&lt;/b&gt; s tem datoteke iz odjemalca &lt;b&gt;ne bodo&lt;/b&gt; odstranjene.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1 (%3%) od %2 v uporabi. Nekatere mape, vključno s priklopljenimi mapami in mapami v souporabi, imajo morda različne omejitve.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%1 od %2 v uporabi</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Trenutno ni na voljo nobenih podatkov o porabi prostora.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>Ni nastavljene povezave %1.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Odjavljeno</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Brez povezave</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Povezano</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Storitev ni na voljo</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
- <translation type="unfinished"/>
+ <translation>Vzdrževalni način</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Omrežna napaka</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Napaka nastavitve</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation>Zahteva po poverilih</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Neznano stanje računa</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Dejavnost strežnika</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Protokol usklajevanja</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>Ni usklajeno</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>Ni usklajeno (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>Seznam opravil strežnika je kopiran v odložišče.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>Seznam opravil usklajevanja je kopiran v odložišče.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>Seznam neusklajenih predmetov je kopiran v odložišče.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Kopirano v odložišče</translation>
</message>
@@ -469,47 +488,47 @@
<translation>Besedilna oznaka</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Dejavnosti strežnika</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Kopiraj</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Kopiraj seznam opravil v odložišče.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Zahtevano je dejanje: obvestila</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;Za račun %1 možnosti opravil niso omogočene.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation><numerusform>Prejeli ste %n novo obvestilo od %2.</numerusform><numerusform>Prejeli ste %n novi obvestili od %2.</numerusform><numerusform>Prejeli ste %n nova obvestila od %2.</numerusform><numerusform>Prejeli ste %n novih obvestil od %2.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation><numerusform>Prejeli ste %n novo obvestilo od %1 in %2.</numerusform><numerusform>Prejeli ste %n novi obvestili od %1 in %2.</numerusform><numerusform>Prejeli ste %n nova obvestila od %1 in %2.</numerusform><numerusform>Prejeli ste %n novih obvestil od %1 in %2.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>Prejeli ste nova obvestila prek %1, %2 in drugih računov.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>%1 obvestil ‒ zahtevajo odziv</translation>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Končaj</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Nadaljuj</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation>Napaka dostopa do nastavitvene datoteke</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation>Med dostopom do nastavitvene datoteke na %1 je prišlo do napake.</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>Končaj ownCloud</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>Napaka zapisovanja metapodatkov v podatkovno zbirko</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>Ni nastavljenega računa v oblaku ownCloud</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>Nastavljen strežnik tega odjemalca je prestar.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Posodobite strežnik in ponovno zaženite odjemalca.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Napaka overitve: uporabniško ime ali geslo je napačno.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>časovni zamik</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>Podana poverila niso pravilna.</translation>
</message>
@@ -637,133 +681,160 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Opravilo je bilo prekinjeno s strani uporabnika</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>Krajevna mapa %1 ne obstaja.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 bi morala biti mapa, pa ni.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 ni mogoče brati.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>Datoteka %1 je odstranjena.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>Datoteka %1 je prejeta.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>Datoteka %1 je posodobljena.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>Datoteka %1 je preimenovana v %2.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>Datoteka %1 je premaknjena v %2.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation><numerusform>Datoteka %1 in še %n druga datoteka je bila izbrisana.</numerusform><numerusform>Datoteka %1 in še %n drugi datoteki sta bili izbrisani.</numerusform><numerusform>Datoteka %1 in še %n druge datoteke so bile izbrisane.</numerusform><numerusform>Datoteka %1 in še %n drugih datotek je bilo izbrisanih.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation><numerusform>Datoteka %1 in še %n druga datoteka je bila shranjena na disk.</numerusform><numerusform>Datoteka %1 in še %n drugi datoteki sta bili shranjeni na disk.</numerusform><numerusform>Datoteka %1 in še %n druge datoteke so bile shranjene na disk.</numerusform><numerusform>Datoteka %1 in še %n drugih datotek je bilo shranjenih na disk.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation><numerusform>Datoteka %1 in še %n druga datoteka je bila posodobljena.</numerusform><numerusform>Datoteka %1 in še %n drugi datoteki sta bili posodobljeni.</numerusform><numerusform>Datoteka %1 in še %n druge datoteke so bile posodobljene.</numerusform><numerusform>Datoteka %1 in še %n drugih datotek je bilo posodobljenih.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation><numerusform>Datoteka %1 je bila preimenovana v %2 in še %n druga datoteka je bila preimenovana.</numerusform><numerusform>Datoteka %1 je bila preimenovana v %2 in še %n drugi datoteki sta bili preimenovani.</numerusform><numerusform>Datoteka %1 je bila preimenovana v %2 in še %n druge datoteke so bile preimenovane.</numerusform><numerusform>Datoteka %1 je bila preimenovana v %2 in še %n drugih datotek je bilo preimenovanih.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation><numerusform>Datoteka %1 je bila premaknjena v %2 in še %n druga datoteka je bila premaknjena.</numerusform><numerusform>Datoteka %1 je bila premaknjena v %2 in še %n drugi datoteki sta bili premaknjeni.</numerusform><numerusform>Datoteka %1 je bila premaknjena v %2 in še %n druge datoteke so bile premaknjene.</numerusform><numerusform>Datoteka %1 je bila premaknjena v %2 in še %n drugih datotek je bilo premaknjenih.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation><numerusform>Pri datoteki %1 in še %n drugi datoteki je zaznan spor usklajevanja.</numerusform><numerusform>Pri datoteki %1 in še %n drugih datotekah je zaznan spor usklajevanja.</numerusform><numerusform>Pri datoteki %1 in še %n drugih datotekah je zaznan spor usklajevanja.</numerusform><numerusform>Pri datoteki %1 in še %n drugih datotekah je zaznan spor usklajevanja.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation>Pri datoteki %1 je zaznan spor usklajevanja. Preverite datoteko!</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation><numerusform>Datoteke %1 in še %n druge datoteke ni mogoče uskladiti zaradi napak. Podrobnosti so zapisane v dnevniški datoteki.</numerusform><numerusform>Datoteke %1 in še %n drugih datotek ni mogoče uskladiti zaradi napak. Podrobnosti so zapisane v dnevniški datoteki.</numerusform><numerusform>Datoteke %1 in še %n drugih datotek ni mogoče uskladiti zaradi napak. Podrobnosti so zapisane v dnevniški datoteki.</numerusform><numerusform>Datoteke %1 in še %n drugih datotek ni mogoče uskladiti zaradi napak. Podrobnosti so zapisane v dnevniški datoteki.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>Datoteke %1 zaradi napake ni mogoče uskladiti. Več podrobnosti je zabeleženih v dnevniški datoteki.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Dejavnost usklajevanja</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>Ni mogoče prebrati sistemske izločitvene datoteke</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation>Dodana je nova mapa, ki presega %1 MB: %2.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation>Dodana je mapa iz zunanje shrambe.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation>Med nastavitvami jo lahko izberete in označite za prejem.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -774,7 +845,7 @@ V kolikor se odločite te datoteke ohraniti, in so na voljo ustrezna dovoljenja,
Nasprotno, če potrdite izbris in niste lastnik datotek, te ne bodo več na voljo.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
@@ -783,22 +854,22 @@ Ali ste prepričani, da želite posodobiti spremembe s strežnikom?
Če je prišlo do napake in se odločite datoteke ohraniti, bodo te ponovno usklajene s strežnika.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Ali naj bodo odstranjene vse datoteke?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Odstrani vse datoteke</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Ohrani datoteke</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
@@ -807,17 +878,17 @@ To se lahko zgodi, če je na strežniku na primer obnovljena varnostna kopija.
Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi različicami. Ali želite ohraniti trenutne krajevne datoteke kot preimenovane datoteke v usklajevalnem sporu?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>Varnostna kopija je zaznana</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>Običajno usklajevanje</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>Ohrani krajevne datoteke kot datoteke v sporu</translation>
</message>
@@ -825,115 +896,105 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>Ni mogoče ponastaviti stanja mape</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>Obstaja starejši dnevnik usklajevanja &apos;%1&apos;, vendar ga ni mogoče odstraniti. Preverite, ali je datoteka v uporabi.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation>(varnostna kopija)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation>(varnostna kopija %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Nedoločeno stanje.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>Čakanje začetek usklajevanja</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Poteka priprava za usklajevanje.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>Usklajevanje je v teku.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>Zadnje usklajevanje je bilo uspešno končano.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>Zadnje usklajevanje je bilo sicer uspešno, vendar z opozorili za posamezne datoteke.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>Zadnje usklajevanje je bilo uspešno končano.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Napaka nastavitve.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Uporabniška prekinitev.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>Usklajevanje je začasno v premoru.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (usklajevanje je v premoru)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>Ni izbrane veljavne mape!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>Izbrana pot ni mapa!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Ni ustreznih dovoljenj za pisanje v izbrano mapo!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation>Krajevna mapa %1 vsebuje simbolno povezavo. Ciljno mesto povezave že vključuje mapo, ki se usklajuje. Izbrati je treba drugo.</translation>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation>Za to krajevno pot je že ustvarjeno mesto za usklajevanje. Izbrati je treba drugo.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Krajevna mapa %1 že vključuje mapo, ki je določena za usklajevanje. Izbrati je treba drugo.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Krajevna mapa %1 je že v določena za usklajevanje. Izbrati je treba drugo.</translation>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation>Krajevna mapa %1 je simbolna povezava. Cilj povezave že vsebuje mapo, ki je uporabljena pri povezavi usklajevanja mape. Izberite drugo.</translation>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -943,7 +1004,7 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi
<translation>Dodaj povezavo za usklajevanje mape</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>Poteka usklajevanje s krajevno mapo</translation>
</message>
@@ -978,7 +1039,7 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi
<translation>Prišlo je do napake med nalaganjem datotek s strežnika.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Odjavljeno</translation>
</message>
@@ -993,115 +1054,133 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Preverjanje za spremembe v &apos;%1&apos;</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>Usklajevanje %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>,</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>prejemanje %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>pošiljanje %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 od %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>Preostalo še %5, %1 od %2, datoteka %3 od %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 od %2, datoteka %3 od %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>datoteka %1 od %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>Čakanje na povezavo ...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>V pripravi je %n druga map ...</numerusform><numerusform>V pripravi sta %n drugi mapi ...</numerusform><numerusform>V pripravi so %n druge mape ...</numerusform><numerusform>V pripravi je %n drugih map ...</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>Priprava na usklajevanje ...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>Dodaj povezavo za usklajevanje mape</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>Dodaj povezavo za usklajevanje</translation>
</message>
@@ -1109,17 +1188,17 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Kliknite za izbor krajevne mape za usklajevanje.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Vpišite pot do krajevne mape.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Izbor izvorne mape</translation>
</message>
@@ -1127,60 +1206,68 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Ustvari oddaljeno mapo</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>Vnesite ime nove mape, ki bo ustvarjena kot podrejena &apos;%1&apos;:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>Mapa je uspešno ustvarjena na %1.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>Overitev dostopa do %1 je spodletela.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>Ustvarjanje mape na %1 je spodletelo. Morda jo je mogoče ustvariti ročno.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>Napaka izpisovanja datotek mape. Napaka: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Izberite možnost za usklajevanje celotnega računa.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Ta mapa je že določena za usklajevanje.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Datoteke se že usklajujejo na ravni mape &lt;i&gt;%1&lt;/i&gt;, ki je nadrejena mapi &lt;i&gt;%2&lt;/i&gt;.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Opozorilo:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Opozorilo:&lt;/b&gt;</translation>
</message>
@@ -1188,22 +1275,22 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>Ni prejete oznake s strežnika. Preveriti je treba podatke posredovalnega strežnika ali prehoda.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>Prejeta je različna oznaka za nadaljevanje opravila. Ponovni poskus bo izveden kasneje.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>Odziv strežnika kaže na neveljaven obseg vsebine</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Povezava je časovno potekla</translation>
</message>
@@ -1226,23 +1313,38 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi
<translation>V sistemsko vrstico</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Napredne možnosti</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation>Vprašaj za potrditev pred usklajevanjem map, večjih kot</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation>Vprašaj za potrditev pred usklajevanjem zunanjih shramb</translation>
</message>
@@ -1262,31 +1364,67 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi
<translation>Uporabi &amp;črno-bele ikone</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>Uredi &amp;prezrte datoteke</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>Pokaži &amp;poročilo sesutja</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>O programu...</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>Posodobitve</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>&amp;Ponovno zaženi &amp;&amp; posodobi</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Prekliči</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1354,7 +1492,7 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi
<translation>Odstrani</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1363,27 +1501,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
Predmeti na mestu, kjer je brisanje dovoljeno, bodo izbisani, v kolikor zaradi njih brisanje mape ni mogoče. Možnost je uporabna pri metapodatkih.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Datoteke ni mogoče odpreti</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>Ni mogoče zapisati sprememb v &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Dodaj vzorec za izpuščanje</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Dodaj nov vzorec za izpuščanje:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Ta vnos je ponujen pri &apos;%1&apos; in ga v tem pogledu ni mogoče spreminjati.</translation>
</message>
@@ -1413,7 +1551,7 @@ Predmeti na mestu, kjer je brisanje dovoljeno, bodo izbisani, v kolikor zaradi n
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Mapa</translation>
</message>
@@ -1428,35 +1566,45 @@ Predmeti na mestu, kjer je brisanje dovoljeno, bodo izbisani, v kolikor zaradi n
<translation>Pokaži prezrte datoteke</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation>Kopiraj seznam napak v odložišče.</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Kopiraj</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Čas</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Datoteka</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation>Napaka</translation>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1482,36 +1630,48 @@ Predmeti na mestu, kjer je brisanje dovoljeno, bodo izbisani, v kolikor zaradi n
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Počisti</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Počisti izpis dnevnika.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>S&amp;hrani</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Shrani dnevniško datoteko na disk za nadaljnje razhroščevanje.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Shrani dnevniško datoteko</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Napaka</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>Ni mogoče pisati v dnevniško datoteko %1</translation>
</message>
@@ -1519,12 +1679,12 @@ Predmeti na mestu, kjer je brisanje dovoljeno, bodo izbisani, v kolikor zaradi n
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Napaka</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;Datoteke &apos;%1&apos;&lt;br/&gt;ni mogoče odpreti za pisanje.&lt;br/&gt;&lt;br/&gt;Dnevniškega zapisa &lt;b&gt;ni mogoče&lt;/b&gt; shraniti!&lt;/nobr&gt;</translation>
</message>
@@ -1532,27 +1692,27 @@ Predmeti na mestu, kjer je brisanje dovoljeno, bodo izbisani, v kolikor zaradi n
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Na voljo je novejša različica</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;Na voljo je nova različica odjemalca %1.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; je na voljo za prejem. Trenutno je nameščena različica %3.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Preskoči to različico</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Posodobitev tokrat preskoči</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Pridobi posodobitve</translation>
</message>
@@ -1640,27 +1800,27 @@ Predmeti na mestu, kjer je brisanje dovoljeno, bodo izbisani, v kolikor zaradi n
<translation>Samodejno omeji</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Ime gostitelja posredniškega strežnika</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Uporabniško ime za posredniški strežnik</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Geslo za posredniški strežnik</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>Posredniški strežnik HTTP(S)</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>Posredniški strežnik SOCKS5</translation>
</message>
@@ -1668,23 +1828,23 @@ Predmeti na mestu, kjer je brisanje dovoljeno, bodo izbisani, v kolikor zaradi n
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>Ustvarjeno ob %1$s</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>V nekaj sekundah bo izvedeno zapiranje ...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation>%1 zahteva spodletela na %2</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation>&apos;%1&apos; izbrano na %2</translation>
@@ -1693,32 +1853,32 @@ Predmeti na mestu, kjer je brisanje dovoljeno, bodo izbisani, v kolikor zaradi n
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -1726,59 +1886,59 @@ Predmeti na mestu, kjer je brisanje dovoljeno, bodo izbisani, v kolikor zaradi n
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Na voljo je posodobitev %1</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>Nameščena bo najnovejša posodobitev %1. Program lahko
zahteva skrbniška dovoljenja za dokončanje opravila.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>Poteka prejemanje različice %1 ...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>Ni mogoče prejeti posodobitve. Kliknite &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; za ročni prejem in namestitev.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Ni mogoče preveriti za nove posodobitve.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>Na voljo je %1 različice %2. Ponovno zaženite program za uveljavitev posodobitve.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>Na voljo je %1 različice %2. Namestite jo prek sistemskega orodja za posodobljanje.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Preverjanje strežnika za posodabljanje ...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>Stanje posodobitve ni znano: ni mogoče preveriti za nove posodobitve.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>Na voljo ni novih posodobitev. Nameščena je najnovejša različica.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Preverjanje za posodobitve</translation>
</message>
@@ -1786,43 +1946,43 @@ zahteva skrbniška dovoljenja za dokončanje opravila.</translation>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Vzpostavi povezavo s strežnikom %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Nastavi možnosti krajevne mape</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Vzpostavi povezavo ...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1 mapa &apos;%2&apos; je usklajena s krajevno mapo &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>Uskladi mapo &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Opozorilo:&lt;/strong&gt; krajevna mapa ni prazna. Izberite možnost za razrešitev problema!&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Krajevna mapa usklajevanja</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1881,14 +2041,19 @@ zahteva skrbniška dovoljenja za dokončanje opravila.</translation>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Vzpostavi povezavo s strežnikom %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
- <translation type="unfinished"/>
+ <translation>Prijava prek brskalnika</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation>Kopiraj povezavo v odložišče</translation>
</message>
</context>
<context>
@@ -1920,153 +2085,163 @@ Uporaba ni priporočljiva.</translation>
<source>&amp;Next &gt;</source>
<translation>&amp;Naslednja &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>Neveljaven naslov URL</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Uspešno vzpostavljena povezava z %1: %2 različica %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Povezava z %1 pri %2 je spodletela:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>Prekinitev med poskusom povezave na %1 pri %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Poteka poskus povezave z %1 na %2 ...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>Zahteva za overitev s strežnikom je bila preusmerjena na &apos;%1&apos;. Naslov URL ni veljaven ali pa strežnik ni ustrezno nastavljen.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>Prejet je neveljaven odziv na zahtevo overitve webdav</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>Strežnik ne dovoli dostopa. Če želite preveriti, ali imate ustrezen dostop, &lt;a href=&quot;%1&quot;&gt;kliknite tu&lt;/a&gt; za dostop do te storitve z brskalnikom.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>Neveljaven naslov URL</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>Krajevna mapa %1 že obstaja. Nastavljena bo za usklajevanje.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>Ustvarjanje mape za krajevno usklajevanje %1 ... </translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>je v redu</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>je spodletelo.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>Krajevne mape %1 ni mogoče ustvariti.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>Ni navedenega oddaljenega strežnika!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Napaka: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>ustvarjanje mape v oblaku ownCloud: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>Oddaljena mapa %1 je uspešno ustvarjena.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>Oddaljena mapa %1 že obstaja. Vzpostavljena bo povezava za usklajevanje.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>Ustvarjanje mape je povzročilo napako HTTP %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>Ustvarjanje mape na oddaljenem naslovu je spodletelo zaradi napačnih poveril. &lt;br/&gt;Vrnite se in preverite zahtevana gesla.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Ustvarjanje oddaljene mape je spodletelo. Najverjetneje je vzrok v neustreznih poverilih.&lt;/font&gt;&lt;br/&gt;Vrnite se na predhodno stran in jih preverite.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>Ustvarjanje oddaljene mape %1 je spodletelo z napako &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>Povezava za usklajevanje med %1 in oddaljeno mapo %2 je vzpostavljena.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Povezava z %1 je uspešno vzpostavljena!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>Povezave z %1 ni mogoče vzpostaviti. Preveriti je treba nastavitve.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Preimenovanje mape je spodletelo</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>Mape ni mogoče odstraniti niti ni mogoče ustvariti varnostne kopije, saj je mapa oziroma dokument v njej odprt z drugim programom. Zaprite mapo/dokument ali prekinite namestitev.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Krajevno usklajena mapa %1 je uspešno ustvarjena!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2074,14 +2249,31 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>Čarovnik za povezavo %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Preskoči nastavitve map</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2105,7 +2297,7 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>Neveljaven odziv JSON preverjanja naslova URL</translation>
</message>
@@ -2113,7 +2305,7 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>Napaka zapisovanja metapodatkov v podatkovno zbirko</translation>
</message>
@@ -2121,47 +2313,47 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>Datoteke %1 ni mogoče prejeti zaradi neskladja z imenom krajevne datoteke!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>Na disku je prostora manj kot %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>Datoteka je izbrisana s strežnika</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>Datoteke ni mogoče prejeti v celoti.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation>Prejeta datoteka je prazna, čeprav je na strežniku velikosti %1.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>Datoteke %1 ni mogoče shraniti zaradi neskladja z imenom obstoječe datoteke!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>Datoteka je bila spremenjena po usklajevanju seznama datotek</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>Napaka zapisovanja metapodatkov v podatkovno zbirko</translation>
</message>
@@ -2169,12 +2361,12 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; obnovitev je spodletela: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation>Datoteka ali mapa je bila odstranjena iz mesta v souporabi, ki je nastavljeno le za branje, obnavljanje pa je spodletelo: %1</translation>
</message>
@@ -2182,22 +2374,22 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>ni mogoče izbrisati datoteke %1, napaka: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>Pozor, mogoče je neskladje v velikosti črk imena %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>ni mogoče ustvariti mape %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>Napaka zapisovanja metapodatkov v podatkovno zbirko</translation>
</message>
@@ -2205,17 +2397,17 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>Napaka odstranjevanja &apos;%1&apos;: %2; </translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>Ni mogoče odstraniti mape &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>Ni mogoče odstraniti %1 zaradi neskladja s krajevnim imenom datoteke</translation>
</message>
@@ -2223,13 +2415,13 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>Datoteke %1 ni mogoče preimenovati v %2 zaradi že obstoječe datoteke s tem imenom.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>Napaka zapisovanja metapodatkov v podatkovno zbirko</translation>
</message>
@@ -2237,12 +2429,7 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>Datoteka je bila odstranjena iz mesta v souporabi, vendar je uspešno obnovljena.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>S strežnika je vrnjen neveljaven odziv HTTP. Pričakovan je 204, prejet pa je bil &quot;%1 %2&quot;.</translation>
</message>
@@ -2250,12 +2437,12 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>S strežnika je vrnjen neveljaven odziv HTTP. Pričakovan je 201, prejet pa je bil &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>Napaka zapisovanja metapodatkov v podatkovno zbirko</translation>
</message>
@@ -2263,28 +2450,13 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Te mape ni dovoljeno preimenovati, zato bo samodejno preimenovana v izvorno ime.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Te mape ni dovoljeno preimenovati. Preimenujte jo nazaj na privzeto vrednost.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>Datoteka je preimenovana, vendar je označena za souporabo le za branje. Obnovljena je izvirna datoteka.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>S strežnika je vrnjen neveljaven odziv HTTP. Pričakovan je 201, prejet pa je bil &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>Napaka zapisovanja metapodatkov v podatkovno zbirko</translation>
</message>
@@ -2292,33 +2464,33 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation>Datoteke %1 ni mogoče naložiti, saj obstaja druga, istoimenska datoteka, ki se od nje razlikuje le po velikih črkah v imenu.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Datoteka je odstranjena</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>Krajevna datoteka je bila med usklajevanjem spremenjena. Usklajena bo, ko bo shranjena.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>Krajevna datoteka je bila med usklajevanjem spremenjena.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>Napaka zapisovanja metapodatkov v podatkovno zbirko</translation>
</message>
@@ -2326,27 +2498,27 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>Krajevna datoteka je bila med usklajevanjem odstranjena.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>Krajevna datoteka je bila med usklajevanjem spremenjena.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation>Napaka: nepričakovan odziv s strežnika (%1).</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation>Na strežniku manjka ID datoteke</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation>Na strežniku manjka ETag datoteke</translation>
</message>
@@ -2354,27 +2526,22 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>Datoteka je bila krajevno spremenjena, čeprav je označena le za branje. Izvorna datoteka je obnovljena, narejene spremembe pa so zabeležene v datoteki spora.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>Preveri manjkajoči naslov URL</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>Krajevna datoteka je bila med usklajevanjem odstranjena.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>Krajevna datoteka je bila med usklajevanjem spremenjena.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation>Strežnik ne sprejme zadnjega paketa (ni navedene e-oznake)</translation>
</message>
@@ -2392,42 +2559,47 @@ Uporaba ni priporočljiva.</translation>
<translation>Besedilna oznaka</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Odpri v brskalniku</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Čas</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Datoteka</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Mapa</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Dejanje</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Velikost</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>Krajevni protokol usklajevanja</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Kopiraj</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Kopiraj seznam opravil v odložišče.</translation>
</message>
@@ -2468,7 +2640,7 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Izbor map za usklajevanje</translation>
</message>
@@ -2476,33 +2648,33 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Poteka nalaganje ...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation>Odstranite izbor oddaljenih map, ki jih ne želite usklajevati.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Ime</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Velikost</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>Na strežniku trenutno ni podrejenih map.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation>Prišlo je do napake med nalaganjem seznama podrejenih map.</translation>
</message>
@@ -2523,22 +2695,22 @@ Uporaba ni priporočljiva.</translation>
<translation>Nastavitve</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Dejavnosti</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Splošno</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Omrežje</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Račun</translation>
</message>
@@ -2546,28 +2718,28 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Dejavnosti</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Splošno</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Omrežje</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Račun</translation>
</message>
@@ -2595,42 +2767,42 @@ Uporaba ni priporočljiva.</translation>
<translation>Pot do OwnCloud:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>%1 souporaba datotek</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Mapa: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>Strežnik ne podpira souporabe</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation>Pridobivanje največjega mogočega števila dovoljenj za souporabo prek strežnika ...</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Datoteke ni mogoče dodeliti v souporabo, ker ni navedenih ustreznih dovoljenj.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>Uporabniki in skupine</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>Javne povezave</translation>
</message>
@@ -2643,7 +2815,17 @@ Uporaba ni priporočljiva.</translation>
<translation>Souporaba datoteke NovDokument.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>Besedilna oznaka</translation>
</message>
@@ -2673,19 +2855,24 @@ Uporaba ni priporočljiva.</translation>
<translation>Nastavi geslo</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
- <translation>Lastnosti povezave:</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>Pokaži seznam datotek</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Dovoli urejanje</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2693,95 +2880,95 @@ Uporaba ni priporočljiva.</translation>
<translation>Vsak, ki ima povezavo ima dostop do datoteke ali mape</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>&amp;Zaščiti z geslom</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Zaščiteno z geslom</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Datoteke ni mogoče dodeliti v souporabo, ker je ni navedenih ustreznih dovoljenj.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Izbriši</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation>Odpri povezavo v brskalniku</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation>Kopiraj povezavo v odložišče</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Pošlji povezavo po elektronski pošti</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Prekliči</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation>Javna povezava</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>Javna omogočanje &amp;souporabe zahteva geslo</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Določite geslo</translation>
</message>
@@ -2804,32 +2991,32 @@ Uporaba ni priporočljiva.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation>Odpri povezavo v brskalniku</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation>Kopiraj povezavo v odložišče</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Pošlji povezavo po elektronski pošti</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>Ni zadetkov za &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
@@ -2842,37 +3029,38 @@ Uporaba ni priporočljiva.</translation>
<translation>Obrazec</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>Besedilna oznaka</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>lahko ureja</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>lahko omogoči souporabo</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>ustvari</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>spremeni</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>izbriši</translation>
</message>
@@ -2916,143 +3104,176 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>Omogoči souporabo z %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation>Omogoči souporabo ...</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Odpri v brskalniku</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Podrobnosti potrdila&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Splošno ime (CN):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>Druga imena:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Ustanova (U):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Organizacijska enota (OE):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Okraj:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>Država:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Zaporedna številka:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Izdaljatelj&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Izdaljatelj:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Izdano na:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Poteče na:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Prstni odtisi&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;Opomba:&lt;/b&gt; to potrdilo je bilo ročno odobreno&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (samopodpisano)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>Ta povezava je šifrirana z %1 bitnim %2.
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation>Ni podpore za določila in karte ključe SSL</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Podrobnosti potrdila:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>Ta povezava NI varna, saj ni šifrirana.
@@ -3140,305 +3361,270 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Uspešno končano.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>Nalaganje dnevniške datoteke s CSync je spodletelo. Dnevniška datoteka je okvarjena.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;Vstavka %1 za CSync ni mogoče naložiti.&lt;br/&gt;Preverite namestitev!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>Usodna napaka parametra CSync.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>Korak opravila posodobitve CSync je spodletel.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>Korak opravila poravnave CSync je spodletel.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>Overitev CSync na posredniškem strežniku je spodletela.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>Poizvedba posredniškega strežnika s CSync je spodletela.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>Overitev CSync pri strežniku %1 je spodletela.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>Povezava CSync v omrežje je spodletela.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>Omrežna povezava je časovno potekla.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>Prišlo je do napake med prenosom HTTP.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation>Priklopljena mapa trenutno ni na voljo na strežniku</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>Med odpiranjem mape je prišlo do napake.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>Napaka med branjem mape</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>Datoteka/Mapa je prezrta, ker je skrita.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation>Le %1 je na voljo, zahtevanih pa je vaj %2 za zagon</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation>Dejanje ni dovoljeno, ker ni ustreznih dovoljenj za dodajanje starševske mape</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation>Dejanje ni dovoljeno, ker ni ustreznih dovoljenj za dodajanje datotek v to mapo</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>Odziv CSync: na strežniku %1 ni razpoložljivega prostora.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>Nedoločena napaka CSync.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Opravilo je bilo prekinjeno s strani uporabnika</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>Dostop s CSync je spodletel</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
- <translation>Nalaganje ali ustvarjanje dnevniške datoteke s CSync je spodletelo. Za to opravilo so zahtevana dovoljenja branja in zapisovanja krajevne mape za usklajevanje.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
- <translation>Delovanje CSync je zaradi nerazrešenih dovoljenj spodletelo.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
- <translation>Ustvarjanje mape s CSync je spodletelo. Mapa že obstaja.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>Storitev trenutno ni na voljo</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>Dostop je prepovedan.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>Prišlo je do notranje napake %1.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>Usklajevanje simbolnih povezav ni podprto.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>Datoteka je na seznamu prezrtih datotek.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation>Imena datotek, ki vsebujejo piko, na tem sistemu niso podprta.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation>Imena datotek, ki vsebujejo znak »%1«, na tem sistemu niso podprta.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation>Ime datoteke je na tem sistemu zadržano za sistemsko datoteko.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation>Datoteka vsebuje pripete presledne znake</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>Ime datoteke je predolgo.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation>Nerazrešen spor</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>Določanje statističnih podatkov je spodletelo.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>Kodni zapis imena datoteke ni veljaven.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>Uporabljen je neveljaven znak; preimenujte &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation>Ni mogoče prebrati črnega seznama iz krajevne mape</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation>Ni mogoče brati iz dnevnika usklajevanja</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>Ni mogoče odpreti dnevnika usklajevanja</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>Ime datoteke vsebuje vsaj en neveljaven znak.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>Prezrto, ker je predmet označen na črni listi za usklajevanje</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation>Dejanje ni dovoljeno! Ni ustreznih dovoljenj za dodajanje podmap v to mapo.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>Ni dovoljeno pošiljati te datoteke, ker ima določena dovoljenja le za branje. Datoteka bo obnovljena na izvorno različico.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>Odstranitev ni dovoljena, datoteka bo obnovljena.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>Krajevne datoteke in mape v souporabi so odstranjene.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>Premikanje ni dovoljeno, datoteka bo obnovljena.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>Premikanje ni dovoljeno, ker je nastavljeno določilo %1 le za branje.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>cilj</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>vir</translation>
</message>
@@ -3462,17 +3648,17 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Različica %1. Za več podrobnosti si oglejte &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation>&lt;p&gt;Avtorske pravice ownCloud, GmbH&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;Programski paket objavlja %1 pod pogoji Splošnega javnega dovoljenja GNU (GNU General Public License - GPL), različice 2.0.&lt;br&gt;%2 in logotip %2 sta blagovni znamki %1 v Združenih državah, drugih državah ali oboje.&lt;/p&gt;</translation>
</message>
@@ -3503,81 +3689,81 @@ Uporaba ni priporočljiva.</translation>
<translation>Pred nadaljevanjem je zahtevana prijava</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Mapa %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Ni nastavljenih map za usklajevanje.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Odpri v brskalniku</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Prijava ...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Odjava</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Nedavne spremembe</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Preverjanje za spremembe v &apos;%1&apos;</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Upravljane mape:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Odpri mapo &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Odpri %1 v brskalniku</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Neznano stanje</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Nastavitve ...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Podrobnosti ...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Pomoč</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>Končaj %1</translation>
</message>
@@ -3592,11 +3778,6 @@ Uporaba ni priporočljiva.</translation>
<translation>Nepodprta različica strežnika</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation>Na strežniku računua %1 teče starejša nepodprta različica %2. Z uporabo trenutno nameščenega odjemalca z nepodporo različico strežnika ni varno. Nadaljujete na lastno odgovornost.</translation>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Brez povezave</translation>
@@ -3628,116 +3809,129 @@ Uporaba ni priporočljiva.</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
+ <translation>Usklajevanje je v premoru</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
- <translation type="unfinished"/>
+ <translation>Med usklajevanjem je prišlo do napake</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
- <translation type="unfinished"/>
+ <translation>Ni nastavljenih map za usklajevanje.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation>Nadaljuj usklajevanje vseh map</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>Ustavi usklajevanje vseh map</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>Nadaljuj usklajevanje vsega</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>Nadaljuj usklajevanje</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>Ustavi vse usklajevanje</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>Ustavi usklajevanje</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Odjavi vse račune</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Prijavi z vsemi računi ...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>Nov račun ...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>O %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>Sesuj zdaj</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Ni nedavno usklajenih predmetov</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Poteka usklajevanje %1 od %2 (preostaja %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation>Poteka usklajevanje %1 od %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Usklajevanje %1 (%2 do konca)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>Usklajevanje %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Ni posodobitev</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Različica %2. Več podrobnosti je mogoče najti na &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Znane težave in pomoč je na voljo na povezavi &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;small&gt;Avtorstvo: Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt in drugi.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Avtorske pravice ownCloud GmbH&lt;/p&gt;&lt;p&gt;Programski paket je objavljen z dovoljenjem GNU General Public License (GPL), različice 2.0.&lt;br/&gt;Znamka in logotip ownCloud sta blagovni znamki družbe ownCloud GmbH v Združenih državah, drugih državah ali obojih.&lt;/p&gt;</translation>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3749,9 +3943,9 @@ Uporaba ni priporočljiva.</translation>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>Besedilna oznaka</translation>
</message>
@@ -3787,11 +3981,22 @@ Uporaba ni priporočljiva.</translation>
<translation>Vprašaj za potrditev pred usklajevanjem zunanji&amp;h shramb</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Izbor datotek za usklajevanje</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>&amp;Krajevna mapa</translation>
@@ -3808,11 +4013,16 @@ Uporaba ni priporočljiva.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>Uskladi &amp;vse datoteke s strežnika</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Sporočilo stanja</translation>
</message>
@@ -3849,8 +4059,8 @@ Uporaba ni priporočljiva.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
- <translation>Med vzpostavljanjem povezave je prišlo do napake. Poskusite znova.</translation>
+ <source>An error occurred while connecting. Please try again.</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="56"/>
@@ -4029,7 +4239,7 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;Izgrajeno na osnovi predelave Git &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; na %3, %4 z uporabo Qt %5, %6&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4127,52 +4337,52 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Stanje je nedoločeno</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Čakanje začetek usklajevanja</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>Usklajevanje v teku</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Usklajevanje je uspešno končano</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Usklajevanje je končano, ostajajo pa nerešene težave s posameznimi datotekami.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Napaka usklajevanja</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Napaka nastavitve</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Priprava na usklajevanje</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Poteka prekinjanje ...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>Usklajevanje je ustavljeno</translation>
</message>
@@ -4180,22 +4390,22 @@ Uporaba ni priporočljiva.</translation>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation>Brskalnika ni mogoče odpreti</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation>Ni mogoče odpreti odjemalca elektronske pošte</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation>Prišlo je do napake med zaganjanjem odjemalca elektronske pošte za ustvarjanje novega sporočila. Najverjetneje ni nastavljen privzet programski paket.</translation>
</message>
diff --git a/translations/client_sr.ts b/translations/client_sr.ts
index 81442142b..61dd927f5 100644
--- a/translations/client_sr.ts
+++ b/translations/client_sr.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="sr" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,17 +95,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Време повезивања истекло</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation type="unfinished"/>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Одустани</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Налог</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Изаберите шта синхронизовати</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Прављење фасцикле није успело</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;Не могу да направим локалну фасциклу &lt;i&gt;%1&lt;/i&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Синхронизација у току</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>Синхронизација је у току.&lt;br/&gt;Желите ли да је прекинете?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 искоришћено</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 као &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Повезан са %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>Сервер %1 је привремено недоступан.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>Одјављен са %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Пријава</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Потврда уклањања налога</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Уклони везу</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Отвори фасциклу</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Одјава</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Настави синхронизацију</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Паузирај синхронизацију</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Желите ли заиста да престанете са синхронизацијом фасцикле &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Напомена:&lt;/b&gt; Ово &lt;b&gt;неће&lt;/b&gt; обрисати ниједан фајл.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1 (%3%) од %2 искоришћено. Неке фасцикле, укључујући мрежно монтиране или дељене фасцикле, могу имати друга ограничења.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%1% од %2 искоришћено</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Тренутно нема доступних података о заузећу складишта.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>Нема подешене %1 везе.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Одјављен</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Неповезан</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Повезан</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Услуга није доступна</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Грешка мреже</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Грешка подешавања</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Непознато стање налога</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Активност сервера</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Протокол синхронизације</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>Несинхронизовано</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Копирано у клипборд</translation>
</message>
@@ -469,47 +488,47 @@
<translation>Текст ознака</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Активности сервера</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Копирај</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Копирај активност у клипборд.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;Налог %1 нема укључене активности.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation type="unfinished"/>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Напусти</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Настави</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation type="unfinished"/>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>Нема подешеног оунКлауд налога</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>Подешени сервер је сувише стар за ову верзију клијента</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Ажурирајте сервер и поново покрените клијента.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Грешка аутентификације: лозинка или корисничко име су погрешни.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>истек времена</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>Дати акредитиви нису исправни</translation>
</message>
@@ -637,131 +681,158 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Прекинуо корисник</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>Локална фасцикла %1 не постоји.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 би требало да је фасцикла али није.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 није читљив.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 је уклоњен.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 је преузет.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 је ажуриран.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 је преименован у %2.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 је премештен у %2.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 није синхронизован због грешке. Погледајте записник за детаље.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Активност синхронизације</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>Не могу да прочитам системски списак за игнорисање</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -769,46 +840,46 @@ If you decide to delete the files, they will be unavailable to you, unless you a
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Уклонити све фајлове?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Уклони све фајлове</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Остави фајлове</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation type="unfinished"/>
</message>
@@ -816,115 +887,105 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>Не могу да ресетујем стање фасцикле</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>Пронађен је стари журнал синхронизације „%1“ али се не може уклонити. Проверите да га нека апликација тренутно не користи.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation> (резерва)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation> (резерва %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Неодређено стање.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Припремам синхронизацију.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>Синхронизација у току.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>Последња синхронизација је била успешна.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>Последња синхронизација је била успешна али са упозорењима за поједине фајлове.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>Последња синхронизација је била успешна.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Грешка подешавања.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Корисник прекинуо.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>Синхронизација је паузирана.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (синхронизација паузирана)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Немате дозволе за упис у изабрану фасциклу!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -934,7 +995,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Додај везу синхронизације фасцикле</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation type="unfinished"/>
</message>
@@ -969,7 +1030,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Одјављен</translation>
</message>
@@ -984,115 +1045,133 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Проверавам измене у „%1“</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>„%1“</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>Синхронизујем %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>преузми %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>отпреми %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 од %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>фајл %1 од %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>Чекам...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>Припремам синхронизацију...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>Додај везу синхронизације фасцикле</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>Додај везу синхронизације</translation>
</message>
@@ -1100,17 +1179,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Клик за избор локалне фасцикле за синхронизацију.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Унесите путању до локалне фасцикле.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Изаберите изворну фасциклу</translation>
</message>
@@ -1118,60 +1197,68 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Прављење удаљене фасцикле</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>Унесите назив нове фасцикле која ће бити направљена у %1:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>Фасцикла је успешно направљена на %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>Неуспела аутентификација при приступу %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>Нисам успео да направим фасциклу на %1. Проверите ручно.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>Неуспех излиставања фасцикле. Грешка: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Ово изаберите да синхронизујете целокупан налог</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Ова фасцикла се већ синхронизује.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Већ синхронизујете &lt;i&gt;%1&lt;/i&gt;, која садржи фасциклу &lt;i&gt;%2&lt;/i&gt;.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Упозорење:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Упозорење:&lt;/b&gt;</translation>
</message>
@@ -1179,22 +1266,22 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>Нема е-ознаке са сервера. Проверите прокси или мрежни излаз</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>Добијена је различита е-ознака за наставак преноса. Покушаћу поново следећи пут.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>Сервер је вратио погрешан опсег садржаја</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Време за повезивање је истекло</translation>
</message>
@@ -1217,23 +1304,38 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Напредно</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation type="unfinished"/>
</message>
@@ -1253,31 +1355,67 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Користи &amp;једнобојне иконе</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>Уреди &amp;занемарене фајлове</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
- <source>S&amp;how crash reporter</source>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>О програму</translation>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
+ <source>S&amp;how crash reporter</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
+ <location filename="../src/gui/generalsettings.ui" line="53"/>
<source>Updates</source>
<translation>Ажурирања</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>&amp;Поново покрени и ажурирај</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Откажи</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1345,34 +1483,34 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Уклони</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Не могу да отворим фајл</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>Не могу да упишем измене у „%1“</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Додавање шаблона за игнорисање</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Додајте нови шаблон за игнорисање:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Овај унос је системски из „%1“ и не може се овде изменити.</translation>
</message>
@@ -1402,7 +1540,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>фасцикла</translation>
</message>
@@ -1417,35 +1555,45 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Копирај</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>време</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>фајл</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1471,36 +1619,48 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Очисти</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Очисти приказ записника.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>С&amp;ачувај</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Сачувајте фајл записника на диску.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Сачувај фајл записника</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Грешка</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>Не могу да пишем у записник %1</translation>
</message>
@@ -1508,12 +1668,12 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Грешка</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;Фајл „%1“&lt;br/&gt;није уписив.&lt;br/&gt;&lt;br/&gt;Записник се &lt;b&gt;не може&lt;/b&gt; сачувати!&lt;/nobr&gt;</translation>
</message>
@@ -1521,27 +1681,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Нова верзија је доступна</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;Нова верзија %1 клијента је доступна.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; је доступна за преузимање. Инсталирана је %3.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Прескочи ову верзију</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Прескочи сада</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Ажурирај</translation>
</message>
@@ -1629,27 +1789,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation>сам ограничи</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>назив прокси сервера</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>корисничко име за прокси</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>лозинка за прокси</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>ХТТП(С) прокси</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>СОКС-5 прокси</translation>
</message>
@@ -1657,23 +1817,23 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation type="unfinished"/>
@@ -1682,32 +1842,32 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -1715,59 +1875,59 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Ново %1 ажурирање спремно</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>Ново ажурирање за %1 ће се инсталирати. Можда ће бити
потребне додатне дозволе током процеса.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>Преузимам верзију %1. Сачекајте...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>Не могу да преузмем ажурирање. Кликните &lt;a href=&apos;%1&apos;&gt;овде&lt;/a&gt; да бисте га преузели ручно.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Не могу да проверим нова ажурирања.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Проверавам сервер ажурирања...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>Стање ажурирања је непознато. Нисам проверио нова ажурирања.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>Нема доступних ажурирања. Имате последњу верзију.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Провера надоградњи</translation>
</message>
@@ -1775,43 +1935,43 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Повежи се са %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Опције поставке локалне фасцикле</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Повежи се...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1 фасцикла „%2“ је сингронизована са локалном „%3“</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>Синхронизуј фасциклу „%1“</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Синхронизација локалне фасцикле</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1870,15 +2030,20 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Повежи %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1909,153 +2074,163 @@ It is not advisable to use it.</source>
<source>&amp;Next &gt;</source>
<translation>&amp;Следеће &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Успешно повезан са %1: %2 верзија %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Неуспешно повезивање са %1 на %2:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>Време је истекло у покушају повезивања са %1 на %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Покушавам да се повежем са %1 на %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>Аутентификован захтев серверу је преусмерен на %1. УРЛ је лош, сервер је лоше подешен.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>Добијен је неисправан одговор на аутентификовани ВебДАВ захтев</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>Сервер није дозволио приступ. Да проверите имате ли исправан приступ, &lt;a href=&quot;%1&quot;&gt;кликните овде&lt;/a&gt; да бисте приступили услузи из прегледача.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>Локална фасцикла %1 већ постоји. Одређујем је за синхронизацију.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>Правим локалну фасциклу синхронизације %1...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>у реду</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>неуспешно</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>Не могу да направим локалну фасциклу %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>Није наведена удаљена фасцикла!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Грешка: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>правим фасциклу у облаку: % 1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>Удаљена фасцикла %1 је успешно направљена.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>Удаљена фасцикла %1 већ постоји. Повезујем се ради синхронизовања.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>Прављење фасцикле довело је до ХТТП грешке са кодом %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>Прављење удаљене фасцикле није успело због погрешних акредитива!&lt;br/&gt;Идите назад и проверите ваше акредитиве.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Прављење удаљене фасцикле није успело због погрешних акредитива.&lt;/font&gt;&lt;br/&gt;Идите назад и проверите ваше акредитиве.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>Прављење удаљене фасцикле %1 није успело због грешке &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>Веза за синхронизацију %1 до удаљеног директоријума %2 је подешена.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Успешно повезан са %1!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>Не може се успоставити веза са %1. Проверите поново.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Преименовање није успело</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>Не могу да уклоним и направим резервну копију фасцикле јер су фасцикла или фајл отворени у другом програму. Затворите фасциклу или фајл и покушајте поново или одустаните од подешавања.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Локална фасцикла за синхронизовање %1 је успешно направљена!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2063,14 +2238,31 @@ It is not advisable to use it.</source>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>%1 чаробњак повезивања</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Прескочи подешавање фасцикли</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2094,7 +2286,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>Неисправан ЈСОН одговор са адресе упита</translation>
</message>
@@ -2102,7 +2294,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2110,47 +2302,47 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>Фајл %1 се не може преузети јер се судара са називом локалног фајла!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>Фајл је обрисан са сервера</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>Фајл није могао бити преузет у потпуности.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>Фајл %1 се не може сачувати јер се судара са називом локалног фајла!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>Фајл је измењен у међувремену</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2158,12 +2350,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; Враћање није успело: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation type="unfinished"/>
</message>
@@ -2171,22 +2363,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>не могу да обришем фајл %1, грешка: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>Пажња! Могуће сударање због величине слова са %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>не могу да направим фасциклу %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2194,17 +2386,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>Грешка при уклањању %1: %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>Не могу да уклоним фасциклу „%1“</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>Не могу да уклоним %1 због сударања са називом локалног фајла</translation>
</message>
@@ -2212,13 +2404,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>Фајл %1 се не може преименовати у %2 због сударања са називом локалног фајла</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2226,12 +2418,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>Фајл је уклоњен из дељења које је само за читање. Зато је враћен.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>Сервер је вратио лош ХТТП код. Очекивано је 204 али је примљено „%1 %2“.</translation>
</message>
@@ -2239,12 +2426,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Сервер је вратио лош ХТТП код. Очекивано је 201 али је примљено „%1 %2“.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2252,28 +2439,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Ова фасцикла се не сме преименовати. Зато је враћен првобитни назив.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Ова фасцикла се не сме преименовати. Молим вас вратите назив у „Shared“.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>Фајл је био преименован али је део дељења које је само за читање. Оригинални фајл је враћен.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Сервер је вратио лош ХТТП код. Очекивано је 201 али је примљено „%1 %2“.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2281,33 +2453,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Фајл уклоњен</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>Локални фајл је измењен током синхронизације. Биће настављена.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>Локални фајл измењен током синхронизације.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2315,27 +2487,27 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>Локални фајл је уклоњен током синхронизације.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>Локални фајл измењен током синхронизације.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation type="unfinished"/>
</message>
@@ -2343,27 +2515,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>Фајл је измењен локално али је у саставу дељења које је само за читање. Враћен је у претходно стање а измене су у фајлу сукоба.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>Адреса упита недостаје</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>Локални фајл је уклоњен током синхронизације.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>Локални фајл измењен током синхронизације.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation type="unfinished"/>
</message>
@@ -2381,42 +2548,47 @@ It is not advisable to use it.</source>
<translation>Текст ознака</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Отвори у прегледачу</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>време</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>фајл</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>фасцикла</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>радња</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>величина</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>Локални протокол синхронизације</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Копирај</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Копирај активност у клипборд.</translation>
</message>
@@ -2457,7 +2629,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Изаберите шта синхронизовати</translation>
</message>
@@ -2465,33 +2637,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Учитавам ...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>назив</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>величина</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>На серверу тренутно нема потфасцикли.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation type="unfinished"/>
</message>
@@ -2512,22 +2684,22 @@ It is not advisable to use it.</source>
<translation>Поставке</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Активност</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Опште</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Мрежа</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Налог</translation>
</message>
@@ -2535,28 +2707,28 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Активност</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Опште</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Мрежа</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Налог</translation>
</message>
@@ -2584,42 +2756,42 @@ It is not advisable to use it.</source>
<translation>оунКлауд путања:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>%1 дељење</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Фасцикла: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Фајл се не може делити јер је подељен без дозволе за поновно дељење.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation type="unfinished"/>
</message>
@@ -2632,7 +2804,17 @@ It is not advisable to use it.</source>
<translation>Подели NewDocument.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>Текст ознака</translation>
</message>
@@ -2662,19 +2844,24 @@ It is not advisable to use it.</source>
<translation>Постави лозинку</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>уређивање</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2682,95 +2869,95 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>&amp;Заштићено лозинком</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Заштићено лозинком</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Фајл се не може делити јер је подељен без дозволе за поновно дељење.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Обриши</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Пошаљи везу е-поштом</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Откажи</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>Јавно дељење з&amp;хтева лозинку</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Поставите лозинку</translation>
</message>
@@ -2793,32 +2980,32 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Пошаљи везу е-поштом</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
@@ -2831,37 +3018,38 @@ It is not advisable to use it.</source>
<translation>Образац</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>Текст ознака</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>може да мења</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>може да дели</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>направи</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>измени</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>обриши</translation>
</message>
@@ -2905,143 +3093,176 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>Подели са %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Отвори у прегледачу</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Детаљи сертификата&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Уобичајено име:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>Алтернативно име:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Организација:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Организациона јединица:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Покрајина/провинција:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>Земља:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Серијски број:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Издавач&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Издавач:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Издат:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Истиче:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Отисци&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>СХА-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>СХА-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;Напомена:&lt;/b&gt; Овај сертификат је ручно одобрен&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (самопотписан)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>Ова веза је шифрована %1-битним %2.
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Подаци о сертификату:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>Ова веза НИЈЕ безбедна јер није шифрована.
@@ -3129,305 +3350,270 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Успешно.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>CSync не може да учита фајл дневника. Фајл дневника је оштећен.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;Прикључак %1 за csync се не може учитати.&lt;br/&gt;Проверите инсталацију!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>CSync фатална грешка параметара.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>CSync није успео да ажурира корак процесирања.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>CSync није успео да усклади корак процесирања.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync не може да се аутентификује на проксију.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSync не налази прокси или сервер.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync не може да се аутентификује на %1 серверу.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync не може да приступи мрежи.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>Истекло је време за повезивање.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>Дошло је до грешке ХТТП преноса.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: нема простора на %1 серверу.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>CSync недефинисана грешка.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Прекинуо корисник</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>CSync није приступио</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>Услуга је привремено недоступна</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>Приступ је забрањен</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>Десила се интерна грешка број %1.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>Симболичке везе нису подржане у синхронизацији.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>Фајл се налази на листи за игнорисање.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>Назив фајла је предугачак.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>Кодирање назива фајла није исправно</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>Не могу да отворим дневник синхронизације</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>Назив садржи бар један недозвољен карактер</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>Игнорисано јер се не налази на листи за синхронизацију</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>Није могуће отпремити овај фајл јер је на серверу само за читање. Враћам</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>Није могуће уклањање. Враћам</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>Локални фајлови и дељена фасцикла су уклоњени.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>Премештање није дозвољено. Ставка је враћена</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>Премештање није дозвољено јер %1 је само за читање</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>одредиште</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>извор</translation>
</message>
@@ -3451,17 +3637,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Верзија %1. За више информација посетите &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;Дистрибуира %1 под ГНУ општом јавном лиценцом (ОЈЛ) верзија 2.0.&lt;br/&gt;%2 и %2 лого су регистроване марке %1 у САД, другим земљама или обоје&lt;/p&gt;</translation>
</message>
@@ -3492,81 +3678,81 @@ It is not advisable to use it.</source>
<translation>Пријавите се</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Фасцикла %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Нема подешених фасцикли за синхронизацију.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Отвори у прегледачу</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Пријави се...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Одјава</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Недавне измене</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Проверавам измене у „%1“</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Управљане фасцикле:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Отвори фасциклу „%1“</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Отвори %1 у прегледачу</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Непознато стање</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Поставке...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Детаљи...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Помоћ</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>Напусти %1</translation>
</message>
@@ -3581,11 +3767,6 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Неповезан</translation>
@@ -3617,116 +3798,129 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Одјави се са свих налога</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Пријави се на све налоге...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>Падни сада</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Ништа није недавно синхронизовано</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Синхронизујем %1 од %2 (преостало %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Синхронизујем %1 (преостало %2)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>Синхронизујем %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Ажурно</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation type="unfinished"/>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3738,9 +3932,9 @@ It is not advisable to use it.</source>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>Текст ознака</translation>
</message>
@@ -3776,11 +3970,22 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Изаберите шта синхронизовати</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>&amp;Локална фасцикла</translation>
@@ -3797,11 +4002,16 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>Син&amp;хронизуј све са сервера</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Порука стања</translation>
</message>
@@ -3838,7 +4048,7 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
+ <source>An error occurred while connecting. Please try again.</source>
<translation type="unfinished"/>
</message>
<message>
@@ -4018,7 +4228,7 @@ It is not advisable to use it.</source>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;Направљено од ГИТ ревизије &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; %3, %4 користећи КуТ %5, %6&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4116,52 +4326,52 @@ It is not advisable to use it.</source>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Неодређено стање</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Чекам почетак синхронизације</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>Синхронизација у току</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Успешна синхронизација</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Синхронизација успешна. Неки фајлови су игнорисани.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Грешка синхронизације</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Грешка подешавања</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Припремам синхронизацију</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Прекидам...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>Синхронизација паузирана</translation>
</message>
@@ -4169,22 +4379,22 @@ It is not advisable to use it.</source>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation type="unfinished"/>
</message>
diff --git a/translations/client_sv.ts b/translations/client_sv.ts
index 6381d2f22..b7ac48e7e 100644
--- a/translations/client_sv.ts
+++ b/translations/client_sv.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="sv" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,17 +95,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Tidsgräns för anslutningen överskreds</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation>Okänt fel: nätverkssvaret raderades</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation>Servern svarade &quot;%1 %2&quot; på &quot;%3 %4&quot;</translation>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Avbryt</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Konto</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Välj vad som ska synkas</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Tvinga synkning</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>Starta om synkning</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>Ta bort anslutning till mappsynkronisering</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Kunde inte skapa mappen</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;Kunde inte skapa lokal mapp &lt;i&gt;%1&lt;/i&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>Bekräfta radering av anslutning till mappsynkronisering</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>Ta bort anslutning till mappsynkronisering</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Synkronisering pågår</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>En synkronisering pågår.&lt;br/&gt;Vill du avbryta den?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 används</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 som &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>Serverversion %1 är gammal och stöds inte längre! Fortsätt på egen risk.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Ansluten till %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>Servern %1 är för tillfället inte tillgänglig.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation>Servern %1 är för närvarande i underhållsläge.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>Utloggad från %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation>Anskaffar autentisering från webbläsaren. &lt;a href=&apos;%1&apos;&gt;Klicka här &lt;/a&gt; för att öppna webbläsaren igen.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation>Ansluter till %1...</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>Ingen anslutning till %1 vid %2.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Logga in</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>Dessa mappar har inte synkroniserats för att de är för stora:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>Det finns mappar som inte synkroniserats för att de är externa lagringsytor:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation>Det finns mappar som inte blivit synkroniserade på grund av att de är för stora eller är externa lagringsytor: </translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Bekräfta radering an kontot</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Vill du verkligen avsluta anslutningen till kontot &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Observera:&lt;/b&gt; Detta kommer &lt;b&gt;inte&lt;/b&gt; radera några filer.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Radera anslutning</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Öppna mapp</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Logga ut</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Återuppta synkronisering</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Pausa synkronisering</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Vill du verkligen avbryta synkronisering av mappen &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Observera:&lt;/b&gt; Detta kommer &lt;b&gt;inte&lt;/b&gt; radera några filer.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1 (%3%) av %2 används. Vissa mappar, inklusive nätverks- eller delade mappar, kan ha andra begränsningar.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%1 av %2 används</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Just nu finns ingen utrymmes information tillgänglig</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>Ingen %1 anslutning konfigurerad.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Utloggad</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Bortkopplad</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Ansluten</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Tjänsten är inte tillgänglig</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation>Underhållsläge</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Nätverksfel</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Konfigurationsfel</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Okänd kontostatus</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Serveraktivitet</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Synkprotokoll</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>Inte synkroniserad</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>Inte synkad (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>Listan på serveraktivitet har kopierats till urklipp.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>Listan på synkaktivitet har kopierats till urklipp.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>Listan över ej synkroniserat har kopierats till klippbordet.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Kopierat till urklipp</translation>
</message>
@@ -469,47 +488,47 @@
<translation>Textetikett</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Serveraktivitet</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Kopiera</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Kopiera aktivitetslistan till urklipp.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Åtgärd krävs: Notifieringar</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;Kontot %1 har inte aktiviteter aktiverade</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation><numerusform>Du har mottagit %n ny notifiering från %2.</numerusform><numerusform>Du har mottagit %n nya notifieringar från %2.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation><numerusform>Du tog emot %1 ny notis från %1 och %2.</numerusform><numerusform>Du tog emot %n nya notiser från %1 och %2.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>Du tog emot nya notiser från %1, %2 och andra konton.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>%1 Notiser - Åtgärd krävs</translation>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Avsluta</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Fortsätt</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation>Kunde inte komma åt konfigurationsfilen</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation>Ett fel uppstod vid läsning av konfigurationsfil vid %1.</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>Avsluta ownCloud</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>Fel vid skrivning av metadata till databasen</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>Inget ownCloud konto konfigurerat</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>Den konfigurerade servern är för den här klienten är för gammal</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Uppgradera servern och starta sedan om klienten.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Autentiseringsfel: Användarnamn eller lösenord är felaktigt</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>timeout</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>De angivna uppgifterna stämmer ej</translation>
</message>
@@ -637,133 +681,160 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Avbruten av användare</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>Den lokala mappen %1 finns inte.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 borde vara en mapp, men är inte det.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 är inte läsbar.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 har tagits bort.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 har laddats ner.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 har uppdaterats.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 har döpts om till %2.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 har flyttats till %2.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation><numerusform>%1 och %n andra filer har tagits bort.</numerusform><numerusform>%1 och %n andra filer har tagits bort.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation><numerusform>%1 och %n andra filer har laddats ner.</numerusform><numerusform>%1 och %n andra filer har laddats ner.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation><numerusform>%1 och %n andra filer har uppdaterats.</numerusform><numerusform>%1 och %n andra filer har uppdaterats.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation><numerusform>%1 har döpts om till %2 och %n andra filer har döpts om.</numerusform><numerusform>%1 har döpts om till %2 och %n andra filer har döpts om.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation><numerusform>%1 har flyttats till %2 och %n andra filer har flyttats.</numerusform><numerusform>%1 har flyttats till %2 och %n andra filer har flyttats.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation><numerusform>%1 och %n andra filer har synk-konflikter.</numerusform><numerusform>%1 och %n andra filer har synk-konflikter.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation>%1 har en synk-konflikt. Vänligen kontrollera konfliktfilen!</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation><numerusform>%1 och %n andra filer kunde inte synkas på grund av fel. Se loggen för detaljer.</numerusform><numerusform>%1 och %n andra filer kunde inte synkas på grund av fel. Se loggen för detaljer.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 kunde inte synkroniseras på grund av ett fel. Kolla loggen för ytterligare detaljer.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Synk aktivitet</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>Kunde inte läsa systemets exkluderings-fil</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation>En ny mapp större än %1 MB har lagts till: %2.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation>En mapp från en extern lagringsyta har lagts till.
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation>Vänligen gå till inställningar och välj den om du önskar att ladda ner den.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -771,29 +842,29 @@ If you decide to delete the files, they will be unavailable to you, unless you a
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Ta bort alla filer?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Ta bort alla filer</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Behåll filer</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
@@ -802,17 +873,17 @@ Detta kan vara för att en säkerhetskopia har återställts på servern.
Om du fortsätter synkningen kommer alla dina filer återställas med en äldre version av filen. Vill du behålla dina nyare lokala filer som konfliktfiler?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>Backup upptäckt</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>Normal synkronisation</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>Behåll lokala filer som konflikt</translation>
</message>
@@ -820,115 +891,105 @@ Om du fortsätter synkningen kommer alla dina filer återställas med en äldre
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>Kunde inte återställa mappens skick</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>En gammal synkroniseringsjournal &apos;%1&apos; hittades, men kunde inte raderas. Vänligen se till att inga program för tillfället använder den.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation>(säkerhetskopia)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation>(säkerhetkopia %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Okänt tillstånd.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>Väntar på att starta synkronisering.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Förbereder synkronisering</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>Synkronisering pågår.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>Senaste synkronisering lyckades.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>Senaste synkning lyckades, men det finns varningar för vissa filer!</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>Senaste synkronisering lyckades.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Inställningsfel.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Användare Avbryt</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>Synkronisering är pausad.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Synk är stoppad)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>Ingen giltig mapp markerad!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>Den markerade sökvägen är inte en mapp!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Du har inga skrivrättigheter till den valda mappen!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation>Den lokala mappen %1 innehåller en symbolisk länk. Länkens mål innehåller en redan synkroniserad mapp. Vänligen välj en annan!</translation>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation>Det pågår redan en synkronisering från servern till denna lokala mappen. Vänligen välj en annan lokal mapp.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Den lokala mappen %1 innehåller redan en mapp som synkas. Var god välj en annan!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Den lokala mappen %1 finns redan inuti en mapp som synkas. Var god välj en annan!</translation>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation>Den lokala mappen %1 är en symbolisk länk. Länkmålet finns redan inuti en mapp som synkas. Var god välj en annan!</translation>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -938,7 +999,7 @@ Om du fortsätter synkningen kommer alla dina filer återställas med en äldre
<translation>Lägg till mapp att synka.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>Synkroniserar med lokal mapp</translation>
</message>
@@ -973,7 +1034,7 @@ Om du fortsätter synkningen kommer alla dina filer återställas med en äldre
<translation>Ett fel uppstod när mapplistan försökte laddas från servern.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Utloggad</translation>
</message>
@@ -988,115 +1049,133 @@ Om du fortsätter synkningen kommer alla dina filer återställas med en äldre
<translation>Det finns olösta konflikter. Klicka för detaljer.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Kollar efter ändringar i &apos;%1&apos;</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>Synkroniserar %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>,</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>ladda ner %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>ladda upp %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 av %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%5 kvar, %1 av %2, fil %3 av %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 av %2, fil %3 av %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>fil %1 av %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>Väntar...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>Väntat på %n annan mapp...</numerusform><numerusform>Väntat på %n andra mappar...</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>Förbereder för att synkronisera...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>Lägg till mapp att synka.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>Lägg till anslutning.</translation>
</message>
@@ -1104,17 +1183,17 @@ Om du fortsätter synkningen kommer alla dina filer återställas med en äldre
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Klicka för att välja en lokal mapp att synka.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Ange sökvägen till den lokala mappen.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Välj källmapp</translation>
</message>
@@ -1122,60 +1201,68 @@ Om du fortsätter synkningen kommer alla dina filer återställas med en äldre
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Skapa fjärrmapp</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>Ange namnet på den nya mappen som skall skapas under &apos;%1&apos;:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>Mappen skapades på %1.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>Autentisering misslyckades att komma åt %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>Det gick inte att skapa mappen på %1. Kontrollera manuellt.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>Kunde inte lista en mapp. Felkod: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Välj detta för att synka allt</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Denna mappen synkas redan.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Du synkar redan &lt;i&gt;%1&lt;/i&gt;, vilket är övermapp till &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Varning:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Varning:&lt;/b&gt;</translation>
</message>
@@ -1183,22 +1270,22 @@ Om du fortsätter synkningen kommer alla dina filer återställas med en äldre
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>Ingen E-Tag mottogs från servern, kontrollera proxy/gateway</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>Vi mottog en helt annan e-tag för att återuppta. Försök igen nästa gång.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>Servern returnerade felaktig content-range</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Anslutningen avbröts på grund av timeout</translation>
</message>
@@ -1221,23 +1308,38 @@ Om du fortsätter synkningen kommer alla dina filer återställas med en äldre
<translation>För aktivitetsfältet</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Avancerad</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation>Fråga innan synkronisering av mappar större än</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation>Fråga innan synkronisering av externa lagringsytor</translation>
</message>
@@ -1257,31 +1359,67 @@ Om du fortsätter synkningen kommer alla dina filer återställas med en äldre
<translation>Använd &amp;monokroma ikoner</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>Ändra &amp;ignorerade filer</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>Visa krashrapporteraren</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>Om</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>Uppdateringar</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>%Starta om &amp;&amp; Uppdatera</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Avbryt</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1349,7 +1487,7 @@ Om du fortsätter synkningen kommer alla dina filer återställas med en äldre
<translation>Radera</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1358,27 +1496,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
Objekt som tillåter radering kommer tas bort om de förhindrar en mapp att tas bort. Det är användbart för meta-data.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Kunde inte öppna fil</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>Kan inte skriva förändringar till &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Lägg till synk-filter</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Lägg till ett nytt synk-filter:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Denna post hanteras av systemet på &apos;%1&apos; och kan inte ändras här.</translation>
</message>
@@ -1408,7 +1546,7 @@ Objekt som tillåter radering kommer tas bort om de förhindrar en mapp att tas
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Mapp</translation>
</message>
@@ -1423,35 +1561,45 @@ Objekt som tillåter radering kommer tas bort om de förhindrar en mapp att tas
<translation>Visa ignorerade filer</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation>Kopiera fellistan till klippbordet.</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Kopiera</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Tid</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Fil</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation>Fel</translation>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1477,36 +1625,48 @@ Objekt som tillåter radering kommer tas bort om de förhindrar en mapp att tas
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Rensa</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Rensa loggfönstret.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>S&amp;para</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Spara loggfilen till en fil på disk för felsökning.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Spara loggfil</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Fel</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>Kunde inte skriva till loggfilen %1</translation>
</message>
@@ -1514,12 +1674,12 @@ Objekt som tillåter radering kommer tas bort om de förhindrar en mapp att tas
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Fel</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;Filen &apos;%1&apos;&lt;br/&gt;kan inte öppnas för skrivning.&lt;br/&gt;&lt;br/&gt;Loggtexten kan &lt;b&gt;inte&lt;/b&gt; sparas!&lt;/nobr&gt;</translation>
</message>
@@ -1527,27 +1687,27 @@ Objekt som tillåter radering kommer tas bort om de förhindrar en mapp att tas
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Ny version tillgänglig</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;En ny version av %1 klienten är tillgänglig.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; är tillgänglig för nedladdning. Den installerade versionen är %3.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Hoppa över denna version</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Hoppa över denna gång</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Hämta uppdatering</translation>
</message>
@@ -1635,27 +1795,27 @@ Objekt som tillåter radering kommer tas bort om de förhindrar en mapp att tas
<translation>Begränsa automatiskt</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Hostnamn för proxyserver</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Användarnamn för proxyserver</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Lösenord för proxyanvändare</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>HTTP(S) proxy</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>SOCKS5 proxy</translation>
</message>
@@ -1663,23 +1823,23 @@ Objekt som tillåter radering kommer tas bort om de förhindrar en mapp att tas
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>Skapad %1</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>Stänger om ett par sekunder...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation>%1 begäran misslyckades %2</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation>&apos;%1&apos; vald %2</translation>
@@ -1688,32 +1848,32 @@ Objekt som tillåter radering kommer tas bort om de förhindrar en mapp att tas
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation>Fel returnerat från server: &lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation>Kunde inte para JSON som returnerades från servern: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation>Svaret från servern innehöll inte alla förväntade fält</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation>&lt;h1&gt;Inloggningsfel&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation>Fel användare&lt;/h1&gt;&lt;p&gt; Du har loggat in med fel användare &lt;em&gt;%1&lt;/em&gt;, men måste logga in med &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Vänligen logga ut från %3 i en annan flik, sen &lt;a href=&apos;%4&apos;&gt;klicka här &lt;/a&gt; och logga in som användare %2&lt;/p&gt;</translation>
</message>
@@ -1721,59 +1881,59 @@ Objekt som tillåter radering kommer tas bort om de förhindrar en mapp att tas
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Ny %1 uppdatering tillgänglig</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>En ny uppdatering för %1 kommer installeras. Programmet kan be om
ytterligare rättigheter under processen.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>Laddar ner version %1. Var god vänta...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>Kunde inte ladda ner uppdateringen. Klicka &lt;a href=&apos;%1&apos;&gt;här&lt;/a&gt; för att ladda ner uppdateringen manuellt.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Kunde inte söka efter uppdateringar.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>%1 version %2 tillgänglig. Starta om programmet för att starta uppdateringen.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>Ny %1 version %2 tillgänglig. Var vänlig använd systemets verktyg för uppdateringar för att installera versionen.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Kontrollerar uppdateringsservern...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>Uppdateringsstatus är okänd: Gjorde ingen kontroll av nya uppdateringar.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>Inga uppdateringar tillgängliga. Din installation är redan den senaste versionen.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Uppdateringskontroll</translation>
</message>
@@ -1781,43 +1941,43 @@ ytterligare rättigheter under processen.</translation>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>Anslut till %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Inställningar för lokala mappar.</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Anslut...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1 mappen &apos;%2&apos; är synkroniserad mot den lokala mappen &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>Synka mappen &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Varning:&lt;/strong&gt; Den lokala mappen är inte tom. Välj alternativ!&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Lokal mapp för synkning</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1876,15 +2036,20 @@ ytterligare rättigheter under processen.</translation>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>Anslut till %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation>Logga in i din webbläsare</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation>Kopiera länk till urklipp</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1915,153 +2080,163 @@ Det är inte lämpligt använda den.</translation>
<source>&amp;Next &gt;</source>
<translation>&amp;Nästa &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>Ogiltig URL</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Lyckades ansluta till %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Misslyckades att ansluta till %1 vid %2:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>Försök att ansluta till %1 på %2 tog för lång tid.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Försöker ansluta till %1 på %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>Den autentiserade begäran till servern omdirigerades till &apos;%1&apos;. Den URLen är ogiltig, server är felkonfigurerad.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>Det kom ett ogiltigt svar på en autentiserad webdav-begäran</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>Åtkomst förbjuden av servern. För att bekräfta att du har korrekta rättigheter, &lt;a href=&quot;%1&quot;&gt;klicka här&lt;/a&gt; för att ansluta till tjänsten med din webb-läsare.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>Ogiltig URL</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation>Servern svarade med följande fel:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>Lokal synkmapp %1 finns redan, aktiverar den för synk.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>Skapar lokal synk-mapp %1...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>ok</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>misslyckades.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>Kunde inte skapa lokal mapp %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>Ingen fjärrmapp specificerad! </translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Fel: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>skapar mapp på ownCloud: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>Fjärrmapp %1 har skapats.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>Fjärrmappen %1 finns redan. Ansluter den för synkronisering.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>Skapande av mapp resulterade i HTTP felkod %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>Det gick inte att skapa mappen efter som du inte har tillräckliga rättigheter!&lt;br/&gt;Vänligen återvänd och kontrollera dina rättigheter.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Misslyckades skapa fjärrmappen, troligen p.g.a felaktiga inloggningsuppgifter.&lt;/font&gt;&lt;br/&gt;Kontrollera dina inloggningsuppgifter.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>Misslyckades skapa fjärrmapp %1 med fel &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>En synkroniseringsanslutning från %1 till fjärrmappen %2 har skapats.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Ansluten till %1!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>Anslutningen till %1 kunde inte etableras. Var god kontrollera och försök igen.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Omdöpning av mapp misslyckades</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>Kan inte ta bort och göra en säkerhetskopia av mappen på grund av att mappen eller en fil i den används av ett annat program. Vänligen stäng mappen eller filen och försök igen eller avbryt installationen.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Lokal synkmapp %1 skapad!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2069,14 +2244,31 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>%1 Anslutningsguiden</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Hoppa över konfiguration utav mappar</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2100,7 +2292,7 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>Ogiltigt JSON-svar från hämtnings-URLen</translation>
</message>
@@ -2108,7 +2300,7 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>Fel vid skrivning av metadata till databasen</translation>
</message>
@@ -2116,47 +2308,47 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>Fil %1 kan inte laddas ner på grund av namnkonflikt med en lokal fil!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation>Nedladdningen skulle reducera det fria diskutrymmet under gränsen</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>Ledigt utrymme är under %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>Filen har tagits bort från servern</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>Filen kunde inte laddas ner fullständigt.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation>Den nedladdade filen är tom men servern sa att den skulle vara %1.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>Fil %1 kan inte sparas eftersom namnet krockar med en lokal fil!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>Filen har ändrats sedan upptäckten</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>Fel vid skrivning av metadata till databasen</translation>
</message>
@@ -2164,12 +2356,12 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; Återställning misslyckades: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation>En fil eller mapp togs bort från en skrivskyddad delning, men återställning misslyckades: %1</translation>
</message>
@@ -2177,22 +2369,22 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>kunde inte ta bort fil %1, fel: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>Observera, eventuell skiftlägeskänslig konflikt med %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>kunde inte skapa mapp %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>Fel vid skrivning av metadata till databasen</translation>
</message>
@@ -2200,17 +2392,17 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>Fel vid borttagning &apos;%1&apos;: %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>Kunde inte ta bort mapp &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>Det gick inte att ta bort %1 på grund av ett lokalt filnamn</translation>
</message>
@@ -2218,13 +2410,13 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>Filen %1 kan inte döpas om till %2 på grund av ett lokalt filnamn</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>Fel vid skrivning av metadata till databasen</translation>
</message>
@@ -2232,12 +2424,7 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>Den här filen har tagits bort från en endast-läsbar delning. Den återställdes.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>Felaktig HTTP-kod i svaret från servern. &apos;204&apos; förväntades, men &quot;%1 %2&quot; mottogs.</translation>
</message>
@@ -2245,12 +2432,12 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Felaktig HTTP-kod i svaret från servern. &apos;201&apos; förväntades, men &quot;%1 %2&quot; mottogs.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>Fel vid skrivning av metadata till databasen</translation>
</message>
@@ -2258,28 +2445,13 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Denna mapp får inte byta namn. Den kommer att döpas om till sitt ursprungliga namn.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Denna mapp får ej döpas om. Vänligen döp den till Delad igen.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>En fil döptes om men är en del av en endast-läsbar delning. Original filen återställdes.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Felaktig HTTP-kod i svaret från servern. &apos;201&apos; förväntades, men &quot;%1 %2&quot; mottogs.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>Fel vid skrivning av metadata till databasen</translation>
</message>
@@ -2287,33 +2459,33 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Filen Raderad</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>Lokal fil ändrades under synkningen. Den kommer återupptas.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>Lokal fil ändrades under synk.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation>Uppladdningen av %1 överstiger kvoten för mappen</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>Fel vid skrivning av metadata till databasen</translation>
</message>
@@ -2321,27 +2493,27 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>Den lokala filen togs bort under synkronisering.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>Lokal fil ändrades under synk.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation>Oväntad svarskod från servern (%1)</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation>Saknar Fil-ID från servern</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation>Saknar ETag från servern</translation>
</message>
@@ -2349,27 +2521,22 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>Filen ändrades lokalt men är en del av en endast-läsbar delning. Den återställdes och din editering är i konflikt filen.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>Hämtnings-URL saknas</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>Den lokala filen togs bort under synkronisering.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>Lokal fil ändrades under synk.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation>Servern bekräftade inte senaste leveransen. (Ingen e-tagg fanns)</translation>
</message>
@@ -2387,42 +2554,47 @@ Det är inte lämpligt använda den.</translation>
<translation>Textetikett</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Öppna i webbläsare</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Tid</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Fil</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Mapp</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Ågärd</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Storlek</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>Lokalt synkprotokoll</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Kopiera</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Kopiera aktivitetslistan till urklipp.</translation>
</message>
@@ -2463,7 +2635,7 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Välj vad som ska synkas</translation>
</message>
@@ -2471,33 +2643,33 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Laddar ...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation>Avmarkera mappar du inte vill synkronisera.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Namn</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Storlek</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>Inga undermappar på servern för närvarande.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation>Ett fel uppstod när listan för submappar laddades.</translation>
</message>
@@ -2518,22 +2690,22 @@ Det är inte lämpligt använda den.</translation>
<translation>Inställningar</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Aktivitet</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Allmänt</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Nätverk</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Konto</translation>
</message>
@@ -2541,28 +2713,28 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Aktivitet</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Allmänt</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Nätverk</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Konto</translation>
</message>
@@ -2590,42 +2762,42 @@ Det är inte lämpligt använda den.</translation>
<translation>Sökväg till ownCloud:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>%1 Delning</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Mapp: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>Servern tillåter inte delning</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation>Tar emot maximal delningsbehörighet från servern...</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Filen kan inte delas eftersom den delades utan delningsrättigheter.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>Användare och grupper</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>Publika länkar</translation>
</message>
@@ -2638,7 +2810,17 @@ Det är inte lämpligt använda den.</translation>
<translation>Dela NewDocument.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>Textetikett</translation>
</message>
@@ -2668,19 +2850,24 @@ Det är inte lämpligt använda den.</translation>
<translation>Ange lösenord</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
- <translation>Länkegenskaper:</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>Visa fillistning</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Tillåt redigering</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2688,95 +2875,95 @@ Det är inte lämpligt använda den.</translation>
<translation>Vem som helst med länken kan komma åt filen eller mappen</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>L&amp;ösenordsskydda</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Lösenordsskyddad</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Filen kan inte delas eftersom den delades utan delningsrättigheter.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation>Delningslänkar har inaktiverats</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation>Skapa publik delningslänk</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Ta bort</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation>Öppna länk i webbläsare</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation>Kopiera länk till urklipp</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation>Kopiera länk till urklipp (direktnedladdning)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Skicka länk via e-post</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation>Skicka länk med e-post (direktnedladdning)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Avbryt</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation>Publik länk</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>Publik d&amp;elning kräver lösenord</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Var vänlig sätt lösenord</translation>
</message>
@@ -2799,32 +2986,32 @@ Det är inte lämpligt använda den.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation>Öppna länk i webbläsaren</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation>Kopiera länk till urklipp</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Skicka länk via e-post</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>Inga resultat för &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation>Jag delade något med dig</translation>
</message>
@@ -2837,37 +3024,38 @@ Det är inte lämpligt använda den.</translation>
<translation>Form</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>Textetikett</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>kan redigera</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>får dela</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>skapa</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>ändra</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>radera</translation>
</message>
@@ -2911,143 +3099,176 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>Dela med %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation>Jag delade något med dig</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation>Dela...</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation>Kopiera privat länk till urklipp</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation>Skicka privat länk med e-post...</translation>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Öppna i webbläsare</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Certifikatdetaljer&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Common Name (CN):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>Alternativnamn:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Organisation (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Organisationsenhet (OU):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Stat/Provins:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>Land:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Serienummer:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Utfärdare&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Utfärdare:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Utfärdat den:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Upphör den:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Fingeravtryck&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;Notera:&lt;/b&gt; Detta certifikat var manuellt godkänt.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (självsignerat certifikat)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>Denna anslutningen är krypterad med %1 bit %2
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation>Inget stöd för biljetter/identifikationer för SSL sessioner</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Certifikatinformation:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>Denna anslutningen är INTE säker eftersom den inte är krypterad.
@@ -3135,305 +3356,270 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Lyckades.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>CSync misslyckades med att ladda journalfilen. Journalfilen är korrupt.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;Plugin %1 för csync kunde inte laddas.&lt;br/&gt;Var god verifiera installationen!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>CSync fatal parameter fel.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>CSync processteg update misslyckades.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>CSync processteg reconcile misslyckades.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync kunde inte autentisera mot proxy. </translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSync misslyckades att hitta proxy eller server.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync misslyckades att autentisera mot %1 servern.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync misslyckades att ansluta mot nätverket.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>En timeout på nätverksanslutningen har inträffat.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>Ett HTTP överföringsfel inträffade.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation>Den monterade mappen är tillfälligt otillgänglig på servern</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>En fel inträffande under öppnandet av en mapp</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>Fel vid mappinläsning.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation>%1 (skippad på grund av ett tidigare fel, försök igen om %2)</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>Filen/Mappen är ignorerad för att den är dold.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation>Folder hierarkin är för djup </translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation>Konflikt: Serverversion nedladdad, lokal kopia omdöpt och ej uppladdad.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation>Endast %1 tillgängligt, behöver minst %2 för att starta</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation>Kunde inte öppna eller återskapa den lokala synkroniseringsdatabasen. Säkerställ att du har skrivrättigheter till synkroniseringsmappen.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation>Otillåtet eftersom du inte har rättigheter att lägga till övermappar</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation>Otillåtet eftersom du inte har rättigheter att lägga till filer i den mappen.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation>Diskutrymmet är lågt: Nedladdningar som reduceringar det fria utrymmet under %1 skippades.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation>Det finns inte tillräckligt med utrymme på servern för vissa uppladdningar.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: Ingen plats på %1 server tillgänglig.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>CSync ospecificerat fel.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Avbruten av användare</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>CSync misslyckades med att läsa</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
- <translation>CSync misslyckades med att ladda eller skapa journalfilen. Säkerställ att du har rättigheter att läsa och skriva i den lokala synkmappen.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
- <translation>CSync misslyckades på grund av ohanterad avslagning av rättighet.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
- <translation>CSync försökte skapa en mapp som redan finns.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>Tjänsten är tillfälligt otillgänglig</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>Tillgång förbjuden</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>Ett internt fel nummer %1 inträffade.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>Symboliska länkar stöds ej i synkningen.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>Filen är listad i ignorerings listan.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation>Filnamn som slutar med punkt stöds inte i det här filsystemet.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation>Filnamn som innehåller tecknet &apos;%1&apos; stöds inte i det här filsystemet.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation>Filnamnet är ett reserverat namn i detta filsystemet.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation>Filnamn innehåller mellanslag i slutet.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>Filnamnet är för långt.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation>Olöst konflikt.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>Stat misslyckades.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>Filnamnskodning är inte giltig</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>Otillåtna tecken, var vänlig byt namn på &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation>Kunde inte läsa svartlistan från den lokala databasen</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation>Kunde inte läsa från synk-journalen.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>Kunde inte öppna synk journalen</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>Filnamnet innehåller minst ett ogiltigt tecken</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>Ignorerad eftersom den är svartlistad i &quot;välj vad som ska synkas&quot; </translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation>Otillåtet eftersom du inte har rättigheter att lägga till undermappar i den mappen.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>Inte behörig att ladda upp denna fil då den är skrivskyddad på servern, återställer </translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>Inte behörig att radera, återställer</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>Lokala filer och mappar som är delade är borttagna.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>Det gick inte att genomföra flytten, objektet återställs</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>Det gick inte att genomföra flytten då %1 är skrivskyddad</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>destinationen</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>källan</translation>
</message>
@@ -3457,17 +3643,17 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Version %1. För mer information vänligen besök &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;Distribueras av %1 och licenserad under GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 och %2 logotyp är registrerade varumärken av %1 i Förenta Staterna, andra länder, eller både och.&lt;/p&gt;</translation>
</message>
@@ -3498,81 +3684,81 @@ Det är inte lämpligt använda den.</translation>
<translation>Vänliga logga in</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Mapp %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Det finns inga synkmappar konfigurerade.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Öppna i webbläsare</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Logga in...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Logga ut</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Senaste ändringar</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>Kollar efter ändringar i &apos;%1&apos;</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Hanterade mappar:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Öppna mapp &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Öppna %1 i webbläsaren</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Okänd status</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Inställningar...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Detaljer...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Hjälp</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>Avsluta %1</translation>
</message>
@@ -3587,11 +3773,6 @@ Det är inte lämpligt använda den.</translation>
<translation>Serverversion stöds inte</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation>Servern på konto %1 kör en gammal version %2 som inte längre stöds. Att använda den här klienten med den serverversionen är otestat och potentiellt farligt. Fortsätt på egen risk.</translation>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Bortkopplad</translation>
@@ -3623,116 +3804,129 @@ Det är inte lämpligt använda den.</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation>Fel vid synkronisering</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation>Inga mappar valda för synkronisering</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation>Sluta pausa alla mappar</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>Pausa alla mappar</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>Sluta pausa all synkroinisering</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>Sluta pausa synkronisering</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>Pausa all synkronisering</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>Pausa synkronisering</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Logga ut från alla konton</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Logga in på alla konton...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>Nytt konto...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>Om %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>Krascha nu</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Inga filer har synkroniseras nyligen</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Synkroniserar %1 av %2 (%3 kvar)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation>Synkroniserar %1 av %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Synkroniserar %1 (%2 kvar)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>Synkroniserar %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Aktuell version</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Version %2. För mer information besök &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Fär kända fel och hjälp, vänligen besök: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;Av Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, och andra.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensierad under GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud och ownCloud Logo är registrerade varumärken till ownCloud GmbH i USA, andra länder, eller båda.&lt;/p&gt;</translation>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3744,9 +3938,9 @@ Det är inte lämpligt använda den.</translation>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>Textetikett</translation>
</message>
@@ -3782,11 +3976,22 @@ Det är inte lämpligt använda den.</translation>
<translation>Fråga innan synkronisering av e&amp;xterna lagringsytor</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Välj vad som ska synkas</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>&amp;Lokal mapp</translation>
@@ -3803,11 +4008,16 @@ Det är inte lämpligt använda den.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>S&amp;ynka allt från servern</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Statusmeddelande</translation>
</message>
@@ -3844,8 +4054,8 @@ Det är inte lämpligt använda den.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
- <translation>Ett fel inträffade vid anslutningen. Vänligen försök igen.</translation>
+ <source>An error occurred while connecting. Please try again.</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="56"/>
@@ -4024,7 +4234,7 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;Byggd från Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; den %3, %4 med Qt %5, %6&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4122,52 +4332,52 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Odefinierad status</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Väntar på att starta synkronisering</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>Synkronisering är aktiv</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Lyckad synkronisering</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Synk lyckades, men vissa filer ignorerades.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Synkfel</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Inställningsfel</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Förbereder synkronisering</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Avbryter</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>Synk är pausad</translation>
</message>
@@ -4175,22 +4385,22 @@ Det är inte lämpligt använda den.</translation>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation>Kunde inte öppna webbläsaren</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation>Det uppstod ett fel när webbläsaren öppnades för URL %1. Kanske det inte finns någon standard webbläsare vald?</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation>Kunde inte öppna e-postklient</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation>Det uppstod ett fel när e-postklienten skulle startas för att skapa ett nytt meddelande. Kanske är ingen standard-e-postklient konfigurerad?</translation>
</message>
diff --git a/translations/client_th.ts b/translations/client_th.ts
index 30d42c15e..11de6ebf0 100644
--- a/translations/client_th.ts
+++ b/translations/client_th.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="th_TH" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation>ไม่สามารถสร้างไดเรกทอรีในถังขยะ</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation>ย้ายข้อมูลจาก &apos;%1&apos; ไป &apos;%1&apos; ไม่ได้</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation>การย้ายไปที่ถังขยะยังใช้งานไม่ได้บนแพลตฟอร์มนี้</translation>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,17 +95,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>หมดเวลาการเชื่อมต่อ</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation>ข้อผิดพลาดที่ไม่รู้จัก: การตอบกลับของเครือข่ายถูกลบแล้ว</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation>เซิร์ฟเวอร์ตอบกลับ &quot;%1 %2&quot; ถึง &quot;%3 %4&quot;</translation>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>ยกเลิก</translation>
</message>
@@ -166,184 +185,184 @@
<translation>บัญชี</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>เลือกข้อมูลที่ต้องการประสาน</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>บังคับประสานข้อมูลเดี๋ยวนี้</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>ประสานข้อมูลอีกครั้ง</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>ลบโฟลเดอร์ที่ประสานข้อมูลออก</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>สร้างโฟลเดอร์ล้มเหลว</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;ไม่สามารถสร้างโฟลเดอร์ต้นทาง &lt;i&gt;%1&lt;/i&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>ยืนยันการลบโฟลเดอร์ที่ประสานข้อมูลออก</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>ลบโฟลเดอร์ที่ประสานข้อมูล</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>กำลังประสานข้อมูล</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>กำลังดำเนินการประสานข้อมูลอยู่ &lt;br/&gt;คุณต้องการสิ้นสุดการทำงาน?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 กำลังถูกใช้งาน</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 เช่น &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>เซิร์ฟเวอร์เวอร์ชัน %1 เป็นรุ่นเก่าและไม่ได้รับการสนับสนุน! ดำเนินการความเสี่ยงด้วยคุณเอง</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>เชื่อมต่อกับ %1</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>เซิร์ฟเวอร์ %1 ไม่สามารถใช้ได้ชั่วคราว</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation>เซิร์ฟเวอร์ %1 กำลังอยู่ในโหมดการบำรุงรักษา</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>ลงชื่อออกจาก %1</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation>กำลังได้รับอนุญาตจากเบราเซอร์ &lt;a href=&apos;%1&apos;&gt;คลิกที่นี่&lt;/a&gt; เพื่อเปิดเบราเซอร์อีกครั้ง</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation>กำลังเชื่อมต่อไปยัง %1...</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>ไม่มีการเชื่อมต่อไปยัง %1 ที่ %2</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>เข้าสู่ระบบ</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>บางโฟลเดอร์จะไม่ถูกประสานข้อมูลเพราะขนาดของมันใหญ่เกินไป:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>มีบางโฟลเดอร์จะไม่ถูกประสานข้อมูลเพราะเป็นพื้นที่จัดเก็บข้อมูลภายนอก</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation>มีบางโฟลเดอร์จะไม่ถูกประสานข้อมูลเพราะเป็นพื้นที่จัดเก็บข้อมูลภายนอกหรือมีขนาดที่ใหญ่เกินไป</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>ยืนยันการลบบัญชี</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;คุณต้องการลบการเชื่อมต่อกับบัญชี&lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;หมายเหตุ:&lt;/b&gt; นี้จะ &lt;b&gt;ไม่&lt;/b&gt; ลบไฟล์ใดๆ&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>ลบการเชื่อมต่อ</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>เปิดโฟลเดอร์</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>ออกจากระบบ</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>ประสานข้อมูลอีกครั้ง</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>หยุดประสานข้อมูลชั่วคราว</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;คุณต้องการที่จะหยุดการประสานข้อมูลโฟลเดอร์&lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;หมายเหตุ:&lt;/b&gt; นี้จะ &lt;b&gt;ไม่&lt;/b&gt; ลบไฟล์ใดๆ&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>มีการใช้งาน %1 (%3%) จาก %2 บางโฟลเดอร์รวมทั้งเครือข่ายที่ติดตั้งหรือโฟลเดอร์ที่แชร์อาจมีข้อจำกัดที่แตกต่างกัน</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>มีการใช้งาน %1 จาก %2</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>ขณะนี้ไม่มีพื้นที่จัดเก็บข้อมูลที่ใช้งานได้</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>ไม่มีการเชื่อมต่อ %1 ที่ถูกกำหนดค่า</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>ออกจากระบบ</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>ยกเลิกการเชื่อมต่อ</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>เชื่อมต่อ</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>ไม่สามารถให้บริการได้</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation>โหมดบำรุงรักษา</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>ข้อผิดพลาดของเครือข่าย</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>กำหนดค่าผิดพลาด</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation>กำลังขอข้อมูลการรับรอง</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>ไม่ระบุสถานะบัญชี</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>กิจกรรมของเซิร์ฟเวอร์</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>โปรโตคอลที่ใช้ในการผสานข้อมูล</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>ไม่ถูกประสานข้อมูลให้ตรงกัน</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>ไม่ถูกประสานข้อมูล (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>รายการกิจกรรมเซิร์ฟเวอร์ได้ถูกคัดลอกไปยังคลิปบอร์ด</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>รายการกิจกรรมการประสานข้อมูลได้ถูกคัดลอกไปยังคลิปบอร์ด</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>รายชื่อของรายการที่ไม่ได้ประสานข้อมูล ได้ถูกคัดลอกไปยังคลิปบอร์ด</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>คัดลอกไปยังคลิปบอร์ด</translation>
</message>
@@ -469,47 +488,47 @@
<translation>ป้ายข้อความ</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>กิจกรรมของเซิร์ฟเวอร์</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>คัดลอก</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>คัดลอกรายชื่อกิจกรรมไปยังคลิปบอร์ด</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>จำเป็นต้องทำ: การแจ้งเตือน</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br /&gt;บัญชี %1 ไม่มีกิจกรรมที่เปิดใช้งาน</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation><numerusform>คุณได้รับ %n การแจ้งเตือนใหม่จาก %2</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation><numerusform>คุณได้รับ %n การแจ้งเตือนใหม่จาก %1 และ %2</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>คุณได้รับการแจ้งเตือนใหม่จาก %1, %2 และผู้ใช้อื่นๆ</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>%1 การแจ้งเตือน - จำเป็นต้องดำเนินการ</translation>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation>กำลังทำต่อหมายถึง &lt;b&gt;กำลังลบการตั้งค่าเหล่านี้&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation>กำลังทำต่อหมายถึง &lt;b&gt;กำลังละเว้นการตั้งค่าเหล่านี้&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation>การตั้งค่าบางอย่างได้ถูกกำหนดค่าในเวอร์ชันที่ใหม่กว่าของไคลเอ็นต์นี้และเปิดใช้คุณลักษณะที่ไม่สามารถใช้ได้ในเวอร์ชันนี้ &lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;ไฟล์การตั้งค่าปัจจุบันได้ถูกสำรองข้อมูลไปที่ &lt;i&gt;%2&lt;/i&gt; แล้ว</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>ออก</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>ดำเนินการต่อ</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation>เกิดข้อผิดพลาดขณะกำลังเข้าถึงไฟล์กำหนดค่า</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation>เกิดข้อผิดพลาดขณะกำลังเข้าถึงไฟล์กำหนดค่า %1</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>ออกจาก ownCloud</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>ข้อผิดพลาดในการเขียนข้อมูลเมตาไปยังฐานข้อมูล</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>ไม่มีการกำหนดค่าบัญชี ownCloud </translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>การกำหนดค่าเซิร์ฟเวอร์สำหรับไคลเอ็นต์นี้เก่าเกินไป</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>กรุณาอัพเดทเซิร์ฟเวอร์ใหม่ใหม่ที่สุดและรีสตาร์ทไคลเอนต์</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>ข้อผิดพลาดในการตรวจสอบ: ทั้งชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>หมดเวลา</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>ระบุข้อมูลประจำตัวไม่ถูกต้อง</translation>
</message>
@@ -637,133 +681,162 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>ยกเลิกโดยผู้ใช้</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation>ไม่มีข้อมูลการตอบกลับจากการค้นหาไฟล์ในเซิร์ฟเวอร์</translation>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>โฟลเดอร์ต้นทาง %1 ไม่มีอยู่</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 ควรจะเป็นโฟลเดอร์ แต่ทำไม่ได้</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>ไม่สามารถอ่านข้อมูล %1 ได้</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 ได้ถูกลบออก</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 ได้ถูกดาวน์โหลด</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 ได้ถูกอัพเดทเรียบร้อยแล้ว</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 ได้ถูกเปลี่ยนชื่อเป็น %2</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 ได้ถูกย้ายไปยัง %2</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation><numerusform>%1 และ %n ไฟล์อื่นๆได้ถูกลบออก</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation><numerusform>%1 และ %n ไฟล์อื่นๆ ได้ถูกดาวน์โหลดเรียบร้อยแล้ว</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation><numerusform>%1 และ %n ไฟล์อื่นๆ ได้รับการอัพเดท</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation><numerusform>%1 และไฟล์อื่นๆอีก %n ไฟล์ได้ถูกเปลี่ยนชื่อเป็น %2</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation><numerusform>%1 และไฟล์อื่นๆอีก %n ไฟล์ได้ถูกย้ายไปยัง %2</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation><numerusform>%1 และ %n ไฟล์อื่นๆ เกิดปัญหาขณะประสานข้อมูล</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation>%1 มีปัญหาขณะประสานข้อมูล กรุณาตรวจสอบไฟล์ที่มีปัญหานั้น</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation><numerusform>%1 และไฟล์อื่นๆอีก %n ไฟล์ไม่สามารถประสานข้อมูลเนื่องจากเกิดข้อผิดพลาด กรุณาดูไฟล์ log สำหรับรายละเอียดเพิ่มเติม</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 ไม่สามารถประสานข้อมูลเนื่องจากมีข้อผิดพลาด สามารถดูไฟล์ log สำหรับรายละเอียดเพิ่มเติม</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>ความเคลื่อนไหวของการประสานข้อมูล</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>ไม่สามารถอ่าน ยกเว้นไฟล์ระบบ</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation>โฟลเดอร์ใหม่มีขนาดใหญ่กว่า %1 เมกะไบต์ ได้ถูกเพิ่ม: %2
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation>โฟลเดอร์ที่มีพื้นที่จัดเก็บข้อมูลภายนอกได้ถูกเพิ่ม
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation>กรุณาไปในส่วนของการตั้งค่าเพื่อเลือก ถ้าคุณต้องการจะดาวน์โหลด</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation>โฟลเดอร์ %1 ได้ถูกสร้างขึ้นแล้วแต่ยังไม่ได้ประสานข้อมูล</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation>ไฟล์ %1 ได้ถูกสร้างขึ้นแล้วแต่ยังไม่ได้ประสานข้อมูล</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation>ไม่สามารถติดตามการเปลี่ยนแปลงโฟลเดอร์ที่ประสานข้อมูลได้
+
+หมายความว่าการประสานข้อมูลของไคลเอ็นต์อาจยังไม่ได้อัพโหลดการเปลี่ยนแปลงในระบบทันทีและจะสแกนเฉพาะการเปลี่ยนแปลงที่ต้นทางและอัพโหลดไฟล์เหล่านั้นเป็นครั้งคราว (ทุกสองชั่วโมงตามค่าเริ่มต้น)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -774,7 +847,7 @@ If you decide to delete the files, they will be unavailable to you, unless you a
หากคุณตัดสินใจที่จะลบไฟล์ก็จะทำให้ไม่มีใครสามารถใช้งานโฟลเดอร์นี้ได้เพราะคุณเป็นเจ้าของ</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
@@ -784,22 +857,22 @@ If this was an accident and you decide to keep your files, they will be re-synce
ถ้าเรื่องนี้เป็นอุบัติเหตุและคุณตัดสินใจที่จะเก็บไฟล์ของคุณ ไฟล์ของคุณก็จะถูกประสานข้อมูลใหม่อีกครั้ง</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>ลบไฟล์ทั้งหมด?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>ลบไฟล์ทั้งหมด</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>เก็บไฟล์เอาไว้</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
@@ -808,17 +881,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
ไฟล์ปัจจุบันของคุณทั้งหมดจะถูกเขียนทับด้วยไฟล์เก่า คุณต้องการเก็บไฟล์ไว้?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>ตรวจพบการสำรองข้อมูล</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>ประสานข้อมูลปกติ</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>เก็บไฟล์ต้นทางเป็นไฟล์ที่มีปัญหา</translation>
</message>
@@ -826,116 +899,105 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>ไม่สามารถรีเซ็ตสถานะโฟลเดอร์</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>บนบันทึกการประสานข้อมูลเก่า &apos;%1&apos; แต่ไม่สามารถลบออกได้ กรุณาตรวจสอบให้แน่ใจว่าไม่มีแอพฯ หรือการทำงานใดๆที่ใช้มันอยู่</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation>(สำรองข้อมูล)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation>(สำรองข้อมูล %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>สถานะที่ยังไม่ได้ถูกกำหนด</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>กำลังรอเริ่มต้นการประสานข้อมูล</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>กำลังเตรียมการประสานข้อมูล</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>การประสานข้อมูลกำลังทำงาน</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>ประสานข้อมูลครั้งล่าสุดเสร็จเรียบร้อยแล้ว</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation>ซิงค์สำเร็จแต่ยังมีข้อขัดแย้งที่ยังไม่ได้รับการแก้ไข</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>การประสานข้อมูลสำเร็จ แต่มีคำเตือนในแต่ละไฟล์</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>ประสานข้อมูลครั้งล่าสุดเสร็จเรียบร้อยแล้ว</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>เกิดข้อผิดพลาดในการติดตั้ง</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>ยกเลิกผู้ใช้</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>การประสานข้อมูลถูกหยุดไว้ชั่วคราว</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (การประสานข้อมูลถูกหยุดชั่วคราว)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>เลือกโฟลเดอร์ไม่ถูกต้อง!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>เส้นทางที่เลือกไม่ใช่โฟลเดอร์!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>คุณมีสิทธิ์ที่จะเขียนโฟลเดอร์ที่เลือกนี้!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation>โฟลเดอร์ต้นทาง %1 ได้ถูกเก็บข้อมูลของพาทแล้ว ลิงค์เป้าหมายมีโฟลเดอร์ที่ประสานข้อมูลแล้ว โปรดเลือกอันอื่น!</translation>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation>โฟลเดอร์ต้นทางนี้ได้ถูกประสานข้อมูลกับเซิร์ฟเวอร์แล้ว โปรดเลือกโฟลเดอร์ต้นทางอื่นๆ!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>เนื้อหาโฟลเดอร์ต้นทาง %1 ได้ถูกใช้ไปแล้วในโฟลเดอร์ที่ประสานข้อมูล กรุณาเลือกอีกอันหนึ่ง!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>เนื้อหาของโฟลเดอร์ต้นทาง %1 ไดถูกใช้ไปแล้วในโฟลเดอร์ที่ประสานข้อมูล กรุณาเลือกอีกอันหนึ่ง!</translation>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation>โฟลเดอร์ต้นทาง %1 เป็นการเชื่อมโยงสัญลักษณ์
-เป้าหมายของลิงค์มีเนื้อหาที่ถูกใช้ไปแล้วในโฟลเดอร์ที่ประสานข้อมูล กรุณาเลือกอีกอันหนึ่ง!</translation>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -945,7 +1007,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>เพิ่มโฟลเดอร์ที่ต้องการประสานข้อมูล</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>กำลังประสานข้อมูลกับโฟลเดอร์ต้นทาง</translation>
</message>
@@ -980,7 +1042,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>ข้อผิดพลาดในขณะที่โหลดรายชื่อโฟลเดอร์จากเซิร์ฟเวอร์</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>ออกจากระบบ</translation>
</message>
@@ -995,115 +1057,133 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>มีข้อขัดแย้งที่ยังไม่ได้รับการแก้ไข คลิกเพื่อดูรายละเอียด</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>กำลังตรวจสอบการเปลี่ยนแปลงใน &apos;%1&apos;</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation>ไฟล์ใหม่กำลังสร้างเป็นไฟล์เสมือน</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation>กำลังตรวจหาการเปลี่ยนแปลงในรีโมต &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation>กำลังตรวจหาการเปลี่ยนแปลงที่ต้นทาง &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation>คืนค่าการเปลี่ยนแปลง</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>กำลังประสานข้อมูล %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>หรือ</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>ดาวน์โหลด %1/วินาที</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/วินาที</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>อัพโหลด</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/วินาที</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 ของ %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>เหลืออีก %5 ไฟล์, %1 ไฟล์จาก %2, %3 ไฟล์จาก %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 จาก %2, %3 จาก %4 ไฟล์</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>ไฟล์ %1 จาก %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>กรุณารอซักครู่...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>กำลังรออีก (%n) โฟลเดอร์...</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>กำลังเตรียมพร้อมในการประสานข้อมูล</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation>ปัญหานี้มักเกิดขึ้นเมื่อใช้ inotify watches ครบจำนวน ตรวจสอบรายละเอียดเพิ่มเติมได้ที่ คำถามที่พบบ่อย</translation>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>เพิ่มโฟลเดอร์ที่ต้องการประสานข้อมูล</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>เพิ่มการประสานข้อมูลให้ตรงกัน</translation>
</message>
@@ -1111,17 +1191,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>คลิกเพื่อเลือกโฟลเดอร์ในการประสานข้อมูล</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>ป้อนพาธไปยังโฟลเดอร์ต้นทาง</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>เลือกโฟลเดอร์ต้นฉบับ</translation>
</message>
@@ -1129,60 +1209,68 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>สร้างโฟลเดอร์รีโมท</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>ใส่ชื่อของโฟลเดอร์ใหม่ที่จะถูกสร้างขึ้นดังต่อไปนี้ &apos;%1&apos;:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>โฟลเดอร์ถูกสร้างขึ้นเรียบร้อยแล้วเมื่อ %1...</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>รับรองความถูกต้องล้มเหลวขณะกำลังเข้าถึง %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>ไม่สามารถสร้างโฟลเดอร์บน %1 กรุณาตรวจสอบด้วยตนเอง</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>รายการโฟลเดอร์ล้มเหลว ข้อผิดพลาด: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>เลือกตัวเลือกนี้เพื่อประสานข้อมูลบัญชีทั้งหมด</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>โฟลเดอร์นี้ถูกประสานข้อมูลอยู่แล้ว</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>คุณประสานข้อมูล &lt;i&gt;%1&lt;/i&gt; อยู่แล้ว ซึ่งมีโฟลเดอร์หลักเป็น &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation>ใช้ไฟล์เสมือนแทนการดาวน์โหลดเนื้อหาทันที (โหมดเบต้า)</translation>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;คําเตือน:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;คําเตือน:&lt;/b&gt;</translation>
</message>
@@ -1190,22 +1278,22 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>ไม่มี E-Tag ที่ได้รับจากเซิร์ฟเวอร์ กรุณาตรวจสอบ พร็อกซี่หรือเกตเวย์</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>เราได้รับ E-Tag ที่แตกต่างกันสำหรับการทำงาน กรุณาลองอีกครั้งในเวลาถัดไป</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>เซิร์ฟเวอร์ส่งคืนช่วงของเนื้อหาที่ผิด</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>หมดเวลาการเชื่อมต่อ</translation>
</message>
@@ -1228,23 +1316,38 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>สำหรับถาดของระบบ</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation>และช่องทาง</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation>รุ่นเสถียร</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation>รุ่นเบต้า</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>ขั้นสูง</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation>ถามก่อนที่จะประสานข้อมูลกับโฟลเดอร์ที่มีขนาดใหญ่กว่า</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>เมกะไบต์</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation>ถามก่อนที่จะประสานข้อมูลกับพื้นที่จัดเก็บข้อมูลภายนอก</translation>
</message>
@@ -1264,31 +1367,71 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>ใช้ไอคอนขาวดำ</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>แก้ไขและละเว้นการแก้ไขไฟล์</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation>แสดงการประสานข้อมูลโฟลเดอร์ และหน้าต่างการนำทางของ Explorer</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>แสดงรายงานความผิดพลาด</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>เกี่ยวกับเรา</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>อัพเดท</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>และเริ่มต้นใหม่ &amp;&amp; อัพเดท</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation>เปลี่ยนช่องทางการอัพเดท?</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation>กำหนดช่องทางอัพเดทการติดตั้งใดสำหรับไคลเอ็นต์ &quot;รุ่นเสถียร&quot; จะอัพเกรดที่เชื่อถือได้จาก &quot;รุ่นเบต้า&quot; อาจมีคุณลักษณะใหม่และการแก้ไขปัญหาแต่ยังไม่ได้รับการทดสอบอย่างละเอียด
+
+โปรดทราบว่าการเลือกนี้จะไม่สามารถดาวน์เกรดจากรุ่นเบต้าไปยังรุ่นเสถียรได้ ต้องรอให้รุ่นเสถียรใหม่กว่ารุ่นเบต้าก่อนถึงจะอัพเกรดเป็นรุ่นเสถียรได้</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation>ตกลง</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>ยกเลิก</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation>การแชร์เกิดข้อผิดพลาด</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation>ไม่สามารถเรียกคืนหรือสร้างลิงก์แชร์สาธารณะ ข้อผิดพลาด:
+
+%1</translation>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1356,7 +1499,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>ลบออก</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1365,27 +1508,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
รายการที่ลบจะถูกอนุญาตให้ลบถ้าพวกเขาป้องกันไม่ให้ไดเรกทอรีถูกลบออก นี้จะเป็นประโยชน์สำหรับข้อมูล meta</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>ไม่สามารถเปิดไฟล์</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>ไม่สามารถเขียนเปลี่ยนเป็น &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>เพิ่มการละเว้นรูปแบบ</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>เพิ่มการละเว้นรูปแบบใหม่:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>รายการนี้ถูกระบุโดยระบบที่ &apos;%1&apos; และไม่สามารถแก้ไขได้ในมุมมองนี้</translation>
</message>
@@ -1415,7 +1558,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>แฟ้มเอกสาร</translation>
</message>
@@ -1430,35 +1573,45 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation>แสดงไฟล์ที่ถูกเพิกเฉย</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation>มีปัญหามากเกินไป ทั้งหมดจะไม่ปรากฏที่นี่</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation>มีข้อขัดแย้งเกิดขึ้น โปรดตรวจสอบเอกสารเกี่ยวกับวิธีแก้ปัญหา</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation>คัดลอกรายการปัญหาไปยังคลิปบอร์ด</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>คัดลอก</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>เวลา</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>ไฟล์</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation>ปัญหา</translation>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation>มีข้อขัดแย้งเกิดขึ้น &lt;a href=&quot;%1&quot;&gt;ตรวจสอบเอกสารเกี่ยวกับวิธีแก้ปัญหา&lt;/a&gt;</translation>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1484,36 +1637,50 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation>เก็บ log แบบถาวร</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation>เมื่อเปิดใช้งานตัวเลือกนี้และยังไม่ได้ตั้งค่า log มันจะถูกบันทึกลงในโฟลเดอร์ชั่วคราวและจะหมดอายุภายในไม่กี่ชั่วโมง การตั้งค่านี้จะยังคงอยู่แม้ว่าไคลเอ็นต์จะรีสตาร์ท
+
+Log จะถูกเขียนเป็น %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>ล้าง</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>ล้างข้อมูลไฟล์ log ที่แสดงอยู่</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>&amp;บันทึก</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>บันทึกไฟล์ log บนดิสก์เพื่อตรวจสอบข้อผิดพลาด</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>บันทึกข้อมูลไฟล์ log</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>ข้อผิดพลาด</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>ไม่สามารถเขียนไฟล์ log %1</translation>
</message>
@@ -1521,12 +1688,12 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>ข้อผิดพลาด</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;ไฟล์ &apos;%1&apos;&lt;br/&gt;ไม่สามารถเปิดขึ้นมาเพื่อเขียนข้อมูลได้&lt;br/&gt;&lt;br/&gt;ผลลัพธ์ของไฟล์ log &lt;b&gt;ไม่สามารถ&lt;/b&gt; บันทึกข้อมูลได้!&lt;/nobr&gt;</translation>
</message>
@@ -1534,27 +1701,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>มีรุ่นใหม่ที่สามารถใช้งานได้</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;%1 มีรุ่นใหม่ของไคลเอ็นต์แล้ว&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; สามารถดาวน์โหลดได้ รุ่นที่ติดตั้งคือ %3</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>ข้ามรุ่นนี้</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>ข้ามเวลานี้</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>ได้รับการอัพเดท</translation>
</message>
@@ -1642,27 +1809,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation>จำกัดโดยอัตโนมัติ</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>ชื่อโฮสต์ของเซิร์ฟเวอร์พร็อกซี่</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>ชื่อผู้ใช้ของเซิร์ฟเวอร์พร็อกซี่</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>รหัสผ่านของเซิร์ฟเวอร์พร็อกซี่</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>พร็อกซี HTTP(S)</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>พร็อกซี SOCKS5</translation>
</message>
@@ -1670,23 +1837,23 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>ถูกสร้างแล้วที่ %1</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
- <translation>กำลังจะปิดในไม่กี่วินาที ...</translation>
+ <translation>กำลังจะปิดในอีกไม่กี่วินาที ...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation>%1 ร้องขอล้มเหลวที่ %2</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation>&apos;%1&apos; ได้เลือกแล้วที่ %2</translation>
@@ -1695,32 +1862,32 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation>เกิดข้อผิดพลาดจากเซิร์ฟเวอร์: &lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation>เกิดข้อผิดพลาดในการเข้าถึง &apos;โทเค็น&apos; ปลายทาง: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation>ไม่สามารถแยกวิเคราะห์ JSON ที่ส่งมาจากเซิร์ฟเวอร์: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation>การตอบกลับจากเซิร์ฟเวอร์ไม่ได้มีฟิลด์ที่ต้องการ</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation>&lt;h1&gt;เข้าสู่ระบบล้มเหลว&lt;/h1&gt;%1&lt;p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation>&lt;h1&gt;บัญผู้ใช้ไม่ถูกต้อง&lt;/h1&gt; &lt;p&gt;คุณลงชื่อเข้าใช้ด้วยบัญชีผู้ใช้ &lt;em&gt;%1&lt;/em&gt; คุณจะต้องลงชื่อเข้าใช้ด้วยบัญชี &lt;em&gt;%2&lt;/em&gt; &lt;br&gt;โปรดออกจากระบบ %3 ในแท็บอื่นแล้ว &lt;a href=&apos;%4&apos;&gt;คลิกที่นี่&lt;/a&gt; เพื่อเข้าสู่ระบบในฐานะผู้ใช้ &lt;/p&gt;</translation>
</message>
@@ -1728,58 +1895,58 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>มี %1 พร้อมอัพเดทใหม่</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>มีการอัพเดทใหม่สำหรับ %1 มันเกี่ยวกับการติดตั้ง การอัพเดทอาจจะถามสิทธิประโยชน์เพิ่มเติมในระหว่างกระบวนการ</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>กำลังดาวน์โหลดรุ่น %1 กรุณารอสักครู่...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>ไม่สามารถดาวน์โหลดการอัพเดท กรุณาคลิก&lt;a href=&apos;%1&apos;&gt;ที่นี่&lt;/a&gt; เพื่อดาวน์โหลดการอัพเดทด้วยตนเอง</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>ไม่สามารถตรวจสอบการอัพเดทใหม่</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>มี %1 รุ่น %2 พร้อมใช้งานแล้ว เริ่มต้นแอพพลิเคชันใหม่เพื่อเริ่มต้นการอัพเดท</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>มี %1 รุ่น %2 พร้อมใช้งานแล้ว กรุณาใช้เครื่องมืออัพเดทระบบเพื่อติดตั้ง</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>กำลังตรวจสอบการอัพเดทเซิร์ฟเวอร์...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>สถานะการอัพเดทที่ไม่รู้จัก: จะไม่มีการตรวจสอบการอัพเดทใหม่</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>ไม่พบการอัพเดท ตัวที่ติดตั้งเป็นเวอร์ชั่นล่าสุด</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>ตรวจสอบการอัพเดท</translation>
</message>
@@ -1787,43 +1954,43 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>เชื่อมต่อไปยัง %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>ตั้งค่าตัวเลือกโฟลเดอร์ต้นทาง</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>เชื่อมต่อ...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1 โฟลเดอร์ &apos;%2&apos; ถูกประสานข้อมูลไปยังโฟลเดอร์ต้นทาง &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>ประสานข้อมูลโฟลเดอร์ &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;คำเตือน:&lt;/strong&gt; โฟลเดอร์ต้นทางจะต้องไม่ว่างเปล่า เลือกความละเอียด!&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>ประสานโฟลเดอร์ต้นทาง</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1882,15 +2049,20 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>เชื่อมต่อไปยัง %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation>เข้าสู่ระบบในเบราเซอร์ของคุณ</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation>คัดลอกลิงก์ไปยังคลิปบอร์ด</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1921,153 +2093,163 @@ It is not advisable to use it.</source>
<source>&amp;Next &gt;</source>
<translation>และถัดไป &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>URL ไม่ถูกต้อง</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation>ไม่สามารถโหลดใบรับรอง รหัสผ่านไม่ถูกต้อง?</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;เชื่อมต่อกับ %1: %2 รุ่น %3 (%4) เสร็จเรียบร้อยแล้ว&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>ล้มเหลวในการเชื่อมต่อไปยัง %1 ที่ %2:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>หมดเวลาขณะที่พยายามเชื่อมต่อไปยัง %1 ที่ %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>กำลังพยายามเชื่อมต่อไปที่ %1 ที่ %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>คำขอการรับรองความถูกต้องไปยังเซิร์ฟเวอร์ที่ถูกเปลี่ยนเส้นทางไปยัง</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>มีการตอบสนองที่ไม่ถูกต้องที่จะร้องขอการรับรองความถูกต้องของ WebDAV</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>การเข้าถึงถูกระงับโดยเซิร์ฟเวอร์ เพื่อตรวจสอบว่าคุณมีการเข้าถึงที่เหมาะสม &lt;a href=&quot;%1&quot;&gt;คลิกที่นี่&lt;/a&gt; เพื่อรเข้าถึงบริการกับเบราว์เซอร์ของคุณ</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>URL ไม่ถูกต้อง</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation>เซิร์ฟเวอร์รายงานข้อผิดพลาดต่อไปนี้:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>ประสานข้อมูลโฟลเดอร์ต้นทาง %1 มีอยู่แล้ว กรุณาตั้งค่าเพื่อถ่ายข้อมูล &lt;br/&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>สร้างประสานข้อมูลโฟลเดอร์ต้นทาง %1...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>ตกลง</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>ล้มเหลว</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>ไม่สามารถสร้างผสานข้อมูลโฟลเดอร์ต้นทาง %1...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>ไม่มีโฟลเดอร์รีโมทที่ระบุ!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>ข้อผิดพลาด: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>กำลังสร้างโฟลเดอร์ใหม่บน ownCloud: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>โฟลเดอร์รีโมท %1 ถูกสร้างเรียบร้อยแล้ว</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>โฟลเดอร์รีโมทมี %1 อยู่แล้ว กำลังเชื่อมต่อเพื่อถ่ายโอนข้อมูล</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>การสร้างโฟลเดอร์ดังกล่าวส่งผลให้เกิดรหัสข้อผิดพลาด HTTP error code %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>สร้างโฟลเดอร์ระยะไกลล้มเหลวเนื่องจากมีข้อมูลผิดพลาด!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;การสร้างโฟลเดอร์รีโมทล้มเหลว ซึ่งอาจมีสาเหตุมาจากการกรอกข้อมูลส่วนตัวเพื่อเข้าใช้งานไม่ถูกต้อง.&lt;/font&gt;&lt;br/&gt;กรุณาย้อนกลับไปแล้วตรวจสอบข้อมูลส่วนตัวของคุณอีกครั้ง.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>การสร้างโฟลเดอร์ระยะไกล %1 ล้มเหลวเนื่องข้อผิดพลาด &lt;tt&gt;%2&lt;/tt&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>การเชื่อมต่อเผื่อประสานข้อมูลจาก %1 ไปที่ไดเร็กทอรี่ระยะไกล %2 ได้ถูกติดตั้งแล้ว</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>เชื่อมต่อไปที่ %1! สำเร็จ</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>การเชื่อมต่อกับ %1 ไม่สามารถดำเนินการได้ กรุณาตรวจสอบอีกครั้ง</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>เปลี่ยนชื่อโฟลเดอร์ล้มเหลว</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>ไม่สามารถลบและสำรองข้อมูลโฟลเดอร์เพราะโฟลเดอร์หรือไฟล์ในนั้นจะเปิดในโปรแกรมอื่นอยู่ กรุณาปิดโฟลเดอร์หรือไฟล์และกดลองใหม่อีกครั้งหรือยกเลิกการติดตั้ง</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;ประสานข้อมูลโฟลเดอร์ต้นทาง %1 ได้ถูกสร้างขึ้นเรียบร้อยแล้ว!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2075,14 +2257,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>%1 ตัวช่วยสร้างการเชื่อมต่อ</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>ข้ามการกำหนดค่าโฟลเดอร์</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation>เปิดใช้งานโหมดเบต้า?</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation>เมื่อเปิดใช้โหมด &quot;ไฟล์เสมือน&quot; จะไม่สามารถดาวน์โหลดไฟล์ได้ในทันที ไฟล์ &quot;%1&quot; ขนาดเล็กจะถูกสร้างขึ้นสำหรับแต่ละไฟล์ที่มีอยู่ในเซิร์ฟเวอร์ เนื้อหาสามารถดาวน์โหลดได้โดยใช้ไฟล์เหล่านี้หรือใช้เมนูบริบท
+
+นี่คือโหมดเบต้าหากคุณใช้งานแล้วพบปัญหาโปรดรายงานปัญหาที่เกิดขึ้น</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation>เปิดใช้งาน</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation>ไว้คราวหน้า</translation>
</message>
</context>
<context>
@@ -2106,7 +2307,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>ตอบกลับ JSON ไม่ถูกต้องจาก URL แบบสำรวจความคิดเห็น</translation>
</message>
@@ -2114,7 +2315,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>ข้อผิดพลาดในการเขียนข้อมูลเมตาไปยังฐานข้อมูล</translation>
</message>
@@ -2122,47 +2323,47 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>ไฟล์ %1 ไม่สามารถดาวน์โหลดได้เพราะชื่อไฟล์ต้นทางเหมือนกัน!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation>การดาวน์โหลดจะช่วยลดพืนที่จัดเก็บภายในเครื่องที่ต่ำกว่าขีดจำกัด</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>พื้นที่ว่างในดิสก์น้อยกว่า %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>ไฟล์ถูกลบออกจากเซิร์ฟเวอร์</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>ดาวน์โหลดไฟล์ไม่สำเร็จ</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation>ไฟล์ที่ดาวน์โหลดว่างเปล่าแม้ว่าเซิร์ฟเวอร์ประกาศว่าควรจะเป็น %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>ไฟล์ %1 ไม่สามารถบันทึกได้เพราะชื่อไฟล์ต้นทางเหมือนกัน!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>ไฟล์มีการเปลี่ยนแปลงตั้งแต่ถูกพบ</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>ข้อผิดพลาดในการเขียนข้อมูลเมตาไปยังฐานข้อมูล</translation>
</message>
@@ -2170,12 +2371,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; ฟื้นฟูล้มเหลว: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation>ไฟล์หรือโฟลเดอร์ที่ถูกลบออกจากส่วนการอ่านเพียงอย่างเดียว แต่ล้มเหลวในการฟื้นฟู: %1</translation>
</message>
@@ -2183,22 +2384,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>ไม่สามารถลบไฟล์ %1, ข้อผิดพลาด: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>คำเตือน เคสที่เป็นไปไม่ได้มีผลกับ %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>ไม่สามารถสร้างโฟลเดอร์ %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>ข้อผิดพลาดในการเขียนข้อมูลเมตาไปยังฐานข้อมูล</translation>
</message>
@@ -2206,17 +2407,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>ข้อผิดพลาดขณะกำลังลบ &apos;%1&apos;: %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>ไม่สามารถลบโฟลเดอร์ &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>ไม่สามารถลบ %1 เพราะชื่อไฟล์ต้นทางเหมือนกัน!</translation>
</message>
@@ -2224,13 +2425,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>ไฟล์ %1 ไม่สามารถเปลี่ยนชื่อเป็น %2 เพราะชื่อไฟล์ต้นทางตรงกัน!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>ข้อผิดพลาดในการเขียนข้อมูลเมตาไปยังฐานข้อมูล</translation>
</message>
@@ -2238,12 +2439,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>ไฟล์ถูกลบออกจากการแชร์เพื่ออ่านเพียงอย่างเดียว ได้รับการกู้คืน</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>รหัส HTTP ผิดพลาด โดยเซิร์ฟเวอร์คาดว่าจะได้รับรหัส 204 แต่กลับได้รับ &quot;%1 %2&quot;</translation>
</message>
@@ -2251,12 +2447,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>รหัส HTTP ผิดพลาด โดยเซิร์ฟเวอร์คาดว่าจะได้รับรหัส 201 แต่กลับได้รับ &quot;%1 %2&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>ข้อผิดพลาดในการเขียนข้อมูลเมตาไปยังฐานข้อมูล</translation>
</message>
@@ -2264,28 +2460,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>โฟลเดอร์นี้จะต้องไม่ถูกเปลี่ยนชื่อ มันจะถูกเปลี่ยนกลับไปใช้ชื่อเดิม</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>โฟลเดอร์นี้จะต้องไม่ถูกเปลี่ยนชื่อ กรุณาตั้งชื่อมันให้เหมือนตอนที่แชร์</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>ไฟล์ที่ถูกเปลี่ยนชื่อ แต่เป็นส่วนหนึ่งของการแชร์เพื่ออ่านเพียงอย่างเดียว ไฟล์ต้นฉบับจะถูกกู้คืน</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>รหัส HTTP ผิดพลาด โดยเซิร์ฟเวอร์คาดว่าจะได้รับรหัส 201 แต่กลับได้รับ &quot;%1 %2&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>ข้อผิดพลาดในการเขียนข้อมูลเมตาไปยังฐานข้อมูล</translation>
</message>
@@ -2293,33 +2474,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation>ไม่สามารถอัพโหลดไฟล์ %1 เนื่องจากมีไฟล์อื่นที่มีชื่อเดียวกันอยู่แล้ว</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>ไฟล์ถูกลบไปแล้ว</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>ไฟล์ต้นทางถูกเปลี่ยนแปลงในระหว่างการซิงค์ มันจะกลับมา</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>ไฟล์ต้นทางถูกเปลี่ยนแปลงขณะกำลังประสานข้อมูล</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation>การอัพโหลด %1 เกินโควต้าของโฟลเดอร์</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>ข้อผิดพลาดในการเขียนข้อมูลเมตาไปยังฐานข้อมูล</translation>
</message>
@@ -2327,27 +2508,27 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>ไฟล์ต้นทางถูกลบออกในระหว่างการประสานข้อมูล</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>ไฟล์ต้นทางถูกเปลี่ยนแปลงขณะกำลังประสานข้อมูล</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation>มีรหัสข้อผิดพลาดตอบกลับมาจากเซิร์ฟเวอร์ (%1)</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation>ไฟล์ไอดีได้หายไปจากเซิร์ฟเวอร์</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation>ETag ได้หายไปจากเซิร์ฟเวอร์</translation>
</message>
@@ -2355,27 +2536,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>ไฟล์ต้นทางได้ถูกแก้ไขแต่เป็นส่วนหนึ่งของการแชร์ให้สามารถอ่านได้อย่างเดียว มันถูกกู้คืนและการแก้ไขของคุณอยู่ในไฟล์ที่มีปัญหา</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>URL แบบสำรวจความคิดเห็นหายไป</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>ไฟล์ต้นทางถูกลบออกในระหว่างการประสานข้อมูล</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>ไฟล์ต้นทางถูกเปลี่ยนแปลงขณะกำลังประสานข้อมูล</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation>เซิร์ฟเวอร์ไม่ยอมรับส่วนสุดท้าย (ไม่มี e-tag ในปัจจุบัน)</translation>
</message>
@@ -2393,42 +2569,47 @@ It is not advisable to use it.</source>
<translation>ป้ายข้อความ</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>เปิดในเบราว์เซอร์</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>เวลา</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>ไฟล์</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>แฟ้มเอกสาร</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>การกระทำ</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>ขนาด</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>โปรโตคอลการประสานข้อมูลต้นทาง</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>คัดลอก</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>คัดลอกรายชื่อกิจกรรมไปยังคลิปบอร์ด</translation>
</message>
@@ -2469,7 +2650,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>เลือกสิ่งที่ต้องการประสานข้อมูล</translation>
</message>
@@ -2477,33 +2658,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>กำลังโหลด ...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation>ไม่ต้องเลือกรีโมทโฟลเดอร์ที่คุณไม่ต้องการประสานข้อมูล</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>ชื่อ</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>ขนาด</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>ไม่มีโฟลเดอร์ย่อยอยู่บนเซิร์ฟเวอร์</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation>เกิดข้อผิดพลาดขณะโหลดรายชื่อของโฟลเดอร์ย่อย</translation>
</message>
@@ -2524,22 +2705,22 @@ It is not advisable to use it.</source>
<translation>ตั้งค่า</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>กิจกรรม</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>ทั่วไป</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>เครือข่าย</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>บัญชี</translation>
</message>
@@ -2547,28 +2728,28 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>กิจกรรม</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>ทั่วไป</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>เครือข่าย</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>บัญชี</translation>
</message>
@@ -2596,44 +2777,44 @@ It is not advisable to use it.</source>
<translation>พาธ ownCloud:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>กำลังแชร์ %1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>โฟลเดอร์: %2 </translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>เซิร์ฟเวอร์ไม่อนุญาตให้แชร์</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation>คุณใช้สิทธิ์การเรียกข้อมูลจากเซิฟเวอร์สูงสุดแล้ว</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>ไม่สามารถแชร์ไฟล์เพราะไม่ได้รับอนุญาต</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>ผู้ใช้และกลุ่ม</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
- <translation>ลิงค์สาธารณะ</translation>
+ <translation>ลิงก์สาธารณะ</translation>
</message>
</context>
<context>
@@ -2644,7 +2825,17 @@ It is not advisable to use it.</source>
<translation>แชร์ NewDocument.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation>เฉพาะอัพโหลด (วางไฟล์)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation>รับไฟล์จากบุคคลอื่นโดยไม่ต้องเปิดเผยเนื้อหาของโฟลเดอร์</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>ป้ายข้อความ</translation>
</message>
@@ -2656,7 +2847,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="35"/>
<source>Enter a name to create a new public link...</source>
- <translation>ป้อนชื่อเพื่อสร้างลิงค์สาธารณะใหม่...</translation>
+ <translation>ป้อนชื่อเพื่อสร้างลิงก์สาธารณะใหม่...</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="42"/>
@@ -2674,115 +2865,120 @@ It is not advisable to use it.</source>
<translation>ตั้งรหัสผ่าน</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
- <translation>คุณสมบัติของลิงค์:</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
+ <translation>ผู้รับสามารถดูหรือดาวน์โหลดเนื้อหา</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>แสดงรายชื่อไฟล์</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation>ดาวน์โหลดหรือดู</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>อนุญาตให้แก้ไข</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation>ดาวน์โหลด ดู หรืออัพโหลด</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation>ผู้รับสามารถดู ดาวน์โหลด แก้ไข ลบและอัพโหลดเนื้อหาได้</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
<source>Anyone with the link has access to the file/folder</source>
- <translation>ทุกคนที่มีลิงค์สามารถเข้าถึงไฟล์หรือโฟลเดอร์ได้</translation>
+ <translation>ทุกคนที่มีลิงก์สามารถเข้าถึงไฟล์หรือโฟลเดอร์ได้</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>ป้องกันด้วยรหัสผ่าน</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>รหัสผ่านถูกป้องกันแล้ว</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>ไม่สามารถแชร์ไฟล์เพราะไม่ได้รับอนุญาต</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
- <translation>แชร์ลิงค์แล้วถูกปิดใช้งาน</translation>
+ <translation>แชร์ลิงก์แล้วถูกปิดใช้งาน</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
- <translation>สร้างแชร์ลิงค์สาธารณะ</translation>
+ <translation>สร้างแชร์ลิงก์สาธารณะ</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>ลบ</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
- <translation>เปิดลิงค์ในเบราว์เซอร์</translation>
+ <translation>เปิดลิงก์ในเบราว์เซอร์</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
- <translation>คัดลอกลิงค์ไปยังคลิปบอร์ด</translation>
+ <translation>คัดลอกลิงก์ไปยังคลิปบอร์ด</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
- <translation>คัดลอกลิงค์ทางอีเมล (ดาวน์โหลดโดยตรง)</translation>
+ <translation>คัดลอกลิงก์ทางอีเมล (ดาวน์โหลดโดยตรง)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
- <translation>ส่งลิงค์ทางอีเมล</translation>
+ <translation>ส่งลิงก์ทางอีเมล</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
- <translation>ส่งลิงค์ทางอีเมล (ดาวน์โหลดโดยตรง)</translation>
+ <translation>ส่งลิงก์ทางอีเมล (ดาวน์โหลดโดยตรง)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation>ฉันได้แชร์ %1 กับคุณ</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
- <translation>ยืนยันการลบลิงค์ที่แชร์</translation>
+ <translation>ยืนยันการลบลิงก์ที่แชร์</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
- <translation>&lt;p&gt;คุณต้องการลบลิงค์ที่แชร์แบบสาธารณะ&lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;หมายเหตุ: ไม่สามารถยกเลิกการดำเนินการนี้ได้&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;คุณต้องการลบลิงก์ที่แชร์แบบสาธารณะ&lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;หมายเหตุ: ไม่สามารถยกเลิกการดำเนินการนี้ได้&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>ยกเลิก</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
- <translation>ลิงค์สาธารณะ</translation>
+ <translation>ลิงก์สาธารณะ</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
- <translation>ลบลิงค์ที่แชร์</translation>
+ <translation>ลบลิงก์ที่แชร์</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>การแชร์สาธารณะจำเป็นต้องมีรหัสผ่าน</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>กรุณาตั้งรหัสผ่าน</translation>
</message>
@@ -2805,32 +3001,32 @@ It is not advisable to use it.</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;คุณสามารถทำให้คนอื่นเข้าถึงไฟล์หรือโฟลเดอร์ที่คุณแชร์นี้ได้&lt;a href=&quot;private link menu&quot;&gt; &lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;โดยส่งลิงก์ส่วนตัวไปให้คนที่คุณต้องการแชร์&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation>รายการนี้ไม่ได้แชร์กับผู้ใช้หรือกลุ่มใดๆ</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation>คัดลอกลิงก์ไปยังคลิปบอร์ด</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation>คัดลอกลิงก์ไปยังคลิปบอร์ด</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
- <translation>ส่งลิงค์ทางอีเมล</translation>
+ <translation>ส่งลิงก์ทางอีเมล</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>ไม่มีผลลัพธ์สำหรับ &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation>ฉันแชร์บางอย่างกับคุณ</translation>
</message>
@@ -2843,37 +3039,38 @@ It is not advisable to use it.</source>
<translation>แบบฟอร์ม</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>ป้ายข้อความ</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>สามารถแก้ไข</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>สามารถแชร์ได้</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>สร้าง</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>เปลี่ยนแปลง</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>ลบ</translation>
</message>
@@ -2917,142 +3114,175 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>แชร์กับ %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation>แชร์เมนูบริบท</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation>ฉันแชร์บางอย่างกับคุณ</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation>แชร์...</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
- <translation>คัดลอกลิงค์ส่วนตัวไปยังคลิปบอร์ด</translation>
+ <translation>คัดลอกลิงก์ส่วนตัวไปยังคลิปบอร์ด</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
- <translation>ส่งลิงค์ส่วนตัวทางอีเมล...</translation>
+ <translation>ส่งลิงก์ส่วนตัวทางอีเมล...</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation>การแชร์ไฟล์นี้ต่อไม่ได้รับอนุญาต</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation>คัดลอกลิงก์สาธารณะไปยังคลิปบอร์ด</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>เปิดในเบราว์เซอร์</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation><numerusform>ดาวน์โหลดไฟล์แล้ว</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;รายละเอียดใบรับรองความถูกต้อง&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>ชื่อทั่วไป (Common Name):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>ชื่อเรื่องทางเลือก:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>องค์กร (Organization):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>หน่วยองค์กร (Organizational Unit):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>รัฐ/จังหวัด:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>ประเทศ:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Serial:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;แจ้งปัญหา&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>ผู้แจ้งปัญหา:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>ออกเมื่อวันที่:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>หมดอายุในวันที่:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;ลายนิ้วมือ&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;หมายเหตุ:&lt;/b&gt; ใบรับรองนี้ได้รับการอนุมัติด้วยตนเอง&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (ลงนามด้วยตนเอง)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>การเชื่อมต่อนี้ถูกเข้ารหัสโดยใช้ %1 บิต %2</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation>ไม่มีการสนับสนุนสำหรับเซสชั่นตั๋ว SSL/ตัวบ่งชี้</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>ข้อมูลการรับรอง:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>การเชื่อมต่อนี้ไม่มีความปลอดภัยเพราะมันไม่ได้เข้ารหัส</translation>
@@ -3139,306 +3369,271 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>เสร็จสิ้น</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>CSync ไม่สามารถโหลดไฟล์เจอร์นัล ไฟล์เจอร์นัลได้รับความเสียหาย</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;ปลั๊กอิน %1 สำหรับ csync ไม่สามารถโหลดได้.&lt;br/&gt;กรุณาตรวจสอบความถูกต้องในการติดตั้ง!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>พบข้อผิดพลาดเกี่ยวกับ CSync fatal parameter</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>การอัพเดทขั้นตอนการประมวลผล CSync ล้มเหลว</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>การอัพเดทขั้นตอนการประมวลผล CSync ล้มเหลว</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync ไม่สามารถรับรองความถูกต้องที่พร็อกซี่</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSync ไม่สามารถค้นหาพร็อกซี่บนเซิร์ฟเวอร์ได้</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync ล้มเหลวในการยืนยันสิทธิ์การเข้าใช้งานที่เซิร์ฟเวอร์ %1</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync ล้มเหลวในการเชื่อมต่อกับเครือข่าย</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>หมดเวลาการเชื่อมต่อเครือข่าย</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>เกิดข้อผิดพลาดเกี่ยวกับ HTTP transmission</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation>โฟลเดอร์ที่ติดตั้งชั่วคราว ไม่สามารถใช้งานบนเซิร์ฟเวอร์</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>เกิดข้อผิดพลาดบางอย่างขณะกำลังเปิดโฟลเดอร์</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>เกิดข้อผิดพลาดขณะกำลังอ่านโฟลเดอร์</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation>%1 (ข้ามไปเนื่องจากข้อผิดพลาดก่อนหน้านี้ กำลังลองอีกครั้งใน %2)</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>ไฟล์/โฟลเดอร์ ที่ซ่อนอยู่จะถูกละเว้น</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation>โฟลเดอร์มีโฟลเดอร์ย่อยเกินไป</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation>เกิดปัญหาความขัดแย้ง: สำเนาที่อยู่ในเครื่องถูกเปลี่ยนชื่อและไม่ได้ถูกอัพโหลด เลยไม่ตรงกับข้อมูลที่เคยอัพโหลดไว้ในเซิฟเวอร์</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation>มีเพียง %1 ที่พร้อมใช้งาน คุณจำเป็นต้องมีไม่น้อยกว่า %2 เพื่อเริ่มใช้งาน</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation>
ไม่สามารถเปิดหรือสร้างฐานข้อมูลการประสานข้อมูลในเครื่อง ตรวจสอบว่าคุณมีสิทธิ์การเขียนในโฟลเดอร์ซิงค์</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation>ไม่ได้รับอนุญาต เพราะคุณไม่มีสิทธิ์ที่จะเพิ่มโฟลเดอร์หลัก</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation>ไม่ได้รับอนุญาต เพราะคุณไม่มีสิทธิ์ที่จะเพิ่มไฟล์ในโฟลเดอร์นั้น</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation>พื้นที่จัดเก็บเหลือน้อย: การดาวน์โหลดจะช่วยลดพื้นที่ว่างด้านล่าง %1 ที่ถูกข้ามไป</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation>มีพื้นที่ว่างไม่เพียงพอบนเซิร์ฟเวอร์สำหรับการอัพโหลดบางรายการ</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: ไม่มีพื้นที่เหลือเพียงพอบนเซิร์ฟเวอร์ %1</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>CSync ไม่สามารถระบุข้อผิดพลาดได้</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>ยกเลิกโดยผู้ใช้</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>ล้มเหลวในการเข้าถึง CSync</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation>ไม่สามารถโหลดหรือสร้างไฟล์เจอร์นัล ตรวจสอบให้แน่ใจว่าคุณได้อ่านและเขียนสิทธิ์ในโฟลเดอร์ประสานข้อมูลที่ต้นทาง</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation>ขั้นตอนการค้นพบล้มเหลว</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation>การอนุญาตถูกปฏิเสธ</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
- <translation>CSync ผิดพลาด ไม่สามารถโหลดหรือสร้างไฟล์เจอร์นัล ให้แน่ใจว่าคุณได้อ่านและเขียนสิทธิ์ในการประสานโฟลเดอร์ต้นทาง</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
+ <translation>ไม่พบไฟล์หรือไดเรกทอรี:</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
- <translation>CSync ล้มเหลวเนื่องจากการอนุญาตให้จัดการได้ถูกปฏิเสธ</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
+ <translation>พยายามสร้างโฟลเดอร์ที่มีอยู่แล้ว</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
- <translation>CSync พยายามสร้างโฟลเดอร์ที่มีอยู่แล้ว</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation>ไม่มีพื้นที่ว่างบนเซิร์ฟเวอร์ %1</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>ไม่สามารถใช้บริการได้ชั่วคราว</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>ถูกปฏิเสธการเข้าถึง</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>จำนวนข้อผิดพลาดภายในที่เกิดขึ้น %1</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
- <translation>ลิงค์สัญลักษณ์จะไม่ได้รับการสนับสนุนในการประสานข้อมูล</translation>
+ <translation>ลิงก์สัญลักษณ์จะไม่ได้รับการสนับสนุนในการประสานข้อมูล</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>ไฟล์อยู่ในรายการที่ละเว้น</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation>ชื่อไฟล์ที่ลงท้ายด้วยระยะเวลา ยังไม่ได้รับการสนับสนุนบนระบบไฟล์นี้</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation>ชื่อไฟล์ที่มีตัวอักษร &apos;%1&apos; ยังไม่ได้รับการสนับสนุนบนระบบไฟล์นี้</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation>ชื่อไฟล์นี้เป็นชื่อที่ถูกสงวนไว้</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation>ชื่อไฟล์มีช่องว่างต่อท้าย</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>ชื่อไฟล์ยาวเกินไป</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation>ชื่อไฟล์ไม่สามารถเข้ารหัสในระบบไฟล์ของคุณได้</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation>ข้อขัดแย้งที่ยังไม่ได้แก้ไข</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>สถิติความล้มเหลว</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>การเข้ารหัสชื่อไฟล์ไม่ถูกต้อง</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>ตัวอักษรไม่ถูกต้อง โปรดเปลี่ยนชื่อ &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation>กำลังใช้ไฟล์เสมือนแต่ไม่ได้ตั้งค่าส่วนต่อท้าย</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation>ไม่สามารถอ่านบัญชีดำจากฐานข้อมูลต้นทาง</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation>ไม่สามารถอ่านจากบันทึกการประสานข้อมูล</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>ไม่สามารถเปิดการผสานข้อมูลเจอร์นัล</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>มีชื่อแฟ้มอย่างน้อยหนึ่งตัวอักษรที่ไม่ถูกต้อง</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>ถูกละเว้นเพราะ &quot;ข้อมูลที่เลือกประสาน&quot; ติดบัญชีดำ</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
- <translation>ไม่อนุญาติเพราะคุณไม่มีสิทธิ์ที่จะเพิ่มโฟลเดอร์ย่อยของโฟลเดอร์นั้น</translation>
+ <translation>ไม่อนุญาตเพราะคุณไม่มีสิทธิ์ที่จะเพิ่มโฟลเดอร์ย่อยของโฟลเดอร์นั้น</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>ไม่อนุญาตให้อัพโหลดไฟล์นี้เพราะมันจะอ่านได้เพียงอย่างเดียวบนเซิร์ฟเวอร์ กำลังฟื้นฟู</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>ไม่อนุญาตให้ลบเพราะกำลังฟื้นฟู</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>ไฟล์ต้นทางและโฟลเดอร์ที่แชร์ถูกลบออก</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>ไม่ได้รับอนุญาตให้ย้าย เพราะกำลังกู้คืนรายการ</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>ไม่อนุญาตให้ย้ายเพราะ %1 จะอ่านได้เพียงอย่างเดียว</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>ปลายทาง</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>แหล่งที่มา</translation>
</message>
@@ -3448,7 +3643,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/synclogdialog.ui" line="14"/>
<source>Synchronisation Log</source>
- <translation>การประสานข้อมูลไฟล์ Log</translation>
+ <translation>การประสานข้อมูลไฟล์ log</translation>
</message>
</context>
<context>
@@ -3462,17 +3657,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;รุ่น %1 สำหรับข้อมูลเพิ่มเติมกรุณาเยี่ยมชม &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation>&lt;p&gt;รุ่น %2 สามารถดูข้อมูลเพิ่มเติมได้ที่ &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;หากพบปัญหาหรือต้องการความช่วยเหลือโปรดไปที่: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt; โดย Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt และคนอื่นๆ</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation>&lt;p&gt;ลิขสิทธิ์ ownCloud GmbH&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;เผยแพร่โดย %1 และมีใบอนุญาตภายใต้ GNU General Public License (GPL) รุ่น 2.0 &lt;br/&gt;%2 และการลงทะเบียนโลโก้ %2 เครื่องหมายการค้าของ %1 ในประเทศสหรัฐอเมริกา ประเทศอื่นๆ หรือทั้งสองอย่าง&lt;/p&gt;</translation>
</message>
@@ -3503,81 +3698,81 @@ It is not advisable to use it.</source>
<translation>กรุณาเข้าสู่ระบบ</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>โฟลเดอร์ %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>ไม่มีการกำหนดค่าการประสานข้อมูลโฟลเดอร์</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>เปิดในเบราว์เซอร์</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>เข้าสู่ระบบ...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>ออกจากระบบ</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>การเปลี่ยนแปลงล่าสุด</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>กำลังตรวจสอบการเปลี่ยนแปลงใน &apos;%1&apos;</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>โฟลเดอร์ที่มีการจัดการแล้ว:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>เปิดโฟลเดอร์ &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>เปิด %1 ในเบราว์เซอร์</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>สถานะที่ไม่รู้จัก</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>ตั้งค่า...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>รายละเอียด...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>ช่วยเหลือ</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>ออก %1</translation>
</message>
@@ -3592,11 +3787,6 @@ It is not advisable to use it.</source>
<translation>ไม่สนับสนุนรุ่นของ Server</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation>เซิฟเวอร์บนบัญชี %1 ได้ใช้งานในรุ่นเก่าและเป็นรุ่นที่ไม่ได้รับการสนับสนุนแล้ว %2 หากใช้งานต่อไปอาจเป็นอันตราย ดำเนินการที่มีความเสี่ยงด้วยตัวคุณเอง</translation>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>ยกเลิกการเชื่อมต่อ</translation>
@@ -3628,116 +3818,129 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation>หยุดการประสานข้อมูลแล้ว</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation>มีข้อขัดแย้งที่ยังไม่ได้รับการแก้ไข</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation>เกิดข้อผิดพลาดขณะทำการประสานข้อมูล</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation>ไม่ได้กำหนดค่าโฟลเดอร์ที่จะประสานข้อมูล</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation>ทำโฟลเดอร์ทั้งหมดต่อ</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>หยุดโฟลเดอร์ทั้งหมดชั่วคราว</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>ประสานข้อมูลทั้งหมดต่อ</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>ประสานข้อมูลต่อ</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>หยุดการประสานข้อมูลทั้งหมดชั่วคราว</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>หยุดการประสานข้อมูลชั่วคราว</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>ออกจากระบบของบัญชีทั้งหมด</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>เข้าสู่ระบบของบัญชีทั้งหมด...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>สร้างบัญชีใหม่...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>เกี่ยวกับ %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>ความผิดพลาดในขณะนี้</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>ไม่มีรายการที่ถูกประสานข้อมูลเมื่อเร็วๆ นี้</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation>กำลังตรวจหาการเปลี่ยนแปลงในรีโมต &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation>กำลังตรวจหาการเปลี่ยนแปลงที่ต้นทาง &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>กำลังประสานข้อมูล %1 จาก %2 (เหลือ %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation>กำลังประสานข้อมูล %1 จากทั้งหมด %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>กำลังประสานข้อมูล %1 (เหลือ %2)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>กำลังประสานข้อมูล %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>ถึงวันที่</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation>&lt;p&gt;รุ่น %2 สำหรับข้อมูลเพิ่มเดิมไปดูได้ที่ &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt; หรือแจ้งปัญหาที่ทราบไปที่: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;โดย Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt และอีกหลายท่าน&lt;/small&gt;&lt;/p&gt;&lt;p&gt;ลิขสิทธิ์ ownCloud GmbH&lt;/p&gt;&lt;p&gt;ได้รับอนุญาตภายใต้ GNU General Public License (GPL) เวอร์ชัน 2.0&lt;br/&gt;ownCloud และโลโก้ OwnCloud เป็นเครื่องหมายจดทะเบียนการค้าของ ownCloud GmbH ในประเทศสหรัฐอเมริกาหรือประเทศอื่นๆ&lt;/p&gt;</translation>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3749,9 +3952,9 @@ It is not advisable to use it.</source>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>ป้ายข้อความ</translation>
</message>
@@ -3787,11 +3990,22 @@ It is not advisable to use it.</source>
<translation>ถามก่อนที่จะประสานข้อมูลกับพื้นที่จัดเก็บข้อมูลภายนอก</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>เลือกข้อมูลที่ต้องการประสาน</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;เมื่อตัวเลือกนี้ถูกเลือก วิซาร์ดจะปิดโดยไม่ได้ประสานข้อมูล คุณสามารกดเพิ่มโฟลเดอร์ที่ต้องการการประสานข้อมูลในการตั้งค่าบัญชี&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation>สร้างการประสานข้อมูลโฟลเดอร์ด้วยตัวเอง</translation>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>และโฟลเดอร์ต้นทาง</translation>
@@ -3808,11 +4022,16 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>ผสานข้อมูลทุกอย่างจากเซิร์ฟเวอร์</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation>ประสานข้อมูลทุกอย่างจากเซิร์ฟเวอร์ (แนะนำ)</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation>ใช้ไฟล์เสมือนแทนการดาวน์โหลดเนื้อหาทันที (โหมดเบต้า)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>ข้อความสถานะ</translation>
</message>
@@ -3849,7 +4068,7 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
+ <source>An error occurred while connecting. Please try again.</source>
<translation>เกิดข้อผิดพลาดขณะเชื่อมต่อ กรุณาลองอีกครั้ง</translation>
</message>
<message>
@@ -4029,7 +4248,7 @@ It is not advisable to use it.</source>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;ที่สร้างขึ้นจากการแก้ไข Git &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; บน %3, %4 กำลังใช้ Qt %5, %6&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4127,52 +4346,52 @@ It is not advisable to use it.</source>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>สถานะไม่สามารถระบุได้</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>กำลังรอการเริ่มต้นประสานข้อมูล</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>การประสานข้อมูลกำลังทำงาน</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>การประสานข้อมูลเสร็จสิ้น</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>ประสานข้อมูลสำเร็จ บางไฟล์ถูกละเลย</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>ประสานข้อมูลผิดพลาด</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>เกิดข้อผิดพลาดในการตั้งค่า</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>เตรียมความพร้อมในการประสานข้อมูล</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>กำลังยกเลิก...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>การประสานข้อมูลถูกหยุดชั่วคราว</translation>
</message>
@@ -4180,22 +4399,22 @@ It is not advisable to use it.</source>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation>ไม่สามารถเปิดเบราเซอร์</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation>เกิดข้อผิดพลาดขณะเปิดเบราว์เซอร์เพื่อไปที่ URL %1 อาจยังไม่มีการกำหนดค่าเบราเซอร์เริ่มต้น</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation>ไม่สามารถเปิดไคลเอนต์อีเมล</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation>เกิดข้อผิดพลาดเมื่อเปิดไคลเอ็นต์อีเมลเพื่อสร้างข้อความใหม่ บางทีไคลเอ็นต์อีเมลอาจยังไม่ได้ตั้งค่า?</translation>
</message>
diff --git a/translations/client_tr.ts b/translations/client_tr.ts
index 4e17dc223..09c99ce43 100644
--- a/translations/client_tr.ts
+++ b/translations/client_tr.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="tr" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,17 +95,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Bağlantı zaman aşımına uğradı</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation type="unfinished"/>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>İptal</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Hesap</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Ne eşitleneceğini seçin</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Şimdi eşitlemeye zorla</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>Eşitlemeyi yeniden başlat</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>Klasör eşitleme bağlantısını sil</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Klasör oluşturma başarısız oldu</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;&lt;i&gt;%1&lt;/i&gt; yerel klasörü oluşturulamadı.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>Klasör Eşitleme Bağlantısının Silinmesini Onaylayın</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>Klasör Eşitleme Bağlantısını Sil</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Eşitleme Çalışıyor</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>Eşitleme işlemi devam ediyor.&lt;br/&gt;Durdurmak istiyor musunuz?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 kullanımda</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>Sunucu sürümü %1 eski ve desteklenmiyor! Kendi riskinizle devam edin.</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>%1 ile bağlı.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>%1 sunucusu geçici olarak ulaşılamaz durumda.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>%1 oturumu sonlandırıldı.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>%1 ile %2 bağlantısı yok.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Giriş yap</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>Çok büyük oldukları için eşitlenmeyen klasörler var:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>Harici depolama diskinde oldukları için eşitlenmeyen klasörler var:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation>Çok büyük oldukları için ya da harici depolama alanında oldukları için eşitlenmeyen klasörler var:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Hesap Silinmesini Onaylayın</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;i&gt;%1&lt;/i&gt; hesabının bağlantısını kaldırmayı gerçekten istiyor musunuz?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Not:&lt;/b&gt; Bu işlem herhangi bir dosyayı &lt;b&gt;silmeyecektir&lt;/b&gt;.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>Bağlantıyı kaldır</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Klasörü aç</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Çıkış yap</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Eşitlemeye devam et</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Eşitlemeyi duraklat</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;i&gt;%1&lt;/i&gt; klasörünün eşitlemesini durdurmayı gerçekten istiyor musunuz?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Not:&lt;/b&gt; Bu işlem herhangi bir dosyayı &lt;b&gt;silmeyecektir&lt;/b&gt;.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1 (%3%) / %2 kullanımda. Ağdan bağlanmış veya paylaşılan dizinlerin farklı sınırları olabilir.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>%1 / %2 kullanımda</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>Şu anda depolama kullanım bilgisi mevcut değil.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>Hiç %1 bağlantısı yapılandırılmamış.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Oturum sonlandırıldı</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Bağlantı kesildi</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>Bağlandı</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Hizmet kullanılamıyor</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Ağ hatası</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Yapılandırma hatası</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Bilinmeyen hesap durumu</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Sunucu Etkinliği</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Eşitleme Protokolü</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>Eşitlenmedi</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>Eşitlenmedi (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>Sunucu etkinlik listesi panoya kopyalandı.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>Eşitleme etkinlik listesi panoya kopyalandı.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>Eşitlenmemiş ögelerin listesi panoya kopyalandı.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Panoya kopyalandı</translation>
</message>
@@ -469,47 +488,47 @@
<translation>MetinEtiketi</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Sunucu Etkinlikleri</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Kopyala</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Etkinlik listesini panoya kopyala.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Eylem Gerekiyor: Bildirimler</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;%1 hesabının geçerli kılınmış etkinlikleri bulunmamakta.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation><numerusform>%2 için %n yeni bildiriminiz var.</numerusform><numerusform>%2 için %n yeni bildiriminiz var.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation><numerusform>%2 ve %1 için %n yeni bildiriminiz var.</numerusform><numerusform>%2 ve %1 için %n yeni bildiriminiz var.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>%2, %1 ve diğer hesaplardan %n yeni bildiriminiz var.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>%1 Bildirim - Eylem Gerekiyor</translation>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Çıkış</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Devam et</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>ownCloud&apos;dan çık</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>Veritabanına üstveri yazma hatası</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>Hiçbir ownCloud hesabı yapılandırılmamış</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>Yapılandırılmış sunucu, bu istemci için çok eski</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Lütfen en son sunucuya güncelleyin veya istemciyi yeniden başlatın</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Giriş hatası: Kullanıcı adı veya parola hatalı.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>zaman aşımı</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>Sağlanan kimlik bilgileri doğru değil</translation>
</message>
@@ -637,131 +681,158 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Kullanıcı tarafından iptal edildi</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>%1 yerel klasörü mevcut değil.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 bir dizin olmalı, ancak değil.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 okunabilir değil.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 kaldırıldı.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 indirildi.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 güncellendi.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1, %2 olarak adlandırıldı.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1, %2 konumuna taşındı.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation><numerusform>%1 ve diğer %n dosya kaldırıldı.</numerusform><numerusform>%1 ve diğer %n dosya kaldırıldı.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation><numerusform>%1 ve diğer %n dosya indirildi.</numerusform><numerusform>%1 ve diğer %n dosya indirildi.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation><numerusform>&apos;%1&apos; ve diğer %n dosya güncellendi.</numerusform><numerusform>%1 ve diğer %n dosya güncellendi.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation><numerusform>%1, %2 olarak yeniden adlandırıldı ve %n diğer dosyanın adı değiştirildi.</numerusform><numerusform>%1, %2 olarak yeniden adlandırıldı ve %n diğer dosyanın adı değiştirildi.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation><numerusform>%1, %2 konumuna taşındı ve %n diğer dosya taşındı.</numerusform><numerusform>%1, %2 konumuna taşındı ve %n diğer dosya taşındı.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation><numerusform>%1 ve %n diğer dosya eşitleme çakışması bulunduruyor.</numerusform><numerusform>%1 ve %n diğer dosya eşitleme çakışması bulunduruyor.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation>%1 bir eşitleme çakışması bulunduruyor. Lütfen çakışan dosyayı kontrol edin!</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation><numerusform>%1 ve diğer %n dosya hatalar nedeniyle eşlenemedi. Ayrıntılar için ayıt dosyasına bakın.</numerusform><numerusform>%1 ve diğer %n dosya hatalar nedeniyle eşlenemedi. Ayrıntılar için günlük dosyasına bakın.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 bir hata nedeniyle eşitlenemedi. Ayrıntılar için günlüğe bakın.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Eşitleme Etkinliği</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>Sistem hariç tutulma dosyası okunamadı</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -769,46 +840,46 @@ If you decide to delete the files, they will be unavailable to you, unless you a
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Tüm Dosyalar Kaldırılsın mı?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Tüm dosyaları kaldır</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Dosyaları koru</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>Yedek bulundu</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>Normal Eşitleme</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>Çakışma Durumunda Yerel Dosyaları Tut</translation>
</message>
@@ -816,115 +887,105 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>Klasör durumu sıfırılanamadı</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>Eski eşitleme günlüğü &apos;%1&apos; bulundu ancak kaldırılamadı. Başka bir uygulama tarafından kullanılmadığından emin olun.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation> (yedek)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation> (yedek %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Tanımlanmamış Durum.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>Eşitlemenin başlanması bekleniyor.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Eşitleme için hazırlanıyor.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>Eşitleme çalışıyor.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>Son Eşitleme başarılı oldu.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>Son eşitleme başarılıydı, ancak tekil dosyalarda uyarılar vardı.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>Son Eşitleme başarılı oldu.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Kurulum Hatası.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Kullanıcı İptal Etti.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>Eşitleme duraklatıldı.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Eşitleme duraklatıldı)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>Geçerli klasör seçilmedi!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>Seçilen yol bir klasör değil!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Seçilen klasöre yazma izniniz yok!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>%1 yerel klasörü zaten bir eşitleme klasörü içermektedir. Lütfen farklı bir seçim yapın!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>%1 yerel klasörü zaten bir eşitleme klasörü içindedir. Lütfen farklı bir seçim yapın!</translation>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation>%1 yerel klasörü sembolik bağlantıdır. Bu bağlantının işaretlediği klasör zaten yapılandırılmış bir klasör içindedir. Lütfen farklı bir seçim yapın!</translation>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -934,7 +995,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Klasör Eşitleme Bağlantısı Ekle</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>Yerel klasör ile eşitleniyor</translation>
</message>
@@ -969,7 +1030,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Sunucudan klasörlerin listesi yüklenirken hata oluştu.</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Oturum sonlandırıldı</translation>
</message>
@@ -984,115 +1045,133 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>%1 üzerindeki değişiklikler denetleniyor</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>%1 eşitleniyor</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>indirme %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>gönderme %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3/%4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>Kalan %5, %1/%2, dosya %3/%4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1/%2, %3/%4 dosya</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>dosya %1/%2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>Bekleniyor...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>Diğer %n klasör bekleniyor...</numerusform><numerusform>Diğer %n klasör bekleniyor...</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>Eşitleme için hazırlanıyor...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>Klasör Eşitleme Bağlantısı Ekle</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>Eşitleme Bağlantısı Ekle</translation>
</message>
@@ -1100,17 +1179,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Eşitlemek için yerel bir klasör seçmek üzere tıklayın.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Yerel klasörün yolunu girin.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Kaynak klasörünü seçin</translation>
</message>
@@ -1118,60 +1197,68 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Uzak Klasör Oluştur</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>&apos;%1&apos; altında oluşturulacak yeni klasörün adını girin:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>Klasör %1 üzerinde başarıyla oluşturuldu.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>%1 erişimi için giriş başarısız</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>%1 üzerinde klasör oluşturma başarısız. Lütfen elle denetleyin.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>Bir klasörün listelenmesi başarısız oldu. Hata: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Tüm hesabı eşitlemek için bunu seçin</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Bu klasör zaten eşitleniyor.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>&lt;i&gt;%1&lt;/i&gt; zaten eşitleniyor. Bu, &lt;i&gt;%2&lt;/i&gt; klasörünün üst klasörü.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Uyarı:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Uyarı:&lt;/b&gt;</translation>
</message>
@@ -1179,22 +1266,22 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>Sunucudan E-Tag alınamadı, Vekil Sunucu/Ağ Geçidi&apos;ni denetleyin.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>Devam etmek üzere farklı bir E-Etiket aldık. Sonraki işlemde yeniden denenecek.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>Sunucu yanlış içerik aralığı döndürdü</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Bağlantı Zaman Aşımı</translation>
</message>
@@ -1217,23 +1304,38 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Sistem Çekmecesi için</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Gelişmiş</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation>senkronizasyon dosyaları </translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation type="unfinished"/>
</message>
@@ -1253,31 +1355,67 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>İki &amp;Renkli Simgeler Kullan</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>Yoksayılan &amp;Dosyaları Düzenle</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>Ç&amp;ökme bildiricisini göster</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>Hakkında</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>Güncellemeler</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>&amp;Yeniden Başlat ve Güncelle</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>İptal</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1345,7 +1483,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Kaldır</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1354,27 +1492,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
Bir dizinin silinmesine engel oluyorsa silmeye izin verilen yerlerdeki ögeler silinecektir. Bu ham veriler için kullanışlıdır.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Dosya açılamadı</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>Değişiklikler &apos;%1&apos; üzerine yazılamıyor.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Yoksayma Deseni Ekle</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Yeni bir yoksayma deseni ekle:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Bu girdi &apos;%1&apos; üzerinde sistem tarafından sağlanmaktadır ve bu görünümde değiştirilemez.</translation>
</message>
@@ -1404,7 +1542,7 @@ Bir dizinin silinmesine engel oluyorsa silmeye izin verilen yerlerdeki ögeler s
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Klasör</translation>
</message>
@@ -1419,35 +1557,45 @@ Bir dizinin silinmesine engel oluyorsa silmeye izin verilen yerlerdeki ögeler s
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Kopyala</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Zaman</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Dosya</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1473,36 +1621,48 @@ Bir dizinin silinmesine engel oluyorsa silmeye izin verilen yerlerdeki ögeler s
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Temizle</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Günlük göstergesini temizle.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>K&amp;aydet</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Hata ayıklama için günlük dosyasını kaydet.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Günlük dosyasını kaydet</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Hata</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>%1 günlük dosyasına yazılamadı</translation>
</message>
@@ -1510,12 +1670,12 @@ Bir dizinin silinmesine engel oluyorsa silmeye izin verilen yerlerdeki ögeler s
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Hata</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;&apos;%1&apos; dosyası&lt;br/&gt;yazmak üzere açılamadı.&lt;br/&gt;&lt;br/&gt;Günlük çıktısı &lt;b&gt;kaydedilemez&lt;/b&gt;!&lt;/nobr&gt;</translation>
</message>
@@ -1523,27 +1683,27 @@ Bir dizinin silinmesine engel oluyorsa silmeye izin verilen yerlerdeki ögeler s
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Yeni Sürüm Mevcut</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;%1 İstemcisi yeni sürümü mevcut.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; artık indirilebilir. Kurulu sürüm %3.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Bu sürümü atla</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Bu kez atla</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Güncellemeyi al</translation>
</message>
@@ -1631,27 +1791,27 @@ Bir dizinin silinmesine engel oluyorsa silmeye izin verilen yerlerdeki ögeler s
<translation>Otomatik sınırla</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Vekil sunucu makine adı</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Vekil sunucu kullanıcı adı</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Vekil sunucu parolası</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>HTTP(S) vekil sunucusu</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>SOCKS5 vekil sunucusu</translation>
</message>
@@ -1659,23 +1819,23 @@ Bir dizinin silinmesine engel oluyorsa silmeye izin verilen yerlerdeki ögeler s
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>Oluşturulma %1</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>Saniyeler içinde kapatılıyor...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation>%1 isteği %2 üzerinde başarısız oldu</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation>%2 üzerinde &apos;%1&apos; seçildi</translation>
@@ -1684,32 +1844,32 @@ Bir dizinin silinmesine engel oluyorsa silmeye izin verilen yerlerdeki ögeler s
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -1717,58 +1877,58 @@ Bir dizinin silinmesine engel oluyorsa silmeye izin verilen yerlerdeki ögeler s
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Yeni %1 Güncellemesi Hazır</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>%1 için yeni bir güncelleme yüklenmek üzere. İşlem sürerken güncelleyici başka yetkiler isteyebilir.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>%1 sürümü indirilyor. Lütfen bekleyin...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>Güncelleme indirilemedi. Lütfen güncellemeyi elle indirmek için &lt;a href=&apos;%1&apos;&gt;buraya&lt;/a&gt; tıklayın.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Yeni güncellemeler denetlenemedi.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>%1 sürümü mevcut. Güncellemeyi başlatmak için uygulamayı yeniden başlatın.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>Yeni %1 sürüm mevcut. Lütfen kurulum için sistem güncelleştirme aracını kullanın.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Güncelleme sunucusu denetleniyor...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>Güncelleme durumu bilinmiyor: Yeni güncellemeler denetlenemedi.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>Güncelleme yok. Kurulumunuz son sürümde.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>Güncelleme Denetimi</translation>
</message>
@@ -1776,43 +1936,43 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>%1 bağlantısını yap</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Yerel klasör seçeneklerini ayarla</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Bağlan...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1 klasörü &apos;%2&apos;, yerel &apos;%3&apos; klasörü ile eşitlendi</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>&apos;%1&apos; klasörünü eşitle</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Uyarı:&lt;/strong&gt; Yerel klasör boş değil. Bir çözüm seçin!&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Yerel Eşitleme Klasörü</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1871,15 +2031,20 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>%1 bağlantısını yap</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1910,153 +2075,163 @@ Kullanmanız önerilmez.</translation>
<source>&amp;Next &gt;</source>
<translation>&amp;İleri &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>Geçersiz URL</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;%1 bağlantısı başarılı: %2 sürüm %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>%2 üzerinde %1 adresine bağlanılamadı:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>%2 üzerinde %1 bağlantısı yapılırken zaman aşımı.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>%2 üzerinde %1 bağlantısı deneniyor...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>Sunucuda giriş sırasında istek &apos;%1&apos; adresine yönlendirilmiş. Adres hatalı veya sunucu yanlış ayarlanmış.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>Yetkilendirilmiş webdav isteği geçersiz bir cevap alındı</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>Erişim sunucu tarafından yasaklandı. Geçerli erişime sahip olup olmadığınızı doğrulamak için hizmete web tarayıcınızla erişmek üzere &lt;a href=&quot;%1&quot;&gt;buraya tıklayın&lt;/a&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>Geçersiz URL</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>Yerel eşitleme klasörü %1 zaten mevcut, eşitlemek için ayarlanıyor.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>Yerel eşitleme klasörü %1 oluşturuluyor...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>tamam</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>başarısız.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>%1 yerel klasörü oluşturulamadı</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>Uzak klasör belirtilmemiş!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Hata: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>ownCloud üzerinde klasör oluşturuluyor: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>%1 uzak klasörü başarıyla oluşturuldu.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>Uzak klasör %1 zaten mevcut. Eşitlemek için bağlanılıyor.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>Klasör oluşturma %1 HTTP hata kodu ile sonuçlandı</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>Uzak klasör oluşturması, geçersiz kimlik bilgileri nedeniyle başarısız!&lt;br/&gt;Lütfen geri gidin ve bilgileri denetleyin.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Uzak klasör oluşturma muhtemelen hatalı kimlik bilgilerinden dolayı başarısız oldu.&lt;/font&gt;&lt;br/&gt;Lütfen geri gidip kimlik bilgilerini doğrulayın.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>Uzak klasör %1 oluşturma işlemi &lt;tt&gt;%2&lt;/tt&gt; hatası ile başarısız oldu.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>%1 kaynaklı %2 uzak dizinine bir eşitleme bağlantısı ayarlandı.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>%1 bağlantısı başarılı!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>%1 bağlantısı kurulamadı. Lütfen tekrar denetleyin.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Klasör adlandırma başarısız</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>Klasör veya içerisindeki bir dosya farklı bir program içerisinde açık olduğundan, kaldırma ve yedekleme işlemi yapılamıyor. Lütfen klasör veya dosyayı kapatıp yeniden deneyin veya kurulumu iptal edin.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Yerel eşitleme klasörü %1 başarıyla oluşturuldu!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2064,14 +2239,31 @@ Kullanmanız önerilmez.</translation>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>%1 Bağlantı Sihirbazı</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Klasör yapılandırmasını atla</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2095,7 +2287,7 @@ Kullanmanız önerilmez.</translation>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>Getirme URL&apos;sinden geçersiz JSON yanıtı</translation>
</message>
@@ -2103,7 +2295,7 @@ Kullanmanız önerilmez.</translation>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>Veritabanına üstveri yazma hatası</translation>
</message>
@@ -2111,47 +2303,47 @@ Kullanmanız önerilmez.</translation>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>%1 dosyası, yerel dosya adı çakışması nedeniyle indirilemiyor!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>Boş disk alanı %1 altında</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>Dosya sunucudan silindi</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>Dosya tamamıyla indirilemedi.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation>Sunucu boyutunu %1 olarak duyurmasına rağmen indirilen dosya boş.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>Yerel bir dosya ismi ile çakıştığından, %1 dosyası kaydedilemedi!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>Dosya, bulunduğundan itibaren değişmiş</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>Veritabanına üstveri yazma hatası</translation>
</message>
@@ -2159,12 +2351,12 @@ Kullanmanız önerilmez.</translation>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; Geri Yükleme Başarısız: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation>Bir dosya veya dizin bir salt okunur paylaşımdan kaldırılmıştı, ancak geri yükleme başarısız oldu: %1</translation>
</message>
@@ -2172,22 +2364,22 @@ Kullanmanız önerilmez.</translation>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>%1 dosyası silinemedi, hata: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>Uyarı, %1 ile muhtemel harf duyarlılığı çatışması</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>%1 klasörü oluşturulamadı</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>Veritabanına üstveri yazma hatası</translation>
</message>
@@ -2195,17 +2387,17 @@ Kullanmanız önerilmez.</translation>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>&apos;%1&apos; silme hatası: %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>&apos;%1&apos; klasörü silinemiyor</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>%1 dosyası yerel bir dosya adı çakışması nedeniyle kaldırılamadı</translation>
</message>
@@ -2213,13 +2405,13 @@ Kullanmanız önerilmez.</translation>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>Yerel bir dosya adı çakışması nedeniyle %1 dosyası %2 olarak adlandırılamadı</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>Veritabanına üstveri yazma hatası</translation>
</message>
@@ -2227,12 +2419,7 @@ Kullanmanız önerilmez.</translation>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>Dosya salt okunur bir paylaşımdan kaldırılmıştı. Geri yüklendi.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>Sunucudan yanlış HTTP kodu döndü. 204 bekleniyordu, ancak &quot;%1 %2&quot; geldi.</translation>
</message>
@@ -2240,12 +2427,12 @@ Kullanmanız önerilmez.</translation>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Sunucudan yanlış HTTP kodu döndü. 201 bekleniyordu, ancak &quot;%1 %2&quot; geldi.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>Veritabanına üstveri yazma hatası</translation>
</message>
@@ -2253,28 +2440,13 @@ Kullanmanız önerilmez.</translation>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Bu klasörün adı değiştirilmemelidir. Özgün adına geri dönüştürüldü.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Bu klasörün adı değiştirilmemelidir. Lütfen Shared olarak geri adlandırın.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>Dosya adlandırıldı ancak salt okunur paylaşımın bir parçası. Özgün dosya geri yüklendi.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Sunucudan yanlış HTTP kodu döndü. 201 bekleniyordu, ancak &quot;%1 %2&quot; geldi.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>Veritabanına üstveri yazma hatası</translation>
</message>
@@ -2282,33 +2454,33 @@ Kullanmanız önerilmez.</translation>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Dosya Kaldırıldı</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>Eşitleme sırasında yerel dosya değişti. Devam edilecek.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>Eşitleme sırasında yerel dosya değişti.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>Veritabanına üstveri yazma hatası</translation>
</message>
@@ -2316,27 +2488,27 @@ Kullanmanız önerilmez.</translation>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>Eşitleme sırasında yerel dosya kaldırıldı.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>Eşitleme sırasında yerel dosya değişti.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation>(%1) Sunucusundan bilinmeyen dönüş kodu </translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation type="unfinished"/>
</message>
@@ -2344,27 +2516,22 @@ Kullanmanız önerilmez.</translation>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>Dosya yerel olarak düzenlendi ancak salt okunur paylaşımın bir parçası. Geri yüklendi ve düzenlemeniz çakışan dosyada.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>Getirme URL&apos;si eksik</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>Eşitleme sırasında yerel dosya kaldırıldı.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>Eşitleme sırasında yerel dosya değişti.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation>Sunucu son yığını onaylamadı. (Mevcut e-etiket bulunamadı)</translation>
</message>
@@ -2382,42 +2549,47 @@ Kullanmanız önerilmez.</translation>
<translation>MetinEtiketi</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Tarayıcıda aç</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Zaman</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Dosya</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Klasör</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Eylem</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Boyut</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>Yerel eşitleme protokolü</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Kopyala</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Etkinlik listesini panoya kopyala.</translation>
</message>
@@ -2458,7 +2630,7 @@ Kullanmanız önerilmez.</translation>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Ne Eşitleneceğini Seçin</translation>
</message>
@@ -2466,33 +2638,33 @@ Kullanmanız önerilmez.</translation>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Yükleniyor...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Ad</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Boyut</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>Sunucuda şu anda alt dizin bulunmuyor.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation>Alt klasör listesi alınırken bir hata oluştu.</translation>
</message>
@@ -2513,22 +2685,22 @@ Kullanmanız önerilmez.</translation>
<translation>Ayarlar</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Etkinlik</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Genel</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Ağ</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Hesap</translation>
</message>
@@ -2536,28 +2708,28 @@ Kullanmanız önerilmez.</translation>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Etkinlik</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Genel</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Ağ</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Hesap</translation>
</message>
@@ -2585,42 +2757,42 @@ Kullanmanız önerilmez.</translation>
<translation>ownCloud Yolu:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>%1 Paylaşma</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Klasör: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>Sunucu, paylaşımı desteklemiyor</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation>Sunucudan mümkün olan en fazla paylaşım hakları alınıyor...</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Dosya paylaşılamaz, çünkü sizinle paylaşım izni olmaksızın paylaşılmış.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>Kullanıcılar ve Gruplar</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>Herkese açık bağlantılar</translation>
</message>
@@ -2633,7 +2805,17 @@ Kullanmanız önerilmez.</translation>
<translation>YeniBelge.odt dosyasını paylaş</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>MetinEtiketi</translation>
</message>
@@ -2663,19 +2845,24 @@ Kullanmanız önerilmez.</translation>
<translation>Parolayı ayarla</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>Dosya listesini göster</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Düzenlemeye izin ver</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2683,95 +2870,95 @@ Kullanmanız önerilmez.</translation>
<translation>Dosya/klasör linkine sahip Herkes erişebilir </translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>&amp;Parola koruması</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Parola Korumalı</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Dosya paylaşılamaz, çünkü sizinle paylaşım izni olmaksızın paylaşılmış.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Sil</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Bağlantıyı e-posta ile gönder</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>İptal</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>Herkese &amp;açık paylaşım için parola gerekir</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>Lütfen Parola Atayın</translation>
</message>
@@ -2794,32 +2981,32 @@ Kullanmanız önerilmez.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Bağlantıyı e-posta ile gönder</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>&apos;%1&apos; için sonuç yok</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
@@ -2832,37 +3019,38 @@ Kullanmanız önerilmez.</translation>
<translation>Form</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>MetinEtiketi</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>düzenleyebilir</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>paylaşabilir</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>oluştur</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>değiştir</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>sil</translation>
</message>
@@ -2906,143 +3094,176 @@ Kullanmanız önerilmez.</translation>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>%1 ile paylaş</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Tarayıcıda aç</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Sertifika Ayrıntıları&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Ortak Ad (CN):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>Konu Alternatif İsimleri:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Kurum (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Kuruluş Birimi (OU):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Bölge/İlçe:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>Ülke:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Seri No:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Veren&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Veren:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Verilme:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Bitiş:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Parmak İzleri&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;Not:&lt;/b&gt; Bu sertifika el ile onaylandı&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (kendinden imzalı)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>Bu bağlantı %1 bit %2 kullanılarak şifrelenmiştir.
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation>SSL oturum biletleri/tanımlayıcıları desteklenmiyor</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Sertifika bilgisi:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>Bu bağlantı şifrelenmediğinden güvenli DEĞİL.
@@ -3130,305 +3351,270 @@ Kullanmanız önerilmez.</translation>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Başarılı.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>CSync günlük dosyasını yükleyemedi. Günlük dosyası bozuk.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;Csync için %1 eklentisi yüklenemedi.&lt;br/&gt;Lütfen kurulumu doğrulayın!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>CSync ciddi parametre hatası.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>CSync güncelleme süreç adımı başarısız.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>CSync uzlaştırma süreç adımı başarısız.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync vekil sunucuda kimlik doğrulayamadı.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSync bir vekil veya sunucu ararken başarısız oldu.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync %1 sunucusunda kimlik doğrularken başarısız oldu.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync ağa bağlanamadı.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>Bir ağ zaman aşımı meydana geldi.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>Bir HTTP aktarım hatası oluştu.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation>Bağlanan dizin geçici olarak sunucuda mevcut değil</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>Klasör açılırken bir hata oluştu</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>Klasör okunurken hata oluştu.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>Dosya/Klasör gizli olduğu için yoksayıldı.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation>Sadece %1 mevcut, Çalıştırmak için en az %2 gerekmektedir</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation>Üst dizin ekleme yetkiniz olmadığından izin verilmedi</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation>Bu klasöre dosya ekleme yetkiniz olmadığından izin verilmedi</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: %1 sunucusunda kullanılabilir alan yok.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>CSync belirtilmemiş hata.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Kullanıcı tarafından iptal edildi</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>CSync erişimde başarısız oldu</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
- <translation>CSync, günlük dosyası yüklenemedi veya oluşturalamadı. Lütfen yerel eşitleme dizininde okuma ve yazma izinleriniz olduğundan emin olun.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
- <translation>CSync ele alınmayan izin reddinden dolayı başarısız.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
- <translation>CSync, zaten mevcut olan bir klasör oluşturmaya çalıştı.</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>Hizmet geçiçi olarak kullanılamıyor</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>Erişim yasak</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>%1 numaralı dahili bir hata oluştu </translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>Sembolik bağlantılar eşitlemede desteklenmiyor.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>Dosya yoksayma listesinde.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation>Dosya adı bu dosya sisteminde ayrılmış bir addır.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>Dosya adı çok uzun.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>Durum alma başarısız.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>Dosya adı kodlaması geçerli değil</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>Geçersiz karakterler, lütfen &quot;%1&quot; yerine yeni bir isim girin</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation>Yerel veritabanından kara liste okunamadı</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation>Eşitleme günlüğünden okunamadı.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>Eşitleme günlüğü açılamıyor</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>Dosya adı en az bir geçersiz karakter içeriyor</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>&quot;Eşitlenecekleri seçin&quot; kara listesinde olduğundan yoksayıldı.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation>Bu dizine alt dizin ekleme yetkiniz olmadığından izin verilmedi</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>Sunucuda salt okunur olduğundan, bu dosya yüklenemedi, geri alınıyor</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>Kaldırmaya izin verilmedi, geri alınıyor</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>Yerel dosyalar ve paylaşım klasörü kaldırıldı.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>Taşımaya izin verilmedi, öge geri alındı</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>%1 salt okunur olduğundan taşımaya izin verilmedi</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>hedef</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>kaynak</translation>
</message>
@@ -3452,17 +3638,17 @@ Kullanmanız önerilmez.</translation>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Sürüm %1. Daha fazla bilgi için lütfen &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt; adresini ziyaret edin.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;%1 tarafından dağıtılmış ve GNU Genel Kamu Lisansı (GPL) Sürüm 2.0 ile lisanslanmıştır.&lt;br/&gt;%2 ve %2 logoları ABD ve/veya diğer ülkelerde %1 tescili markalarıdır.&lt;/p&gt;</translation>
</message>
@@ -3493,81 +3679,81 @@ Kullanmanız önerilmez.</translation>
<translation>Lütfen oturum açın</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Klasör %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Yapılandırılmış eşitleme klasörü yok.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Tarayıcıda aç</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Giriş yap...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Çıkış yap</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Son Değişiklikler</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>%1 deki değişiklikler denetleniyor</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Yönetilen Klasörler:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>&apos;%1&apos; klasörünü aç</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>%1&apos;ı tarayıcıda aç</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Bilinmeyen durum</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Ayarlar...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Ayrıntılar...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Yardım</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>%1&apos;tan çık</translation>
</message>
@@ -3582,11 +3768,6 @@ Kullanmanız önerilmez.</translation>
<translation>Desteklenmeyen Sunucu Sürümü</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation>%1 hesabındaki sunucu eski ve desteklenmeyen %2 sürümünde. Bu istemciyi desteklenmeyen sunucu sürümlerinde kullanmak test edilmemiş olmasının yanında muhtemelen tehlikeli. Kendi riskinizle devam edin.</translation>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Bağlantı kesildi</translation>
@@ -3618,116 +3799,129 @@ Kullanmanız önerilmez.</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation>Tüm klasörleri devam ettir</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>Tüm klasörleri durdur</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>Tüm eşitlemeleri devam ettir</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>Eşitlemeyi devam ettir</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>Tüm eşitlemeleri durdur</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>Eşitlemeyi durdur</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Tüm hesaplardan çıkış yap</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Tüm hesaplara giriş yap...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>Yeni hesap...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>%1 hakkında</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>Şimdi çök</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Yakın zamanda eşitlenen öge yok</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Eşitlenen %1/%2 (%3 kaldı)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation>%2 nin %1 i eşitleniyor</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Eşitlenen %1 (%2 kaldı)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>%1 eşitleniyor</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Güncel</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation type="unfinished"/>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3739,9 +3933,9 @@ Kullanmanız önerilmez.</translation>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>MetinEtiketi</translation>
</message>
@@ -3777,11 +3971,22 @@ Kullanmanız önerilmez.</translation>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Ne eşitleneceğini seçin</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>&amp;Yerel Klasör</translation>
@@ -3798,11 +4003,16 @@ Kullanmanız önerilmez.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>Sunucudaki her şeyi &amp;eşitle</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Durum iletisi</translation>
</message>
@@ -3839,7 +4049,7 @@ Kullanmanız önerilmez.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
+ <source>An error occurred while connecting. Please try again.</source>
<translation type="unfinished"/>
</message>
<message>
@@ -4019,7 +4229,7 @@ Kullanmanız önerilmez.</translation>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; Git gözden geçirmesi ile %3, %4 tarihinde, Qt %5, %6 kullanılarak derlendi.&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4117,52 +4327,52 @@ Kullanmanız önerilmez.</translation>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Tanımsız durum</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Eşitlemenin başlanması bekleniyor</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>Eşitleme çalışıyor</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Eşitleme Başarılı</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Eşitleme Başarılı, bazı dosyalar yoksayıldı.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Eşitleme Hatası</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Kurulum Hatası</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Eşitleme için hazırlanıyor</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>İptal ediliyor...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>Eşitleme duraklatıldı</translation>
</message>
@@ -4170,22 +4380,22 @@ Kullanmanız önerilmez.</translation>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation>E posta istemcisi açılamadı</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation>Yeni mesaj oluşturmak için eposta istemcisini çalıştırıken bir hata oluştu. Belki varsayılan eposta istemcisi ayarlanmamıştır? </translation>
</message>
diff --git a/translations/client_uk.ts b/translations/client_uk.ts
index 15068e19d..cfd0e877a 100644
--- a/translations/client_uk.ts
+++ b/translations/client_uk.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="uk" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,19 +95,19 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>Час очікування з&apos;єднання вичерпано</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
- <translation type="unfinished"/>
+ <translation>Незнайома помилка: відповідь мережі була видалена</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
- <translation type="unfinished"/>
+ <translation>Сервер відповів &quot;%1 %2&quot; на &quot;%3 %4&quot;</translation>
</message>
</context>
<context>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>Скасувати</translation>
</message>
@@ -166,184 +185,184 @@
<translation>Обліковий запис</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>Оберіть, що хочете синхронізувати</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>Примусово синхронізувати зараз</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>Перезапустити синхронізацію</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>Не вдалося створити теку</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>Виконується синхронізація</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>Виконується процедура синхронізації.&lt;br/&gt;Бажаєте зупинити?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 використовується</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 як &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>Підключено до %1.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>Сервер %1 тимчасово недоступний.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
- <translation type="unfinished"/>
+ <translation>З&apos;єднання з %1...</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>Увійти</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>Підтвердіть видалення облікового запису</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>Відкрити каталог</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>Вихід</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>Відновити синхронізацію</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>Призупинити синхронізацію</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>Використовується %1 (%3%) з %2. Деякі теки, включаючи мережеві змонтовані чи спільні, можуть мати інші обмеження.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>Використовується %1 з %2</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>На даний час немає відомостей про наповнення сховища.</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>Жодного %1 підключення не налаштовано.</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>Вийшов</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>Від&apos;єднаний</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>З&apos;єднаний</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>Сервіс недоступний</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>Помилка мережі</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>Помилка конфігурації</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>Невідомий стан облікового запису</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>Серверна активність</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>Протокол Синхронізації</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>Не синхронізовано</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>Not Synced (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>Список серверних операцій скопійовано до буферу обміну.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>Скопійовано в буфер обміну</translation>
</message>
@@ -469,47 +488,47 @@
<translation>Мітка</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>Серверні операції</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>Копіювати</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Скопіювати протокол синхронізації до буферу обміну.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>Необхідна Дія: Сповіщення</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
- <translation><numerusform>Ви отримали %n нове сповіщення від %2.</numerusform><numerusform>Ви отримали %n нових сповіщень від %2.</numerusform><numerusform>Ви отримали %n нових сповіщень від %2.</numerusform></translation>
+ <translation><numerusform>Ви отримали %n нове сповіщення від %2.</numerusform><numerusform>Ви отримали %n нових сповіщень від %2.</numerusform><numerusform>Ви отримали %n нових сповіщень від %2.</numerusform><numerusform>Ви отримали %n нових сповіщень від %2.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
- <translation><numerusform>Ви отримали %n нове сповіщення від %1 та %2.</numerusform><numerusform>Ви отримали %n нових сповіщень від %1 та %2.</numerusform><numerusform>Ви отримали %n нових сповіщень від %1 та %2.</numerusform></translation>
+ <translation><numerusform>Ви отримали %n нове сповіщення від %1 та %2.</numerusform><numerusform>Ви отримали %n нових сповіщень від %1 та %2.</numerusform><numerusform>Ви отримали %n нових сповіщень від %1 та %2.</numerusform><numerusform>Ви отримали %n нових сповіщень від %1 та %2.</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>Ви отримали нові сповіщення від %1, %2 та інших облікових записів.</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>%1 Сповіщень - Необхідна Дія</translation>
</message>
@@ -555,19 +574,44 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>Вийти</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>Продовжити</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
- <translation type="unfinished"/>
+ <translation>Вийти з ownCloud</translation>
</message>
</context>
<context>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>Обліковий запис ownCloud не налаштовано</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>Налаштований сервер застарий для цього клієнта</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>Будь ласка, оновіть сервер до останньої версії та перезавантажте клієнт.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>Помилка автентифікації: ім&apos;я користувача або пароль невірні.</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>час вичерпано</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>Введені дані не вірні</translation>
</message>
@@ -637,131 +681,158 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>Скасовано користувачем</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>Локальна тека %1 не існує.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 не читається.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 видалено.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 завантажено.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 оновлено.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 перейменовано на %2</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 переміщено в %2.</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 не може синхронізуватися через помилки. Дивіться деталі в журналі.</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>Журнал синхронізації</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>Неможливо прочитати виключений системний файл</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -769,46 +840,46 @@ If you decide to delete the files, they will be unavailable to you, unless you a
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>Видалити усі файли?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>Видалити усі файли</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>Зберегти файли</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>Резервну копію знайдено</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation type="unfinished"/>
</message>
@@ -816,115 +887,105 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>Не вдалося скинути стан теки</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>Знайдено старий журнал синхронізації &apos;%1&apos;, його неможливо видалити. Будь ласка, впевніться що він не відкритий в іншій програмі.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation>(Резервна копія)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation>(Резервна копія %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>Невизначений стан.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>Очікування початку синхронізації.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>Підготовка до синхронізації</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>Синхронізація запущена.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>Остання синхронізація була успішною.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>Остання синхронізація пройшла вдало, але були зауваження про деякі файли.</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>Остання синхронізація була успішною.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>Помилка встановлення.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>Скасовано користувачем.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>Синхронізація призупинена.</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Синхронізація призупинена)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>У вас немає прав на запис в цю теку!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -934,7 +995,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>Синхронізується з локальною текою</translation>
</message>
@@ -969,7 +1030,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>Вийшов</translation>
</message>
@@ -984,115 +1045,133 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>,</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>завантаження %1/с</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>відвантаження %1/с</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 of %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>файл %1 з %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>Очікування...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation type="unfinished"/>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation type="unfinished"/>
</message>
@@ -1100,17 +1179,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>Натисніть, щоб обрати локальну теку для синхронізації.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>Введіть шлях до локальної теки.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>Оберіть початкову теку</translation>
</message>
@@ -1118,60 +1197,68 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>Створити Віддалену Теку</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>Введіть ім&apos;я нової теки, яка буде створена тут &apos;%1&apos;:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>Теку успішно створено на %1.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>Помилка аутентифікації при доступі до %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>Не вдалося створити теку на %1. Будь ласка, перевірте вручну.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>Оберіть це для синхронізації всього облікового запису</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>Тека вже синхронізується.</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>Тека &lt;i&gt;%1&lt;/i&gt; вже синхронізується, та вона є батьківською для &lt;i&gt;%2&lt;/i&gt;.</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Попередження&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;Попередження&lt;/b&gt;</translation>
</message>
@@ -1179,22 +1266,22 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>Не отримано E-Tag від серверу, перевірте мережеві налаштування (проксі, шлюз)</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>Ми отримали інший E-Tag для відновлення. Спробуйте ще раз пізніше.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>Сервер повернув невірний content-range</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>Час з&apos;єднання вичерпано</translation>
</message>
@@ -1217,23 +1304,38 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>Додатково</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation type="unfinished"/>
</message>
@@ -1253,31 +1355,67 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Використовувати &amp;монохромні піктограми</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>Редагувати &amp;ігноровані файли</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
- <source>S&amp;how crash reporter</source>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>Про</translation>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
+ <source>S&amp;how crash reporter</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
+ <location filename="../src/gui/generalsettings.ui" line="53"/>
<source>Updates</source>
<translation>Оновлення</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>&amp;Перезавантаження &amp;&amp; Оновлення</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>Скасувати</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1345,34 +1483,34 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Видалити</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>Не вдалося відкрити файл</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>Неможливо запиасати зміни до &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>Додати шаблон ігнорування</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>Додати новий шаблон ігнорування:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>Цей запис створено системою в &apos;%1&apos;, тут змінити його не можна.</translation>
</message>
@@ -1387,7 +1525,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<message>
<location filename="../src/gui/issueswidget.ui" line="20"/>
<source>List of issues</source>
- <translation type="unfinished"/>
+ <translation>Перелік проблем</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="34"/>
@@ -1402,7 +1540,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>Тека</translation>
</message>
@@ -1417,35 +1555,45 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>Копіювати</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>Час</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>Файл</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1471,36 +1619,48 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>Очистити</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>Очистити дисплей журналу.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>З&amp;берегти</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>Зберегти файл журналу у файл на диску для обробки.</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>Зберегти файл журналу</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>Помилка</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>Не вдалося записати в файл журналу %1</translation>
</message>
@@ -1508,12 +1668,12 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>Помилка</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;Файл &apos;%1&apos;&lt;br/&gt;не вдається відкрити на запис.&lt;br/&gt;&lt;br/&gt;Журнал &lt;b&gt;не&lt;/b&gt; можливо зберегти!&lt;/nobr&gt;</translation>
</message>
@@ -1521,27 +1681,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>Доступна Нова Версія</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;Доступна нова версія додатку %1.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; доступна для завантаження. Встановлена версія: %3.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>Пропустити цю версію</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>Пропустити цього разу</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>Отримати оновлення</translation>
</message>
@@ -1629,27 +1789,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation>Автоматичне обмеження</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>Ім&apos;я хоста проксі-сервера</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>Ім&apos;я користувача проксі-сервера</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>Пароль для проксі-сервера</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>HTTP(S) проксі</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>SOCKS5 проксі</translation>
</message>
@@ -1657,23 +1817,23 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation type="unfinished"/>
@@ -1682,32 +1842,32 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -1715,58 +1875,58 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>Доступне оновлення %1</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>Буде встановлено оновлення для %1. Програма оновлення може запитати додаткові привілеї.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>Завантаження файлів %1. Будь ласка, почекайте...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>Неможливо завантажити оновлення. Будь ласка, натисніть &lt;a href=&apos;%1&apos;&gt;тут&lt;/a&gt;, щоб самостійно завантажити оновлення.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>Не вдалося перевірити наявність оновлень. </translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>Перевірка оновлень на сервері...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>Статус оновлення невідомий: Не вдалося перевірити наявність оновлень.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>У вас встановленно останню версію.</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation type="unfinished"/>
</message>
@@ -1774,43 +1934,43 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>З&apos;єднати з %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>Налаштування локальної теки</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>Підключення ...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1 тека &apos;%2&apos; синхронізована з локальним каталогом &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>Локальна Тека для Синхронізації</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1869,15 +2029,20 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>З&apos;єднати з %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1908,153 +2073,163 @@ It is not advisable to use it.</source>
<source>&amp;Next &gt;</source>
<translation>&amp;Наступний&gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>Невірний URL</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;Успішно підключено до %1: %2 версія %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>Не вдалося з&apos;єднатися з %1 в %2:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>Перевищено час очікування з&apos;єднання до %1 на %2.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>Спроба підключення до %1 на %2...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>Запит аутентифікації до серверу було переадресовано до &apos;%1&apos;. Поганий URL, сервер сконфігуровано неправильно.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>Неправильна відповідь на автентифікований запит webdav</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>Доступ заборонений сервером. Щоб довести, що у Вас є права доступу, &lt;a href=&quot;%1&quot;&gt;клікніть тут&lt;/a&gt; для входу через Ваш браузер.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>Невірний URL</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>Локальна тека синхронізації %1 вже існує, налаштування її для синхронізації.&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>Створення локальної теки для синхронізації %1...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>ok</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>не вдалося.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>Не вдалося створити локальну теку $1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>Не вказано віддалену теку!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>Помилка: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>створення теки на ownCloud: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>Віддалена тека %1 успішно створена.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>Віддалена тека %1 вже існує. Під&apos;єднання для синхронізації.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>Створення теки завершилось HTTP помилкою %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>Створити віддалену теку не вдалося через невірно вказані облікові дані.&lt;br/&gt;Поверніться назад та перевірте облікові дані.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Створити віддалену теку не вдалося, можливо, через невірно вказані облікові дані.&lt;/font&gt;&lt;br/&gt;Будь ласка, поверніться назад та перевірте облікові дані.&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>Не вдалося створити віддалену теку %1 через помилку &lt;tt&gt;%2&lt;/tt&gt;.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>З&apos;єднання для синхронізації %1 з віддаленою текою %2 було встановлено.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>Успішно під&apos;єднано до %1!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>Підключення до %1 встановити не вдалося. Будь ласка, перевірте ще раз.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>Не вдалося перейменувати теку</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>Неможливо видалити теку та створити її резервну копію, оскільки тека або файли, що в ній розташовані, використовуються. Будь ласка, закрийте всі програми, що можуть використовувати цю теку та спробуйте ще раз, або скасуйте встановлення.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Локальна тека синхронізації %1 успішно створена!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2062,14 +2237,31 @@ It is not advisable to use it.</source>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>Майстер з&apos;єднання %1 </translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>Пропустити налаштування теки</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2093,7 +2285,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>Неправильна JSON відповідь на сформований URL</translation>
</message>
@@ -2101,7 +2293,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2109,47 +2301,47 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>Файл %1 не може бути завантажено через локальний конфлікт назви файлу! </translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>Файл видалено з сервера</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>Файл не може бути завантажений повністю.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>Файл %1 не збережено через локальний конфлікт назви файлу! </translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>Файл змінився з моменту знаходження</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2157,12 +2349,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; Відновлення не вдалося: %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation type="unfinished"/>
</message>
@@ -2170,22 +2362,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>Увага, можливий конфлікт чутливості до реєстру з %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2193,17 +2385,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>Помилка видалення &apos;%1&apos;: %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>Неможливо видалити %1 через локальний конфлікт назви файлу</translation>
</message>
@@ -2211,13 +2403,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>%1 не можна перейменувати на %2 через локальний конфлікт назви файлу</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2225,12 +2417,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>Файл видалено з опублікованої теки з правами тільки на перегляд. Файл відновлено.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>Сервер відповів неправильним HTTP кодом. Очікувався 204, але отримано &quot;%1 %2&quot;.</translation>
</message>
@@ -2238,12 +2425,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Сервер відповів неправильним HTTP кодом. Очікувався 201, але отримано &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2251,28 +2438,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>Цю теку не можна перейменувати. Буде використано старе ім&apos;я.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>Цю теку не можна перейменувати. Будь ласка, поверніть їй ім&apos;я Shared.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>Файл було перейменовано, але він розташований в теці з правами лише на перегляд. Відновлено оригінальний файл. </translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>Сервер відповів неправильним HTTP кодом. Очікувався 201, але отримано &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2280,33 +2452,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>Файл видалено</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>Локальний файл змінився під час синхронізації. Його буде відновлено.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>Локальний файл змінився під час синхронізації.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation type="unfinished"/>
</message>
@@ -2314,27 +2486,27 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>Локальний файл було видалено під час синхронізації.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>Локальний файл змінився під час синхронізації.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation type="unfinished"/>
</message>
@@ -2342,27 +2514,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>Файл було змінено локально, але він розташований в теці з правами лише на перегляд. Файл відновлено, а ваші зміни розташовані в теці конфліктів.</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>Не вистачає сформованого URL</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>Локальний файл було видалено під час синхронізації.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>Локальний файл змінився під час синхронізації.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation type="unfinished"/>
</message>
@@ -2380,42 +2547,47 @@ It is not advisable to use it.</source>
<translation>Мітка</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>Відкрити у переглядачі</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>Час</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>Файл</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>Тека</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>Дія</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>Розмір</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>Копіювати</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Скопіювати протокол синхронізації до буферу обміну.</translation>
</message>
@@ -2456,7 +2628,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>Оберіть, що хочете синхронізувати</translation>
</message>
@@ -2464,33 +2636,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>Завантаження ...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>Ім’я</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>Розмір</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>На сервері зараз немає підтек.</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation type="unfinished"/>
</message>
@@ -2511,22 +2683,22 @@ It is not advisable to use it.</source>
<translation>Налаштування</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>Активність</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>Загалом</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>Мережа</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>Обліковий запис</translation>
</message>
@@ -2534,28 +2706,28 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>Активність</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>Загалом</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>Мережа</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>Обліковий запис</translation>
</message>
@@ -2583,42 +2755,42 @@ It is not advisable to use it.</source>
<translation>Шлях до ownCloud:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>Ви поділилися %1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>Тека: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Цей файл неможливо поширити, бо ним поділилися без права на поширення.</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>Користувачі та групи</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation type="unfinished"/>
</message>
@@ -2631,7 +2803,17 @@ It is not advisable to use it.</source>
<translation>Поділитися NewDocument.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>Мітка</translation>
</message>
@@ -2661,19 +2843,24 @@ It is not advisable to use it.</source>
<translation>Встановіть пароль</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>Показати список файлів</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>Дозволити редагування</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2681,95 +2868,95 @@ It is not advisable to use it.</source>
<translation>Будь хто з цім посиланням має доступ до файлу/теки</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>&amp;Захистити паролем</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>Захищено паролем</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>Цей файл неможливо поширити, бо ним поділилися без права на поширення.</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>Видалити</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>Надіслати посилання по електронній пошті</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>Скасувати</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>Публічне по&amp;ширення вимагає пароль</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation type="unfinished"/>
</message>
@@ -2792,32 +2979,32 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>Надіслати посилання по електронній пошті</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
@@ -2830,37 +3017,38 @@ It is not advisable to use it.</source>
<translation>Форма</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>Мітка</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>може редагувати</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>може ділитися з іншими</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>створити</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>змінити</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>видалити</translation>
</message>
@@ -2904,143 +3092,176 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>Поділитися з %1</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>Відкрити у переглядачі</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Деталі сертифікату&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>Загальне Ім&apos;я (CN):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>Альтернативне Ім&apos;я:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>Організація (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>Підрозділ (OU):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>Область:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>Країна:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>Серія:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Видавець&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>Видавець:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>Видано для:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>Закінчується:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;Відбитки пальців&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;Примітка:&lt;/b&gt; Цей сертифікат був схвалений вручну&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (самопідписаний)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>З&apos;єднання зашифроване %1-бітним %2.
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>Інформація про сертифікат:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>З&apos;єднання НЕ зашифровано.
@@ -3128,305 +3349,270 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>Успішно.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>CSync не вдалося завантажити файл журналу. Файл журналу пошкоджений.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;Не вдалося завантажити плагін для синхронізації %1.&lt;br/&gt;Будь ласка, перевірте його встановлення!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>У CSync сталася фатальна помилка параметра.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>CSync не вдалася зробити оновлення .</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>CSync не вдалася зробити врегулювання.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync не вдалося аутентифікуватися на проксі-сервері.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSync не вдалося знайти Проксі або Сервер.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync не вдалося аутентифікуватися на %1 сервері.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync не вдалося приєднатися до мережі.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>Час під&apos;єднання до мережі вичерпався.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>Сталася помилка передачі даних по HTTP.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation>Доступно лише %1, для початку необхідно хоча б %2</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync: на сервері %1 скінчилося місце.</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>Невизначена помилка CSync.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>Скасовано користувачем</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>CSync не вдалося отримати доступ</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>Служба тимчасово недоступна</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>Доступ заборонений</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>Виникла внутрішня помилка за номером %1.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>Синхронізація символічних посилань не підтримується. </translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>Файл присутній у списку ігнорованих.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>Шлях до файлу занадто довгий.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>Кодування файлу не припустиме</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>Не вдається відкрити протокол синхронізації</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>Ім’я файлу містить принаймні один некоректний символ</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>Ігнорується через чорний список в &quot;обрати що синхронізувати&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation>Заборонено через відсутність прав додавання підкаталогів в цю теку.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>Не дозволено завантажувати цей файл, оскільки він має дозвіл лише на перегляд, відновлюємо</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>Не дозволено видаляти, відновлюємо</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>Локальні файли та теки в загальному доступі було видалено.</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>Переміщення не дозволено, елемент відновлено </translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>Переміщення не дозволено, оскільки %1 помічений тільки для перегляду</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>призначення</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>джерело</translation>
</message>
@@ -3450,17 +3636,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Версія %1. Для отримання більш детальної інформації, будь ласка, відвідайте &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;Поширюється через %1 і під ліцензією GNU General Public License (GPL) версії 2.0&lt;br/&gt;%2 логотип %2 є зареєстрованими торговими марками %1 у Сполучених Штатах та інших країнах, або обох.&lt;/p&gt;</translation>
</message>
@@ -3491,81 +3677,81 @@ It is not advisable to use it.</source>
<translation>Увійдіть будь ласка</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>Тека %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>Немає налаштованих тек для синхронізації.</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>Відкрити у переглядачі</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>Увійти...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>Вихід</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>Недавні зміни</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>Керовані теки:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>Відкрити теку &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>Відкрити %1 в браузері</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>Невідомий статус</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>Налаштування...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>Деталі...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>Допомога</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>Закрити %1</translation>
</message>
@@ -3580,11 +3766,6 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>Від&apos;єднаний</translation>
@@ -3616,116 +3797,129 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>Вийти зі всіх облікових записів</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>Увійти до всіх облікових записів...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>Новий обліковий запис...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>Про %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>Критична помилка</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>Нещодавно нічого не синхронізувалося</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>Синхронізовано %1 з %2 (залишилося %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>Синхронізовано %1 (залишилося %2)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>Оновлено</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation type="unfinished"/>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3737,9 +3931,9 @@ It is not advisable to use it.</source>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>Мітка</translation>
</message>
@@ -3775,11 +3969,22 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>Оберіть, що хочете синхронізувати</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>&amp;Локальна Тека</translation>
@@ -3796,11 +4001,16 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>Синхронізувати все з сервером</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>Повідомлення про статус</translation>
</message>
@@ -3837,7 +4047,7 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
+ <source>An error occurred while connecting. Please try again.</source>
<translation type="unfinished"/>
</message>
<message>
@@ -3909,12 +4119,12 @@ It is not advisable to use it.</source>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="438"/>
<source>%n day(s) ago</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="446"/>
<source>%n hour(s) ago</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<location filename="../src/common/utility.cpp" line="451"/>
@@ -3929,7 +4139,7 @@ It is not advisable to use it.</source>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="456"/>
<source>%n minute(s) ago</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<location filename="../src/common/utility.cpp" line="459"/>
@@ -3968,32 +4178,32 @@ It is not advisable to use it.</source>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="310"/>
<source>%n year(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="311"/>
<source>%n month(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="312"/>
<source>%n day(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="313"/>
<source>%n hour(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="314"/>
<source>%n minute(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="315"/>
<source>%n second(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<location filename="../src/common/utility.cpp" line="339"/>
@@ -4017,7 +4227,7 @@ It is not advisable to use it.</source>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;Зібрано з Git ревізії &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; %3, %4, використовуючи Qt %5, %6&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4115,52 +4325,52 @@ It is not advisable to use it.</source>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>Статус не визначено</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>Очікування початку синхронізації</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>Проводиться синхронізація</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>Синхронізація успішно виконана</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>Синхронізацію завершено, деякі файли проігноровано.</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>Помилка синхронізації</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>Помилка налаштування</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>Підготовка до синхронізації</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>Відміна...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>Синхронізація призупинена</translation>
</message>
@@ -4168,22 +4378,22 @@ It is not advisable to use it.</source>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation type="unfinished"/>
</message>
diff --git a/translations/client_zh_CN.ts b/translations/client_zh_CN.ts
index 531d9c5f0..b8d57dd09 100644
--- a/translations/client_zh_CN.ts
+++ b/translations/client_zh_CN.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="zh_CN" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation>无法在回收站创建目录</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation>无法移动 &apos;%1&apos; 到 &apos;%2&apos;</translation>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation>移动到回收站无法在此平台执行</translation>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,19 +95,19 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>连接超时</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation>未知错误:网络相应被删除</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
- <translation type="unfinished"/>
+ <translation>服务器返回&quot;%1 %2&quot; to &quot;%3 %4&quot; </translation>
</message>
</context>
<context>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>取消</translation>
</message>
@@ -166,184 +185,184 @@
<translation>账户</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>选择同步内容</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>强制同步</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>重新开始同步</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>断开文件夹同步</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>文件夹创建失败</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;无法创建文件夹 &lt;i&gt;%1&lt;/i&gt;。</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>确定断开文件夹同步</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>断开文件夹同步</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>正在同步</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>正在执行同步。&lt;br /&gt;您确定要关闭它吗?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 使用中</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1, &lt;i&gt;%2&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>服务器版本 %1 很旧且不支持,继续操作将自行承担风险。</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>连接到 %1。</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>远程服务器%1暂时不可用。</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
- <translation type="unfinished"/>
+ <translation>服务器%1处于维护模式。</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>从 %1 退出</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
- <translation type="unfinished"/>
+ <translation>从浏览器获取权限。&lt;a href=&apos;%1&apos;&gt;点击此按钮&lt;/a&gt;重启浏览器。</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation>正在连接到 %1</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>没有到位于%2中的%1的连接</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>登录</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>以下目录由于太大而没有同步:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>以下目录由于是外部存储而没有同步:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation>以下目录由于太大或是外部存储而没有同步:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>确认删除账号</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;你确定要删除账号的连接? &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; 这 &lt;b&gt;不会&lt;/b&gt; 删除任何文件&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>删除连接</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>打开文件夹</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>注销</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>恢复同步</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>暂停同步</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;你确定要停止文件夹同步? &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; 这 &lt;b&gt;不会&lt;/b&gt; 删除任何文件&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1 (%3%) of %2 使用中。一些文件夹,例如网络挂载的和共享的文件夹,可能有不同的限制。</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>使用量 %1 / %2</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>目前没有储存使用量信息可用。</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>没有 %1 连接配置。</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>已退出</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>连接已断开</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>已连接</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>服务不可用</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation>维护模式</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>网络错误</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>配置错误</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
- <translation type="unfinished"/>
+ <translation>请求证书</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>未知的账户状态</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>服务器动态</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>同步协议</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>未同步</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>未同步 (%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>服务器动态已被复制到剪贴板。</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>同步动态已被复制到剪贴板。</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>未同步列表已复制到剪贴板。</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>复制到剪贴板</translation>
</message>
@@ -469,47 +488,47 @@
<translation>文本标签</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>服务器动态</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>复制</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>复制动态列表到剪贴板。</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>需采取的操作:通知</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt;帐户%1没有同步活动。</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation><numerusform>你收到 %n 新的通知来自于 %2.</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation><numerusform>你收到 %n 新的通知来自 %1 和 %2。</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>你收到新的通知 %1, %2 和其它账户。</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>%1 通知 - 需要采取行动</translation>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation>继续操作意味着&lt;b&gt;删除这些设置&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation>继续操作意味着&lt;b&gt;忽略这些设置&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>退出</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>继续</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation>访问配置文件时发生错误</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation>访问配置文件 %1 时发生错误。</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>退出 ownCloud</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>向数据库写入元数据错误</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>没有已经配置的 ownCloud 帐号</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>此客户端连接到的服务器版本过旧</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>请更新到最新的服务器版本然后重启客户端。</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>认证失败:用户名或密码错误</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>超时</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>提供的证书不正确</translation>
</message>
@@ -637,133 +681,160 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>用户撤销</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>本地文件夹 %1 不存在。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>%1 应该是一个文件夹,但是它现在不是文件夹</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 不可读。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 已移除。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 已下载。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 已更新。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 已更名为 %2。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 已移动至 %2。</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation><numerusform>%1 和 %n 其它文件已被移除。</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation><numerusform>%1 和 %n 其它文件已下载。</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation><numerusform>%1 和 %n 其它文件已更新。</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation><numerusform>%1 已经更名为 %2,其它 %3 文件也已更名。</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation><numerusform>%1 已移动到 %2,其它 %3 文件也已移动。</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation><numerusform>%1 和 %n 其他文件有同步冲突。</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation>%1 有同步冲突。请检查冲突文件!</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation><numerusform>%1 和 %n 其他文件由于错误不能同步。详细信息请查看日志。</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 同步出错。详情请查看日志。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>同步活动</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>无法读取系统排除的文件</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation>一个大于 %1 MB 的新文件夹 %2 已被添加。
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation>一个来自外部存储的文件夹已被添加。
</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation>如果您想下载,请到设置页面选择它。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation>%1 文件被创建但在之前的同步中被拒绝了.它将不会被同步.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -774,7 +845,7 @@ If you decide to delete the files, they will be unavailable to you, unless you a
如果您决定删除这些文件,它们将不再可用,除非您是其所有者。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
@@ -783,22 +854,22 @@ If this was an accident and you decide to keep your files, they will be re-synce
如果这是一个意外而您想要保留这些文件,他们会被重新从服务器同步过来。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>删除所有文件?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>删除所有文件</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>保持所有文件</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
@@ -807,17 +878,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
继续正常同步将导致您全部文件被更早状态的旧文件覆盖。您想要保留冲突文件的本地最新版本吗?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation>备份已删除</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation>正常同步</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation>保留本地文件为冲突文件</translation>
</message>
@@ -825,115 +896,105 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>不能重置文件夹状态</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>一个旧的同步日志 &apos;%1&apos; 被找到,但是不能被移除。请确定没有应用程序正在使用它。</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation> (备份)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation> (备份 %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>未知状态。</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>等待启动同步。</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>准备同步。</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>同步正在运行。</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>最后一次同步成功。</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation>同步成功,但有未解决的冲突。</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>上次同步已成功,不过一些文件出现了警告。</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>最后一次同步成功。</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>安装失败</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>用户撤销。</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>同步已暂停。</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (同步已暂停)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>没有选择有效的文件夹!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>选择的路径不是一个文件夹!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>你没有写入所选文件夹的权限!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation>本地文件夹 %1 包含了一个符号连接,而该连接的目标包含了一个已经同步的文件夹。请另行选择!</translation>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation>已经有一个从服务器到此文件夹的同步设置。请选择其他本地文件夹!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>本地文件夹 %1 包含有正在使用的同步文件夹,请选择另一个!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>本地文件夹 %1 是正在使用的同步文件夹,请选择另一个!</translation>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation>选择的文件夹 %1 是一个符号连接,连接指向的是正在使用的同步文件夹,请选择另一个!</translation>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -943,7 +1004,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>添加同步文件夹</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation>与本地文件夹同步</translation>
</message>
@@ -978,7 +1039,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>载入文件夹列表时发生错误。</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>已登出</translation>
</message>
@@ -990,118 +1051,136 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<message>
<location filename="../src/gui/folderstatusmodel.cpp" line="209"/>
<source>There are unresolved conflicts. Click for details.</source>
+ <translation>有未解决的冲突。点击显示详细信息。</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>在 %1 检查更改</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation>检查远端文件 &apos;%1&apos; 的变动</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation>检查本地文件 &apos;%1&apos; 的变动</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
- <translation type="unfinished"/>
+ <translation>调整变更</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>正在同步 %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>,</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>下载 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/秒</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>上传 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/秒</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 / %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>剩余: %5,%1 / %2, 文件数量 %3 / %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 of %2, file %3 of %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>第 %1 个文件,共 %2 个</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>请稍等...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>等待 %n 个其他文件(文件夹)</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>准备同步...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>添加同步文件夹</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>添加同步连接</translation>
</message>
@@ -1109,17 +1188,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>点击选择进行同步的本地文件夹。</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>输入本地文件夹的路径。</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>选择源目录</translation>
</message>
@@ -1127,60 +1206,68 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>创建远程文件夹</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>输入 %1 中的新文件夹的名称:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>文件夹在 %1 上创建成功。</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>访问 %1 时认证失败</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>无法在 %1 处创建文件夹。请自行检查。</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>列表失败。错误: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation>选择此项以同步整个账户</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>文件夹已在同步中。</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>你已经在同步 &lt;i&gt;%1&lt;/i&gt;,&lt;i&gt;%2&lt;/i&gt; 是它的一个子文件夹。</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;警告:&lt;/b&gt;%1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;警告:&lt;/b&gt;</translation>
</message>
@@ -1188,22 +1275,22 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>未能收到来自服务器的 E-Tag,请检查代理/网关</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>我们收到了不同的恢复 E-Tag,将在下次尝试。</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>服务器返回了错误的内容长度</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>连接超时</translation>
</message>
@@ -1226,23 +1313,38 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>系统托盘</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation>稳定的</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation>公测的</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>高级</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation>请询问确认同步,若同步文件夹大于</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation>请询问确认同步,若涉及外部存储</translation>
</message>
@@ -1262,31 +1364,67 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>使用单色图标</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>编辑忽略的文件</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>显示崩溃报告器</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>关于</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>更新</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>重启并更新 (&amp;R)</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation>更改升级渠道?</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation>更改升级渠道</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>取消</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation>分享错误</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1354,7 +1492,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>移除</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1363,27 +1501,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
如果选中的项目正在阻止文件夹的删除,它们也会被删除。这对于元数据很有用。</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>不能打开文件</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>无法向 %1 中写入修改。</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>增加忽略模式</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>增加新的忽略模式:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>此项目由系统在 %1 处提供,不能在这里被修改。</translation>
</message>
@@ -1398,7 +1536,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<message>
<location filename="../src/gui/issueswidget.ui" line="20"/>
<source>List of issues</source>
- <translation type="unfinished"/>
+ <translation>问题列表</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="34"/>
@@ -1413,7 +1551,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>文件夹</translation>
</message>
@@ -1425,37 +1563,47 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<message>
<location filename="../src/gui/issueswidget.ui" line="83"/>
<source>Show ignored files</source>
- <translation type="unfinished"/>
+ <translation>显示已忽略文件</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
- <translation type="unfinished"/>
+ <translation>有太多问题,这里并不能看见所有的问题.</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation>有冲突。查看有关如何解决它们的文档</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
- <translation type="unfinished"/>
+ <translation>复制问题列表到剪切板</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>复制</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>时间</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>文件</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
- <translation type="unfinished"/>
+ <translation>问题</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation>有冲突.&lt;a href=&quot;%1&quot;&gt;查阅相关解决问题的文档&lt;/a&gt;</translation>
</message>
</context>
<context>
@@ -1482,36 +1630,48 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation>永久保存日志</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>清除</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>清空日志显示。</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>保存 (&amp;S)</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>保存日志文件到磁盘以供调试。</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>保存日志文件</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>错误</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>无法写入日志文件%1</translation>
</message>
@@ -1519,12 +1679,12 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>错误</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;文件 &apos;%1&apos;&lt;br/&gt;不能写入。&lt;br/&gt;&lt;br/&gt;将&lt;b&gt;不&lt;/b&gt;能保存日志输出!&lt;/nobr&gt;</translation>
</message>
@@ -1532,27 +1692,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>新版本可用</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;新版本的 %1 客户端可用。&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; 已经开放下载。已安装的版本是 %3。&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>跳过这个版本</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>本次跳过</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>获取更新</translation>
</message>
@@ -1640,27 +1800,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation>自动限制</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>代理服务器主机名</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>代理服务器用户名</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>代理服务器密码</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>HTTP(S) 代理</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>SOCKS5 代理</translation>
</message>
@@ -1668,24 +1828,24 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation>创建于 %1</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation>几秒钟后关闭...</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation>%1 请求失败于 %2
</translation>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation>&apos;%1&apos; 选定于 %2</translation>
@@ -1694,91 +1854,91 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
- <translation type="unfinished"/>
+ <translation>来自服务器返回的错误&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
- <translation type="unfinished"/>
+ <translation>在&apos;token&apos; 结尾有个错误: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
- <translation type="unfinished"/>
+ <translation>不能解析来自服务器端的JSON:&lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
- <translation type="unfinished"/>
+ <translation>来自服务端的响应不包含所有期待的字段.</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;h1&gt;登录错误&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;h1&gt;错误用户&lt;/h1&gt;&lt;p&gt;你登陆的用户&lt;em&gt;%1&lt;/em&gt;,但必须以用户&lt;em&gt;%2&lt;/em&gt;的身份登录.&lt;br&gt;请在另一个标签 %3登出,然后&lt;a href=&apos;%4&apos;&gt;点击这&lt;/a&gt;并以用户%2登录&lt;/p&gt;</translation>
</message>
</context>
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>新的 %1 更新就绪</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>新版本&amp;1已经可以更新。更新过程会请求额外的权限。</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>正在下载版本 %1,请稍候(“稍后”和“稍候”请分清楚,OK?)...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>无法下载更新,请点击&lt;a href=&apos;%1&apos;&gt;此处&lt;/a&gt;手动下载更新。</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>无法检查新更新。</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>%1 版本 %2 现在可用,请重启应用以开始更新。</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>%1 新版本 %2 已经可用,使用系统更新工具升级。</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>检查更新服务器</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>还没有检查过更新。</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>没有可用更新。您的安装已为最新版本。</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>检查更新</translation>
</message>
@@ -1786,43 +1946,43 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>连接到 %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>设置本地文件夹</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>连接...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1 文件夹 &apos;%2&apos; 将被同步到本地文件夹 &apos;%3&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>同步文件夹 %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;警告:&lt;/strong&gt; 本地目录非空。选择一个操作!&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>本地同步文件夹</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1881,15 +2041,20 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>连接到 %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation>在浏览器中登录</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation>复制链接到剪贴板</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1919,153 +2084,163 @@ It is not advisable to use it.</source>
<source>&amp;Next &gt;</source>
<translation>下一步 (&amp;N) &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation>无效URL</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation>不能加载认证.可能是密码错误?</translation>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;成功连接到 %1:%2 版本 %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>连接到 %1 (%2)失败:&lt;br /&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>连接到 %1 (%2) 时超时。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>尝试连接位于 %2 的 %1...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>被发送到服务器的认证请求被重定向到&apos;%1&apos;。此URL无效,服务器配置错误。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>对于一个验证的 webdav 请求,有一个无效的响应</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>服务器拒绝了访问。&lt;a href=&quot;%1&quot;&gt;点击这里打开浏览器&lt;/a&gt; 来确认您是否有权访问。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation>无效URL</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
- <translation type="unfinished"/>
+ <translation>服务器报告了以下错误:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>本地同步文件夹 %1 已存在,将使用它来同步。&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>创建本地同步目录%1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>成功</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>失败</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>不能创建本地文件夹 %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>未指定远程文件夹!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>错误:%1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>在 ownCloud 创建文件夹:%1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>远程目录%1成功创建。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>远程文件夹 %1 已存在。连接它以供同步。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>创建文件夹出现 HTTP 错误代码 %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>远程文件夹创建失败,因为提供的凭证有误!&lt;br/&gt;请返回并检查您的凭证。&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;远程文件夹创建失败,可能是由于提供的用户名密码不正确。&lt;/font&gt;&lt;br/&gt;请返回并检查它们。&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>创建远程文件夹 %1 失败,错误为 &lt;tt&gt;%2&lt;/tt&gt;。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>已经设置了一个 %1 到远程文件夹 %2 的同步连接</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>成功连接到了 %1!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>无法建立到 %1的链接,请稍后重试(这里“稍后”用对了,赞!)。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>文件夹更名失败</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>无法移除和备份文件夹,由于文件夹或文件正在被另一程序占用。请关闭程序后重试,或取消安装。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;本地同步目录 %1 已成功创建&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2073,14 +2248,31 @@ It is not advisable to use it.</source>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>%1 链接向导</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>跳过文件夹设置</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation>启用实验性功能?</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation>允许试验模式</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation>保持安全</translation>
</message>
</context>
<context>
@@ -2104,7 +2296,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>推送 URL 传来的 JSON 无效</translation>
</message>
@@ -2112,7 +2304,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>向数据库写入元数据错误</translation>
</message>
@@ -2120,47 +2312,47 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>由于本地文件名冲突,文件 %1 无法下载。</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
- <translation type="unfinished"/>
+ <translation>在当前限制下,下载将会减少本地磁盘的剩余空间.</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>空闲磁盘空间少于 %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>已从服务器删除文件</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>文件无法完整下载。</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation>虽然服务器宣称已完成 %1,但实际下载文件为空。</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>由于本地文件名冲突,文件 %1 无法保存。</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>自从发现文件以来,它已经被改变了</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>向数据库写入元数据错误</translation>
</message>
@@ -2168,12 +2360,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>;恢复失败:%1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation>文件(夹)移除了只读共享,但恢复失败:%1</translation>
</message>
@@ -2181,22 +2373,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>不能删除文件 %1, 错误: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>小心!%1 的文件名可能有大小写冲突</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>无法创建文件夹 %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>向数据库写入元数据错误</translation>
</message>
@@ -2204,17 +2396,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>删除&apos;%1&apos;错误:%2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>无法删除文件夹 %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>由于本地文件名冲突,不能删除 %1</translation>
</message>
@@ -2222,13 +2414,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>由于本地文件名冲突,文件 %1 无法更名为 %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>向数据库写入元数据错误</translation>
</message>
@@ -2236,12 +2428,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>文件已经移除只读共享,并已经恢复。</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>服务器返回的 HTTP 状态错误,应返回 204,但返回的是“%1 %2”。</translation>
</message>
@@ -2249,12 +2436,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>服务器返回的 HTTP 状态错误,应返回 201,但返回的是“%1 %2”。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>向数据库写入元数据错误</translation>
</message>
@@ -2262,28 +2449,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>文件无法更名,已经恢复为原文件名。</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>文件无法更名,请改回“Shared”。</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>文件已经更名,但这是某个只读分享的一部分,原文件已经恢复。</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>服务器返回的 HTTP 状态错误,应返回 201,但返回的是“%1 %2”。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>向数据库写入元数据错误</translation>
</message>
@@ -2291,33 +2463,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation>文件 %1 无法上传,因为存在同名文件,文件名仅有大小写不同。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>已移除文件</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>本地文件在同步时已修改,完成后会再次同步</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>本地文件在同步时已修改。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>向数据库写入元数据错误</translation>
</message>
@@ -2325,27 +2497,27 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>本地文件在同步时已删除。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>本地文件在同步时已修改。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation>从服务器得到了意外的返回值(%1)</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation>服务器端文件 ID缺失</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation>服务器端ETag缺失</translation>
</message>
@@ -2353,27 +2525,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>文件已经在本地修改,但这是某个只读分享的一部分,原文件已经恢复。您的修改已保存在冲突文件中。</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>缺少轮询 URL</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>本地文件在同步时已删除。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>本地文件在同步时已修改。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation>服务器未确认上一分块。(找不到 E-tag)</translation>
</message>
@@ -2391,42 +2558,47 @@ It is not advisable to use it.</source>
<translation>文本标签</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>在浏览器中打开</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>时间</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>文件</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>文件夹</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>动作</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>大小</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>本地同步协议</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>复制</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>复制动态列表到剪贴板。</translation>
</message>
@@ -2467,7 +2639,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>选择同步内容</translation>
</message>
@@ -2475,33 +2647,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>加载中...</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation>反选您不想同步的那些远端文件夹</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>名称</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>大小</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>这个服务器上暂不存在子文件夹。</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation>载入子文件夹列表时发生错误。</translation>
</message>
@@ -2522,22 +2694,22 @@ It is not advisable to use it.</source>
<translation>设置</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>动态</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>常规</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>网络</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>账户</translation>
</message>
@@ -2545,28 +2717,28 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>动态</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>常规</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>网络</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>账户</translation>
</message>
@@ -2594,42 +2766,42 @@ It is not advisable to use it.</source>
<translation>ownCloud 路径:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>%1 分享</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>文件夹:%2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>服务器不支持共享</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation>从服务器获取最大可能的共享权限...</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>未分配共享权限,无法共享文件。</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>用户和组</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>公共链接</translation>
</message>
@@ -2642,7 +2814,17 @@ It is not advisable to use it.</source>
<translation>分享 NewDocument.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation>仅上传 (File Drop)</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>文本标签</translation>
</message>
@@ -2654,12 +2836,12 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="35"/>
<source>Enter a name to create a new public link...</source>
- <translation type="unfinished"/>
+ <translation>输入一个名称以便创建一个新的公共链接</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="42"/>
<source>&amp;Create new</source>
- <translation type="unfinished"/>
+ <translation>&amp;创建新的</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="105"/>
@@ -2672,19 +2854,24 @@ It is not advisable to use it.</source>
<translation>设置密码</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
- <translation type="unfinished"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
+ <translation>接收者可查看或下载内容。</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation>下载 / 查看</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation>显示文件列表</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation>下载 / 查看 / 上传</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>允许编辑</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation>接收者可查看、下载、编辑、删除以及上传内容。</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2692,95 +2879,95 @@ It is not advisable to use it.</source>
<translation>任何查看此链接的人都可以访问文件、文件夹</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>密码保护(&amp;a)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>密码保护</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>未分配共享权限,无法共享文件。</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation>分享链接已被关闭</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation>创建公共分享链接</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>删除</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation>在浏览器中打来链接</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation>复制链接到剪贴板</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation>复制链接到剪贴板 (直接下载)</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>通过邮件发送链接</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation>我向你分享了 %1 </translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
- <translation type="unfinished"/>
+ <translation>确认删除分享链接</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>取消</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation>公开链接</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
- <translation type="unfinished"/>
+ <translation>删除链接分享</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>公开分享需要密码</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>请设置密码</translation>
</message>
@@ -2803,34 +2990,34 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation>在浏览器中打来链接</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation>复制链接到剪贴板</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>通过邮件发送链接</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>没有 &apos;%1&apos; 相关结果</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
- <translation type="unfinished"/>
+ <translation>我给你分享了一些东西</translation>
</message>
</context>
<context>
@@ -2841,37 +3028,38 @@ It is not advisable to use it.</source>
<translation>窗体</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>文本标签</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>可编辑</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>可共享</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>创建</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>更改</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>删除</translation>
</message>
@@ -2915,143 +3103,176 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>使用 %1 共享</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation>上下文菜单分享</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
- <translation type="unfinished"/>
+ <translation>我给你分享了一些东西</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation>分享到...</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
- <translation type="unfinished"/>
+ <translation>将私有链接复制到剪切板</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
- <translation type="unfinished"/>
+ <translation>通过email发送私有链接</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation>再次分享这个文件是不被允许的</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation>复制公共链接到剪切板</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>在浏览器中打开</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation><numerusform>下载文件</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;证书信息&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>常用名 (CN):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>主体备用名称:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>组织 (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>单位 (OU):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>州/省:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>国家:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>序列号:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;颁发者&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>颁发者:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>颁发于:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>过期于:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;证书指纹&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;注意:&lt;/b&gt;此证书经手动批准&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (自签署)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>此连接通过 %1 位的 %2 加密。
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation>没有支持的 SSL 标识</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>证书信息:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>此连接未经过加密。
@@ -3139,305 +3360,270 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>成功。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>CSync同步无法载入日志文件。日志文件已损坏。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;csync 的 %1 插件不能加载。&lt;br/&gt;请校验安装!&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>CSync 致命参数错误。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>CSync 处理步骤更新失败。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>CSync 处理步骤调和失败。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync 代理认证失败。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSync 无法查询代理或服务器。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync 于 %1 服务器认证失败。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync 联网失败。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>网络连接超时。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>HTTP 传输错误。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation>该文件夹在服务器上不可用</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>打开目录失败</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>读取目录时出错</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>已忽略隐藏的文件和文件夹。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
- <translation type="unfinished"/>
+ <translation>文件层级太深</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
- <translation type="unfinished"/>
+ <translation>冲突:服务器版本已下载,本地版本被重命名但未上传</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation>仅有 %1 有效,至少需要 %2 才能开始</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation>你没有权限增加父目录</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation>你没有权限增加文件</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync:%1 服务器空间已满。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>CSync 未定义错误。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>用户撤销</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>访问 CSync 失败</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation>权限被拒绝</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
- <translation>Csync同步失败,请确定是否有本地同步目录的读写权</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
+ <translation>文件或者目录未找到:</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
- <translation>出于未处理的权限拒绝,CSync 失败。</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
+ <translation>尝试创建一个已存在的文件夹</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
- <translation>CSync 尝试创建了已有的文件夹。</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation>%1服务器无可用空间</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>服务暂时不可用</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>访问被拒绝</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>发生内部错误 %1</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>符号链接不被同步支持。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>文件在忽略列表中。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation>文件名结尾不可以为“.”。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation>此文件系统不支持包含字符 &apos;%1&apos; 的文件名。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation>文件名为系统保留文件名。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation>文件名尾部含有空格</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>文件名过长。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
- <translation type="unfinished"/>
+ <translation>文件名在你的文件系统中不能编码</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
- <translation type="unfinished"/>
+ <translation>尚未解决的冲突</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>状态失败。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>文件名编码无效</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>无效的字符,请更改为 “%1”</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation>使用虚拟文件但没设置后缀</translation>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation>无法从本地数据库读取黑名单</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation>无法读取同步日志。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>无法打开同步日志</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>文件名中存在至少一个非法字符</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>已忽略(“选择同步内容”黑名单)</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation>你没有权限增加子目录</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>无法上传文件,因为服务器端此文件为只读,正在回退</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>无法删除,正在回退</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>本地文件和共享文件夹已被删除。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>无法移动,正在回退</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>无法移动,%1为是只读的</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>目标</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>源</translation>
</message>
@@ -3461,17 +3647,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;版本 %1。详情请见 &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation>&lt;p&gt;ownCloud GmbH 版权所有&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;%1 使用GNU通用公共许可证 (GPL) 2.0。&lt;br/&gt;%2 以及 %2 标识已由 %1 注册使用。&lt;/p&gt;</translation>
</message>
@@ -3502,81 +3688,81 @@ It is not advisable to use it.</source>
<translation>请登录</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>文件夹 %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>没有已配置的同步文件夹。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>在浏览器中打开</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>登录</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>注销</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>最近修改</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>检查 %1 的更改</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>管理的文件夹:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>打开文件夹“%1”</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>在浏览器中打开%1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>未知状态</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>设置...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>细节...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>帮助</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>退出 %1</translation>
</message>
@@ -3591,11 +3777,6 @@ It is not advisable to use it.</source>
<translation>不支持的服务器版本</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation>账户 %1 的服务器运行着一个古老而不受支持的版本 %2。使用该客户端未支持的服务器版本未经测试并且可能存在潜在危险。继续操作需要自行承担风险。</translation>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>连接已断开</translation>
@@ -3603,7 +3784,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="240"/>
<source>Disconnected from some accounts</source>
- <translation type="unfinished"/>
+ <translation>与一些账号断开连接</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="251"/>
@@ -3627,116 +3808,129 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
- <translation type="unfinished"/>
+ <translation>同步操作被暂停</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation>尚未解决的冲突</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
- <translation type="unfinished"/>
+ <translation>同步中出错</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
- <translation type="unfinished"/>
+ <translation>未设置同步文件夹</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation>解除暂停所有文件夹</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation>暂停所有文件夹</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation>解除暂停所有同步</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation>解除暂停同步</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation>暂停所有同步</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation>暂停同步</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>注销所有账户</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>登录所有账户</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation>新账号……</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>关于%1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>发生了崩溃</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>近期没有项目被同步</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation>检查远端文件 &apos;%1&apos; 的变动</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation>检查本地文件 &apos;%1&apos; 的变动</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>同步 %2 中的 %1 (剩余 %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation>正在同步 %1,共 %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>同步 %1 (剩余 %2)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>正在同步 %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>更新</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation>&lt;p&gt;版本 %2,更多信息请访问&lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt; 帮助信息请访问:&lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;p&gt;&lt;p&gt; &lt;small&gt;By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;版权所有ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud 以及 ownCloud 标志是 ownCloud Inc. 的注册商标。</translation>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3748,9 +3942,9 @@ It is not advisable to use it.</source>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>文本标签</translation>
</message>
@@ -3786,11 +3980,22 @@ It is not advisable to use it.</source>
<translation>在同步外部存储时,询问确认 (&amp;x)</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>选择同步内容</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation>手动创建文件夹同步连接</translation>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>本地文件夹 (&amp;L)</translation>
@@ -3807,11 +4012,16 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>同步服务器的所有内容 (&amp;S)</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>状态信息</translation>
</message>
@@ -3844,12 +4054,12 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="36"/>
<source>Please switch to your browser to proceed.</source>
- <translation type="unfinished"/>
+ <translation>请切换到你的浏览器以便继续操作.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
- <translation type="unfinished"/>
+ <source>An error occurred while connecting. Please try again.</source>
+ <translation>连接中发生错误.请再次尝试.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="56"/>
@@ -4028,7 +4238,7 @@ It is not advisable to use it.</source>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;从 Git 版本 &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; 在 %3 上构建, %4 使用了 Qt %5, %6&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4126,52 +4336,52 @@ It is not advisable to use it.</source>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>状态未定义</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>等待同步启动</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>同步运行中</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>同步成功</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>同步成功,部分文件被忽略。</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>同步错误</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>关闭</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>正在准备同步</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>正在撤销...</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>同步被暂停</translation>
</message>
@@ -4179,22 +4389,22 @@ It is not advisable to use it.</source>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
- <translation type="unfinished"/>
+ <translation>不能打开浏览器</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation>无法打开邮件客户端</translation>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation>启动email客户端并创建新消息时发生错误。是不是没有设定默认的email客户端?</translation>
</message>
diff --git a/translations/client_zh_TW.ts b/translations/client_zh_TW.ts
index 632ab7560..3577dc334 100644
--- a/translations/client_zh_TW.ts
+++ b/translations/client_zh_TW.ts
@@ -1,5 +1,24 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="zh_TW" version="2.1">
<context>
+ <name>FileSystem</name>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="445"/>
+ <source>Could not make directories in trash</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="459"/>
+ <location filename="../src/common/filesystembase.cpp" line="465"/>
+ <source>Could not move &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/common/filesystembase.cpp" line="502"/>
+ <source>Moving to the trash is not implemented on this platform</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>FolderWizardSourcePage</name>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
@@ -76,17 +95,17 @@
<context>
<name>OCC::AbstractNetworkJob</name>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="245"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="254"/>
<source>Connection timed out</source>
<translation>連線逾時</translation>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="247"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="256"/>
<source>Unknown error: network reply was deleted</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/abstractnetworkjob.cpp" line="390"/>
+ <location filename="../src/libsync/abstractnetworkjob.cpp" line="408"/>
<source>Server replied &quot;%1 %2&quot; to &quot;%3 %4&quot;</source>
<translation type="unfinished"/>
</message>
@@ -135,8 +154,8 @@
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="247"/>
- <location filename="../src/gui/accountsettings.cpp" line="446"/>
- <location filename="../src/gui/accountsettings.cpp" line="842"/>
+ <location filename="../src/gui/accountsettings.cpp" line="453"/>
+ <location filename="../src/gui/accountsettings.cpp" line="863"/>
<source>Cancel</source>
<translation>取消</translation>
</message>
@@ -166,184 +185,184 @@
<translation>帳號</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="299"/>
+ <location filename="../src/gui/accountsettings.cpp" line="302"/>
<source>Choose what to sync</source>
<translation>選擇要同步的項目</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="305"/>
+ <location filename="../src/gui/accountsettings.cpp" line="308"/>
<source>Force sync now</source>
<translation>強制同步</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="307"/>
+ <location filename="../src/gui/accountsettings.cpp" line="310"/>
<source>Restart sync</source>
<translation>重新啟動同步</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="316"/>
+ <location filename="../src/gui/accountsettings.cpp" line="319"/>
<source>Remove folder sync connection</source>
<translation>移除資料夾同步連線</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="387"/>
+ <location filename="../src/gui/accountsettings.cpp" line="391"/>
<source>Folder creation failed</source>
<translation>資料夾建立失敗</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="388"/>
+ <location filename="../src/gui/accountsettings.cpp" line="392"/>
<source>&lt;p&gt;Could not create local folder &lt;i&gt;%1&lt;/i&gt;.</source>
<translation>&lt;p&gt;無法建立本地資料夾 &lt;i&gt;%1&lt;/i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="438"/>
+ <location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Confirm Folder Sync Connection Removal</source>
<translation>確認移除資料夾同步連線</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="445"/>
+ <location filename="../src/gui/accountsettings.cpp" line="452"/>
<source>Remove Folder Sync Connection</source>
<translation>移除資料夾同步連線</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="527"/>
+ <location filename="../src/gui/accountsettings.cpp" line="534"/>
<source>Sync Running</source>
<translation>正在同步中</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="528"/>
+ <location filename="../src/gui/accountsettings.cpp" line="535"/>
<source>The syncing operation is running.&lt;br/&gt;Do you want to terminate it?</source>
<translation>正在同步中&lt;br/&gt;你真的想要中斷?</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="617"/>
+ <location filename="../src/gui/accountsettings.cpp" line="625"/>
<source>%1 in use</source>
<translation>%1 正在使用</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="644"/>
+ <location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>%1 as &lt;i&gt;%2&lt;/i&gt;</source>
<translation>%1 如 &lt;i&gt;%2&lt;i&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="650"/>
- <source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
- <translation>伺服器版本%1過舊,已不支援。繼續的風險請自負。</translation>
- </message>
- <message>
- <location filename="../src/gui/accountsettings.cpp" line="652"/>
+ <location filename="../src/gui/accountsettings.cpp" line="660"/>
<source>Connected to %1.</source>
<translation>已連線到 %1</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="654"/>
+ <location filename="../src/gui/accountsettings.cpp" line="662"/>
<source>Server %1 is temporarily unavailable.</source>
<translation>伺服器 %1 暫時無法使用。</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="656"/>
+ <location filename="../src/gui/accountsettings.cpp" line="664"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation>伺服器 %1 現正處於維護模式</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <location filename="../src/gui/accountsettings.cpp" line="666"/>
<source>Signed out from %1.</source>
<translation>從 %1 登出</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="667"/>
+ <location filename="../src/gui/accountsettings.cpp" line="675"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="671"/>
+ <location filename="../src/gui/accountsettings.cpp" line="679"/>
<source>Connecting to %1...</source>
<translation>正在連接到 %1 ...</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="674"/>
+ <location filename="../src/gui/accountsettings.cpp" line="682"/>
<source>No connection to %1 at %2.</source>
<translation>沒有從 %2 連線到 %1</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="698"/>
+ <location filename="../src/gui/accountsettings.cpp" line="711"/>
<source>Log in</source>
<translation>登入</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="785"/>
+ <location filename="../src/gui/accountsettings.cpp" line="806"/>
<source>There are folders that were not synchronized because they are too big: </source>
<translation>有部份的資料夾因為容量太大沒有辦法同步:</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="787"/>
+ <location filename="../src/gui/accountsettings.cpp" line="808"/>
<source>There are folders that were not synchronized because they are external storages: </source>
<translation>有部分資料夾因為是外部存儲沒有辦法同步: </translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="788"/>
+ <location filename="../src/gui/accountsettings.cpp" line="809"/>
<source>There are folders that were not synchronized because they are too big or external storages: </source>
<translation>有部分資料夾因為容量太大或是外部存儲沒有辦法同步: </translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="834"/>
+ <location filename="../src/gui/accountsettings.cpp" line="855"/>
<source>Confirm Account Removal</source>
<translation>確認移除帳號</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="835"/>
+ <location filename="../src/gui/accountsettings.cpp" line="856"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;您確定要中斷此帳號 &lt;i&gt;%1&lt;/i&gt; 的連線?&lt;/p&gt;&lt;p&gt;&lt;b&gt;注意:&lt;/b&gt;此操作 &lt;b&gt;不會&lt;/b&gt; 刪除任何的檔案。&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="841"/>
+ <location filename="../src/gui/accountsettings.cpp" line="862"/>
<source>Remove connection</source>
<translation>移除連線</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="269"/>
- <location filename="../src/gui/accountsettings.cpp" line="295"/>
+ <location filename="../src/gui/accountsettings.cpp" line="298"/>
<source>Open folder</source>
<translation>開啟資料夾</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="199"/>
- <location filename="../src/gui/accountsettings.cpp" line="700"/>
+ <location filename="../src/gui/accountsettings.cpp" line="713"/>
<source>Log out</source>
<translation>登出</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Resume sync</source>
<translation>繼續同步</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="313"/>
+ <location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Pause sync</source>
<translation>暫停同步</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="439"/>
+ <location filename="../src/gui/accountsettings.cpp" line="446"/>
<source>&lt;p&gt;Do you really want to stop syncing the folder &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;您確定要停止同步資料夾 &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;注意:&lt;/b&gt; 此操作 &lt;b&gt;不會&lt;/b&gt; 刪除任何檔案&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="604"/>
+ <location filename="../src/gui/accountsettings.cpp" line="612"/>
<source>%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.</source>
<translation>%1 (%3%) 中的 %2 正在使用, 有些資料夾,包括網路掛載或分享資料夾,可能有不同的限制。</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="605"/>
+ <location filename="../src/gui/accountsettings.cpp" line="613"/>
<source>%1 of %2 in use</source>
<translation>已使用 %2 中的 %1%</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="614"/>
+ <location filename="../src/gui/accountsettings.cpp" line="622"/>
<source>Currently there is no storage usage information available.</source>
<translation>目前無法查詢儲存空間使用資訊。</translation>
</message>
<message>
- <location filename="../src/gui/accountsettings.cpp" line="680"/>
+ <location filename="../src/gui/accountsettings.cpp" line="658"/>
+ <source>The server version %1 is unsupported! Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/accountsettings.cpp" line="688"/>
<source>No %1 connection configured.</source>
<translation>沒有 %1 連線設置。</translation>
</message>
@@ -351,47 +370,47 @@
<context>
<name>OCC::AccountState</name>
<message>
- <location filename="../src/gui/accountstate.cpp" line="124"/>
+ <location filename="../src/gui/accountstate.cpp" line="119"/>
<source>Signed out</source>
<translation>已登出</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="126"/>
+ <location filename="../src/gui/accountstate.cpp" line="121"/>
<source>Disconnected</source>
<translation>已經離線</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="128"/>
+ <location filename="../src/gui/accountstate.cpp" line="123"/>
<source>Connected</source>
<translation>已連線</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="130"/>
+ <location filename="../src/gui/accountstate.cpp" line="125"/>
<source>Service unavailable</source>
<translation>服務無法使用</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="132"/>
+ <location filename="../src/gui/accountstate.cpp" line="127"/>
<source>Maintenance mode</source>
<translation>維護模式</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="134"/>
+ <location filename="../src/gui/accountstate.cpp" line="129"/>
<source>Network error</source>
<translation>網路異常</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="136"/>
+ <location filename="../src/gui/accountstate.cpp" line="131"/>
<source>Configuration error</source>
<translation>設定錯誤</translation>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="138"/>
+ <location filename="../src/gui/accountstate.cpp" line="133"/>
<source>Asking Credentials</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/accountstate.cpp" line="140"/>
+ <location filename="../src/gui/accountstate.cpp" line="135"/>
<source>Unknown account state</source>
<translation>未知的帳號狀態</translation>
</message>
@@ -412,44 +431,44 @@
<context>
<name>OCC::ActivitySettings</name>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="515"/>
- <location filename="../src/gui/activitywidget.cpp" line="563"/>
+ <location filename="../src/gui/activitywidget.cpp" line="520"/>
+ <location filename="../src/gui/activitywidget.cpp" line="568"/>
<source>Server Activity</source>
<translation>伺服器活動</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="522"/>
+ <location filename="../src/gui/activitywidget.cpp" line="527"/>
<source>Sync Protocol</source>
<translation>同步協定</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="571"/>
+ <location filename="../src/gui/activitywidget.cpp" line="576"/>
<source>Not Synced</source>
<translation>尚未同步</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="574"/>
+ <location filename="../src/gui/activitywidget.cpp" line="579"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>未同步(%1)</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="606"/>
+ <location filename="../src/gui/activitywidget.cpp" line="611"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>伺服器活動列表已經被複製到剪貼簿。</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="610"/>
+ <location filename="../src/gui/activitywidget.cpp" line="615"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>同步活動列表已經被複製到剪貼簿。</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="613"/>
+ <location filename="../src/gui/activitywidget.cpp" line="618"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation>未同步的清單已經被複製到剪貼簿。</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="618"/>
+ <location filename="../src/gui/activitywidget.cpp" line="623"/>
<source>Copied to clipboard</source>
<translation>複製至剪貼簿中</translation>
</message>
@@ -469,47 +488,47 @@
<translation>文字標籤</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="131"/>
+ <location filename="../src/gui/activitywidget.cpp" line="136"/>
<source>Server Activities</source>
<translation>伺服器活動</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="87"/>
+ <location filename="../src/gui/activitywidget.cpp" line="92"/>
<source>Copy</source>
<translation>複製</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="88"/>
+ <location filename="../src/gui/activitywidget.cpp" line="93"/>
<source>Copy the activity list to the clipboard.</source>
<translation>複製活動列表到剪貼簿。</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="135"/>
+ <location filename="../src/gui/activitywidget.cpp" line="140"/>
<source>Action Required: Notifications</source>
<translation>需要動作: 通知</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="140"/>
+ <location filename="../src/gui/activitywidget.cpp" line="145"/>
<source>&lt;br/&gt;Account %1 does not have activities enabled.</source>
<translation>&lt;br/&gt; 帳號 %1 尚未啟用紀錄行為功能</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="349"/>
+ <location filename="../src/gui/activitywidget.cpp" line="354"/>
<source>You received %n new notification(s) from %2.</source>
<translation><numerusform>您收到 %n 新的通知從 %2</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/activitywidget.cpp" line="356"/>
+ <location filename="../src/gui/activitywidget.cpp" line="361"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation><numerusform>您收到 %n 新的通知從 %1 跟 %2</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="358"/>
+ <location filename="../src/gui/activitywidget.cpp" line="363"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation>您收到 %n 新的通知從 %1, %2 跟其他帳戶</translation>
</message>
<message>
- <location filename="../src/gui/activitywidget.cpp" line="362"/>
+ <location filename="../src/gui/activitywidget.cpp" line="367"/>
<source>%1 Notifications - Action Required</source>
<translation>%1 通知 - 需要動作</translation>
</message>
@@ -555,17 +574,42 @@
<context>
<name>OCC::Application</name>
<message>
- <location filename="../src/gui/application.cpp" line="164"/>
+ <location filename="../src/gui/application.cpp" line="122"/>
+ <source>Continuing will mean &lt;b&gt;deleting these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="124"/>
+ <source>Continuing will mean &lt;b&gt;ignoring these settings&lt;/b&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="130"/>
+ <source>Some settings were configured in newer versions of this client and use features that are not available in this version.&lt;br&gt;&lt;br&gt;%1&lt;br&gt;&lt;br&gt;The current configuration file was already backed up to &lt;i&gt;%2&lt;/i&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="137"/>
+ <source>Quit</source>
+ <translation>離開</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="138"/>
+ <source>Continue</source>
+ <translation>繼續</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/application.cpp" line="255"/>
<source>Error accessing the configuration file</source>
<translation>存取配置文件時錯誤</translation>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="165"/>
+ <location filename="../src/gui/application.cpp" line="256"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/application.cpp" line="168"/>
+ <location filename="../src/gui/application.cpp" line="259"/>
<source>Quit ownCloud</source>
<translation>退出 ownCloud</translation>
</message>
@@ -596,7 +640,7 @@
<context>
<name>OCC::CleanupPollsJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="1001"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="1027"/>
<source>Error writing metadata to the database</source>
<translation>寫入後設資料(metadata) 時發生錯誤</translation>
</message>
@@ -604,32 +648,32 @@
<context>
<name>OCC::ConnectionValidator</name>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="75"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="46"/>
<source>No ownCloud account configured</source>
<translation>沒有設置 ownCloud 帳號</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="281"/>
<source>The configured server for this client is too old</source>
<translation>設置的伺服器對這個客戶端來說太舊了</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="282"/>
<source>Please update to the latest server and restart the client.</source>
<translation>請將伺服器端更新到最新版並重新啟動客戶端</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="143"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation>驗證錯誤︰使用者名稱或是密碼錯誤</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="184"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="155"/>
<source>timeout</source>
<translation>逾時</translation>
</message>
<message>
- <location filename="../src/libsync/connectionvalidator.cpp" line="221"/>
+ <location filename="../src/gui/connectionvalidator.cpp" line="192"/>
<source>The provided credentials are not correct</source>
<translation>提供的憑證不正確</translation>
</message>
@@ -637,131 +681,158 @@
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
- <location filename="../src/libsync/discoveryphase.cpp" line="613"/>
+ <location filename="../src/libsync/discoveryphase.cpp" line="631"/>
<source>Aborted by the user</source>
<translation>使用者中斷</translation>
</message>
</context>
<context>
+ <name>OCC::DiscoverySingleDirectoryJob</name>
+ <message>
+ <location filename="../src/libsync/discoveryphase.cpp" line="392"/>
+ <source>The server file discovery reply is missing data.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::Folder</name>
<message>
- <location filename="../src/gui/folder.cpp" line="136"/>
+ <location filename="../src/gui/folder.cpp" line="150"/>
<source>Local folder %1 does not exist.</source>
<translation>本地資料夾 %1 不存在</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="139"/>
+ <location filename="../src/gui/folder.cpp" line="153"/>
<source>%1 should be a folder but is not.</source>
<translation>資料夾不存在, %1 必須是資料夾</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="142"/>
+ <location filename="../src/gui/folder.cpp" line="156"/>
<source>%1 is not readable.</source>
<translation>%1 是不可讀的</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="366"/>
+ <location filename="../src/gui/folder.cpp" line="380"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation>%1 已被移除。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="373"/>
+ <location filename="../src/gui/folder.cpp" line="387"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation>%1 已被下載。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="380"/>
+ <location filename="../src/gui/folder.cpp" line="394"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation>%1 已被更新。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="387"/>
+ <location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation>%1 已被重新命名為 %2。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="394"/>
+ <location filename="../src/gui/folder.cpp" line="408"/>
<source>%1 has been moved to %2.</source>
<translation>%1 已被搬移至 %2。</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="364"/>
+ <location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation><numerusform>%1 跟 %n 其他檔案已經被刪除</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="371"/>
+ <location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation><numerusform>%1 跟 %n 其他檔案已經被下載</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="378"/>
+ <location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation><numerusform>%1 跟 %n 其他檔案已經被修改</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="385"/>
+ <location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="392"/>
+ <location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="399"/>
+ <location filename="../src/gui/folder.cpp" line="413"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="401"/>
+ <location filename="../src/gui/folder.cpp" line="415"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../src/gui/folder.cpp" line="406"/>
+ <location filename="../src/gui/folder.cpp" line="420"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="408"/>
+ <location filename="../src/gui/folder.cpp" line="422"/>
<source>%1 could not be synced due to an error. See the log for details.</source>
<translation>%1 因為錯誤無法被同步。請從紀錄檔觀看細節。</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="414"/>
+ <location filename="../src/gui/folder.cpp" line="428"/>
<source>Sync Activity</source>
<translation>同步活動</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="640"/>
+ <location filename="../src/gui/folder.cpp" line="673"/>
<source>Could not read system exclude file</source>
<translation>無法讀取系統的排除檔案</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="888"/>
+ <location filename="../src/gui/folder.cpp" line="961"/>
<source>A new folder larger than %1 MB has been added: %2.
</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="891"/>
+ <location filename="../src/gui/folder.cpp" line="964"/>
<source>A folder from an external storage has been added.
</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="892"/>
+ <location filename="../src/gui/folder.cpp" line="965"/>
<source>Please go in the settings to select it if you wish to download it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="927"/>
+ <location filename="../src/gui/folder.cpp" line="1020"/>
+ <source>The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1023"/>
+ <source>The file %1 was created but was excluded from synchronization previously. It will not be synchronized.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1034"/>
+ <source>Changes in synchronized folders could not be tracked reliably.
+
+This means that the synchronization client might not upload local changes immediately and will instead only scan for local changes and upload them occasionally (every two hours by default).
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folder.cpp" line="1079"/>
<source>All files in the sync folder '%1' folder were deleted on the server.
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
@@ -769,46 +840,46 @@ If you decide to delete the files, they will be unavailable to you, unless you a
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="932"/>
+ <location filename="../src/gui/folder.cpp" line="1084"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="936"/>
+ <location filename="../src/gui/folder.cpp" line="1088"/>
<source>Remove All Files?</source>
<translation>移除所有檔案?</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="939"/>
+ <location filename="../src/gui/folder.cpp" line="1091"/>
<source>Remove all files</source>
<translation>移除所有檔案</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="940"/>
+ <location filename="../src/gui/folder.cpp" line="1092"/>
<source>Keep files</source>
<translation>保留檔案</translation>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="957"/>
+ <location filename="../src/gui/folder.cpp" line="1109"/>
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
This might be because a backup was restored on the server.
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="962"/>
+ <location filename="../src/gui/folder.cpp" line="1114"/>
<source>Backup detected</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="965"/>
+ <location filename="../src/gui/folder.cpp" line="1117"/>
<source>Normal Synchronisation</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folder.cpp" line="966"/>
+ <location filename="../src/gui/folder.cpp" line="1118"/>
<source>Keep Local Files as Conflict</source>
<translation type="unfinished"/>
</message>
@@ -816,115 +887,105 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderMan</name>
<message>
- <location filename="../src/gui/folderman.cpp" line="311"/>
+ <location filename="../src/gui/folderman.cpp" line="331"/>
<source>Could not reset folder state</source>
<translation>無法重置資料夾狀態</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="312"/>
+ <location filename="../src/gui/folderman.cpp" line="332"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>發現較舊的同步處理日誌&apos;%1&apos;,但無法移除。請確認沒有應用程式正在使用它。</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1054"/>
+ <location filename="../src/gui/folderman.cpp" line="1087"/>
<source> (backup)</source>
<translation>(備份)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1059"/>
+ <location filename="../src/gui/folderman.cpp" line="1092"/>
<source> (backup %1)</source>
<translation>(備份 %1)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1265"/>
+ <location filename="../src/gui/folderman.cpp" line="1270"/>
<source>Undefined State.</source>
<translation>未知狀態</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1268"/>
+ <location filename="../src/gui/folderman.cpp" line="1273"/>
<source>Waiting to start syncing.</source>
<translation>正在等待同步開始</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1271"/>
+ <location filename="../src/gui/folderman.cpp" line="1276"/>
<source>Preparing for sync.</source>
<translation>正在準備同步。</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1274"/>
+ <location filename="../src/gui/folderman.cpp" line="1279"/>
<source>Sync is running.</source>
<translation>同步執行中</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1277"/>
- <source>Last Sync was successful.</source>
- <translation>最後一次同步成功</translation>
+ <location filename="../src/gui/folderman.cpp" line="1284"/>
+ <source>Sync was successful, unresolved conflicts.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1282"/>
- <source>Last Sync was successful, but with warnings on individual files.</source>
- <translation>最新一次的同步已經成功,但是有部份檔案有問題</translation>
+ <location filename="../src/gui/folderman.cpp" line="1286"/>
+ <source>Last Sync was successful.</source>
+ <translation>最後一次同步成功</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1285"/>
+ <location filename="../src/gui/folderman.cpp" line="1292"/>
<source>Setup Error.</source>
<translation>安裝失敗</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1288"/>
+ <location filename="../src/gui/folderman.cpp" line="1295"/>
<source>User Abort.</source>
<translation>使用者中斷。</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1291"/>
+ <location filename="../src/gui/folderman.cpp" line="1298"/>
<source>Sync is paused.</source>
<translation>同步已暫停</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1297"/>
+ <location filename="../src/gui/folderman.cpp" line="1304"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (同步暫停)</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1305"/>
+ <location filename="../src/gui/folderman.cpp" line="1312"/>
<source>No valid folder selected!</source>
<translation>沒有選擇有效的資料夾</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1315"/>
+ <location filename="../src/gui/folderman.cpp" line="1322"/>
<source>The selected path is not a folder!</source>
<translation>所選的路徑並非資料夾!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1319"/>
+ <location filename="../src/gui/folderman.cpp" line="1326"/>
<source>You have no permission to write to the selected folder!</source>
<translation>您沒有權限來寫入被選取的資料夾!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1369"/>
- <source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1384"/>
+ <location filename="../src/gui/folderman.cpp" line="1382"/>
<source>There is already a sync from the server to this local folder. Please pick another local folder!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1344"/>
+ <location filename="../src/gui/folderman.cpp" line="1362"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>本地資料夾 %1 裡已經有被資料夾同步功能使用的資料夾,請選擇其他資料夾!</translation>
</message>
<message>
- <location filename="../src/gui/folderman.cpp" line="1354"/>
+ <location filename="../src/gui/folderman.cpp" line="1368"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>本地資料夾 %1 是被包含在一個已經被資料夾同步功能使用的資料夾,請選擇其他資料夾!</translation>
</message>
- <message>
- <location filename="../src/gui/folderman.cpp" line="1362"/>
- <source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
- <translation>本地資料夾 %1 是一個捷徑,此捷徑的目標是被包含在一個已經被資料夾同步功能使用的資料夾,請選擇其他資料夾!</translation>
- </message>
</context>
<context>
<name>OCC::FolderStatusDelegate</name>
@@ -934,7 +995,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>新增資料夾同步功能的連線</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
+ <location filename="../src/gui/folderstatusdelegate.cpp" line="247"/>
<source>Synchronizing with local folder</source>
<translation type="unfinished"/>
</message>
@@ -969,7 +1030,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>從伺服器端同步資料夾清單時發生錯誤。</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="231"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="235"/>
<source>Signed out</source>
<translation>已登出</translation>
</message>
@@ -984,115 +1045,133 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="878"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>檢查 &apos;%1&apos; 的變動</translation>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="215"/>
+ <source>New files are being created as virtual files.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="900"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="911"/>
<source>Reconciling changes</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
<source>, &apos;%1&apos;</source>
<extracomment>Build a list of file names</extracomment>
<translation>, &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="922"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="949"/>
<source>&apos;%1&apos;</source>
<extracomment>Argument is a file name</extracomment>
<translation>&apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="946"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="973"/>
<source>Syncing %1</source>
<extracomment>Example text: &quot;Syncing 'foo.txt', 'bar.txt'&quot;</extracomment>
<translation>同步 %1</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="948"/>
- <location filename="../src/gui/folderstatusmodel.cpp" line="960"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="975"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
<source>, </source>
<translation>, </translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="952"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="979"/>
<source>download %1/s</source>
<extracomment>Example text: &quot;download 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>下載 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="954"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="981"/>
<source>u2193 %1/s</source>
<translation>u2193 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="963"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="989"/>
<source>upload %1/s</source>
<extracomment>Example text: &quot;upload 24Kb/s&quot; (%1 is replaced by 24Kb (translated))</extracomment>
<translation>上傳 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="965"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="991"/>
<source>u2191 %1/s</source>
<translation>u2191 %1/s</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="972"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="997"/>
<source>%1 %2 (%3 of %4)</source>
<extracomment>Example text: &quot;uploading foobar.png (2MB of 2MB)&quot;</extracomment>
<translation>%1 %2 (%3 的 %4)</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="976"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
<source>%1 %2</source>
<extracomment>Example text: &quot;uploading foobar.png&quot;</extracomment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1020"/>
<source>%5 left, %1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;5 minutes left, 12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1003"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1028"/>
<source>%1 of %2, file %3 of %4</source>
<extracomment>Example text: &quot;12 MB of 345 MB, file 6 of 7&quot;</extracomment>
<translation>%1 的 %2, 檔案 %3 的 %4</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1010"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1035"/>
<source>file %1 of %2</source>
<translation>檔案 %1 的 %2</translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1056"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1081"/>
<source>Waiting...</source>
<translation>等待中...</translation>
</message>
<message numerus="yes">
- <location filename="../src/gui/folderstatusmodel.cpp" line="1058"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1083"/>
<source>Waiting for %n other folder(s)...</source>
<translation><numerusform>正在等候 %n 的資料夾(可能不只一個)</numerusform></translation>
</message>
<message>
- <location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
+ <location filename="../src/gui/folderstatusmodel.cpp" line="1089"/>
<source>Preparing to sync...</source>
<translation>正在準備同步...</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWatcherPrivate</name>
+ <message>
+ <location filename="../src/gui/folderwatcher_linux.cpp" line="87"/>
+ <source>This problem usually happens when the inotify watches are exhausted. Check the FAQ for details.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FolderWizard</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="548"/>
+ <location filename="../src/gui/folderwizard.cpp" line="570"/>
<source>Add Folder Sync Connection</source>
<translation>新增資料夾同步功能的連線</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="550"/>
+ <location filename="../src/gui/folderwizard.cpp" line="572"/>
<source>Add Sync Connection</source>
<translation>新增同步連線</translation>
</message>
@@ -1100,17 +1179,17 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="67"/>
+ <location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Click to select a local folder to sync.</source>
<translation>請選擇要同步的本地資料夾</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="72"/>
+ <location filename="../src/gui/folderwizard.cpp" line="75"/>
<source>Enter the path to the local folder.</source>
<translation>請輸入本地資料夾的路徑</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="133"/>
+ <location filename="../src/gui/folderwizard.cpp" line="136"/>
<source>Select the source folder</source>
<translation>選擇來源資料夾</translation>
</message>
@@ -1118,60 +1197,68 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="181"/>
+ <location filename="../src/gui/folderwizard.cpp" line="184"/>
<source>Create Remote Folder</source>
<translation>建立遠端資料夾</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="182"/>
+ <location filename="../src/gui/folderwizard.cpp" line="185"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>請輸入欲創建在 &apos;%1&apos; 底下的新資料夾名稱:</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="212"/>
+ <location filename="../src/gui/folderwizard.cpp" line="215"/>
<source>Folder was successfully created on %1.</source>
<translation>資料夾成功建立在%1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="223"/>
+ <location filename="../src/gui/folderwizard.cpp" line="226"/>
<source>Authentication failed accessing %1</source>
<translation>存取 %1 認証失敗 </translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="225"/>
+ <location filename="../src/gui/folderwizard.cpp" line="228"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation>在 %1 建立資料夾失敗,請手動檢查</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="234"/>
+ <location filename="../src/gui/folderwizard.cpp" line="237"/>
<source>Failed to list a folder. Error: %1</source>
<translation>取得資料夾清單失敗,錯誤: %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="315"/>
+ <location filename="../src/gui/folderwizard.cpp" line="318"/>
<source>Choose this to sync the entire account</source>
<translation> 請選擇這個功能用來同步整個帳號</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="445"/>
+ <location filename="../src/gui/folderwizard.cpp" line="448"/>
<source>This folder is already being synced.</source>
<translation>這個資料夾已經被同步了。</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="447"/>
+ <location filename="../src/gui/folderwizard.cpp" line="450"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation>您已經同步了 &lt;i&gt;%1&lt;/i&gt;, 這個資料夾是 &lt;i&gt;%2&lt;/i&gt; 的母資料夾。</translation>
</message>
</context>
<context>
+ <name>OCC::FolderWizardSelectiveSync</name>
+ <message>
+ <location filename="../src/gui/folderwizard.cpp" line="489"/>
+ <source>Use virtual files instead of downloading content immediately (experimental)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="48"/>
+ <location filename="../src/gui/folderwizard.cpp" line="49"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;警告:&lt;/b&gt; %1</translation>
</message>
<message>
- <location filename="../src/gui/folderwizard.cpp" line="50"/>
+ <location filename="../src/gui/folderwizard.cpp" line="51"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation>&lt;b&gt;警告:&lt;/b&gt;</translation>
</message>
@@ -1179,22 +1266,22 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<context>
<name>OCC::GETFileJob</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="183"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="187"/>
<source>No E-Tag received from server, check Proxy/Gateway</source>
<translation>沒有收到來自伺服器的 E-Tag,請檢查代理伺服器或網路閘道</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="190"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="194"/>
<source>We received a different E-Tag for resuming. Retrying next time.</source>
<translation>在復原時收到了不同的 E-Tag,將在下一次重新嘗試取得</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="217"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="221"/>
<source>Server returned wrong content-range</source>
<translation>伺服器回應錯誤的內容長度</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="330"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="333"/>
<source>Connection Timeout</source>
<translation>連線逾時</translation>
</message>
@@ -1217,23 +1304,38 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="139"/>
+ <location filename="../src/gui/generalsettings.ui" line="67"/>
+ <source>&amp;Channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="84"/>
+ <source>stable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="89"/>
+ <source>beta</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="157"/>
<source>Advanced</source>
<translation>進階</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="171"/>
+ <location filename="../src/gui/generalsettings.ui" line="189"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="191"/>
+ <location filename="../src/gui/generalsettings.ui" line="209"/>
<source>MB</source>
<extracomment>Trailing part of &quot;Ask confirmation before syncing folder larger than&quot; </extracomment>
<translation>MB</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="215"/>
+ <location filename="../src/gui/generalsettings.ui" line="233"/>
<source>Ask for confirmation before synchronizing external storages</source>
<translation type="unfinished"/>
</message>
@@ -1253,31 +1355,67 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>使用&amp;單色圖示</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="147"/>
+ <location filename="../src/gui/generalsettings.ui" line="165"/>
<source>Edit &amp;Ignored Files</source>
<translation>編輯&amp;被忽略的檔案</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="232"/>
+ <location filename="../src/gui/generalsettings.ui" line="244"/>
+ <source>Show sync folders in &amp;Explorer&apos;s Navigation Pane</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.ui" line="261"/>
<source>S&amp;how crash reporter</source>
<translation>&amp;顯示意外回報器</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="53"/>
- <location filename="../src/gui/generalsettings.ui" line="65"/>
- <source>About</source>
- <translation>關於</translation>
- </message>
- <message>
- <location filename="../src/gui/generalsettings.ui" line="75"/>
<source>Updates</source>
<translation>更新</translation>
</message>
<message>
- <location filename="../src/gui/generalsettings.ui" line="100"/>
+ <location filename="../src/gui/generalsettings.ui" line="116"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation>重新啟動並更新 (&amp;R)</translation>
</message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="173"/>
+ <source>Change update channel?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="174"/>
+ <source>The update channel determines which client updates will be offered for installation. The &quot;stable&quot; channel contains only upgrades that are considered reliable, while the versions in the &quot;beta&quot; channel may contain newer features and bugfixes, but have not yet been tested thoroughly.
+
+Note that this selects only what pool upgrades are taken from, and that there are no downgrades: So going back from the beta channel to the stable channel usually cannot be done immediately and means waiting for a stable version that is newer than the currently installed beta version.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="187"/>
+ <source>Change update channel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/generalsettings.cpp" line="188"/>
+ <source>Cancel</source>
+ <translation>取消</translation>
+ </message>
+</context>
+<context>
+ <name>OCC::GetOrCreatePublicLinkShare</name>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="519"/>
+ <source>Sharing error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="520"/>
+ <source>Could not retrieve or create the public link share. Error:
+
+%1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::HttpCredentialsGui</name>
@@ -1345,7 +1483,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>移除</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="41"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="42"/>
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
@@ -1354,27 +1492,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
當資料夾被移除時,會根據清單裡的允許刪除選項來避免那些檔案會被移除。而這對元資料是有用的。</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="124"/>
<source>Could not open file</source>
<translation>無法開啟檔案</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="118"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="125"/>
<source>Cannot write changes to &apos;%1&apos;.</source>
<translation>%1 無法寫入變更。</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="151"/>
<source>Add Ignore Pattern</source>
<translation>增加忽略格式</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="152"/>
<source>Add a new ignore pattern:</source>
<translation>增加一個新的忽略格式:</translation>
</message>
<message>
- <location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
+ <location filename="../src/gui/ignorelisteditor.cpp" line="48"/>
<source>This entry is provided by the system at &apos;%1&apos; and cannot be modified in this view.</source>
<translation>這個項目是由系統提供在 &apos;%1&apos; 且不能在這個頁面被修改</translation>
</message>
@@ -1404,7 +1542,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
- <location filename="../src/gui/issueswidget.cpp" line="83"/>
+ <location filename="../src/gui/issueswidget.cpp" line="93"/>
<source>Folder</source>
<translation>資料夾</translation>
</message>
@@ -1419,35 +1557,45 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="133"/>
+ <location filename="../src/gui/issueswidget.ui" line="137"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="155"/>
+ <location filename="../src/gui/issueswidget.ui" line="147"/>
+ <source>There were conflicts. Check the documentation on how to resolve them.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/issueswidget.ui" line="180"/>
<source>Copy the issues list to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/issueswidget.ui" line="158"/>
+ <location filename="../src/gui/issueswidget.ui" line="183"/>
<source>Copy</source>
<translation>複製</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="81"/>
+ <location filename="../src/gui/issueswidget.cpp" line="91"/>
<source>Time</source>
<translation>時間</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="82"/>
+ <location filename="../src/gui/issueswidget.cpp" line="92"/>
<source>File</source>
<translation>檔案</translation>
</message>
<message>
- <location filename="../src/gui/issueswidget.cpp" line="84"/>
+ <location filename="../src/gui/issueswidget.cpp" line="94"/>
<source>Issue</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/issueswidget.cpp" line="126"/>
+ <source>There were conflicts. &lt;a href=&quot;%1&quot;&gt;Check the documentation on how to resolve them.&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::LogBrowser</name>
@@ -1473,36 +1621,48 @@ Items where deletion is allowed will be deleted if they prevent a directory from
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
+ <source>Permanently save logs</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="103"/>
+ <source>When this option is enabled and no other logging is configured, logs will be written to a temporary folder and expire after a few hours. This setting persists across client restarts.
+
+Logs will be written to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/logbrowser.cpp" line="115"/>
<source>Clear</source>
<translation>清除</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="102"/>
+ <location filename="../src/gui/logbrowser.cpp" line="116"/>
<source>Clear the log display.</source>
<translation>清除所顯示的記錄</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="108"/>
+ <location filename="../src/gui/logbrowser.cpp" line="122"/>
<source>S&amp;ave</source>
<translation>儲存 (&amp;A)</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="109"/>
+ <location filename="../src/gui/logbrowser.cpp" line="123"/>
<source>Save the log file to a file on disk for debugging.</source>
<translation>將記錄檔儲存到硬碟用於除錯</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="198"/>
+ <location filename="../src/gui/logbrowser.cpp" line="212"/>
<source>Save log file</source>
<translation>儲存記錄檔</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Error</source>
<translation>錯誤</translation>
</message>
<message>
- <location filename="../src/gui/logbrowser.cpp" line="208"/>
+ <location filename="../src/gui/logbrowser.cpp" line="222"/>
<source>Could not write to log file %1</source>
<translation>無法寫入記錄檔 %1</translation>
</message>
@@ -1510,12 +1670,12 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::Logger</name>
<message>
- <location filename="../src/libsync/logger.cpp" line="195"/>
+ <location filename="../src/libsync/logger.cpp" line="164"/>
<source>Error</source>
<translation>錯誤</translation>
</message>
<message>
- <location filename="../src/libsync/logger.cpp" line="196"/>
+ <location filename="../src/libsync/logger.cpp" line="165"/>
<source>&lt;nobr&gt;File &apos;%1&apos;&lt;br/&gt;cannot be opened for writing.&lt;br/&gt;&lt;br/&gt;The log output can &lt;b&gt;not&lt;/b&gt; be saved!&lt;/nobr&gt;</source>
<translation>&lt;nobr&gt;檔案 &apos;%1&apos;&lt;br/&gt;無法開啟與寫入&lt;br/&gt;&lt;br/&gt;記錄 &lt;b&gt;無法&lt;/b&gt; 被儲存&lt;/nobr&gt;</translation>
</message>
@@ -1523,27 +1683,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NSISUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="332"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="359"/>
<source>New Version Available</source>
<translation>有新版本</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="338"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="365"/>
<source>&lt;p&gt;A new version of the %1 Client is available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; is available for download. The installed version is %3.&lt;/p&gt;</source>
<translation>&lt;p&gt;%1 客戶端有新版本了。&lt;/p&gt;&lt;p&gt;&lt;b&gt;%2&lt;/b&gt; 可供下載, 目前安裝的版本是 %3.&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="352"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="379"/>
<source>Skip this version</source>
<translation>跳過這個版本</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="353"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="380"/>
<source>Skip this time</source>
<translation>跳過這次更新</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="354"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="381"/>
<source>Get update</source>
<translation>取得更新</translation>
</message>
@@ -1631,27 +1791,27 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<translation>自動限制</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="34"/>
+ <location filename="../src/gui/networksettings.cpp" line="37"/>
<source>Hostname of proxy server</source>
<translation>代理伺服器主機名稱</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="35"/>
+ <location filename="../src/gui/networksettings.cpp" line="38"/>
<source>Username for proxy server</source>
<translation>代理伺服器使用者名稱</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="36"/>
+ <location filename="../src/gui/networksettings.cpp" line="39"/>
<source>Password for proxy server</source>
<translation>代理伺服器密碼</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="38"/>
+ <location filename="../src/gui/networksettings.cpp" line="41"/>
<source>HTTP(S) proxy</source>
<translation>HTTP(S) 代理伺服器</translation>
</message>
<message>
- <location filename="../src/gui/networksettings.cpp" line="39"/>
+ <location filename="../src/gui/networksettings.cpp" line="42"/>
<source>SOCKS5 proxy</source>
<translation>SOCKS5 代理伺服器</translation>
</message>
@@ -1659,23 +1819,23 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::NotificationWidget</name>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="55"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="64"/>
<source>Created at %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="104"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="113"/>
<source>Closing in a few seconds...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="138"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="147"/>
<source>%1 request failed at %2</source>
<extracomment>The second parameter is a time, such as 'failed at 09:58pm'</extracomment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/notificationwidget.cpp" line="144"/>
+ <location filename="../src/gui/notificationwidget.cpp" line="153"/>
<source>&apos;%1&apos; selected at %2</source>
<extracomment>The second parameter is a time, such as 'selected at 09:58pm'</extracomment>
<translation type="unfinished"/>
@@ -1684,32 +1844,32 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OAuth</name>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="112"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="115"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="118"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="121"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="121"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="124"/>
<source>The reply from the server did not contain all expected fields</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="125"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="128"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/creds/oauth.cpp" line="131"/>
+ <location filename="../src/gui/creds/oauth.cpp" line="134"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -1717,59 +1877,59 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<context>
<name>OCC::OCUpdater</name>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="108"/>
<source>New %1 Update Ready</source>
<translation>新 %1 更新已經就緒</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="109"/>
<source>A new update for %1 is about to be installed. The updater may ask
for additional privileges during the process.</source>
<translation>一個新的 %1 更新已經安裝完成。更新也許會詢問
要求給予權限在安裝的過程中。</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="148"/>
<source>Downloading version %1. Please wait...</source>
<translation>正在下載版本 %1,請稍候...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="147"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="152"/>
<source>Could not download update. Please click &lt;a href=&apos;%1&apos;&gt;here&lt;/a&gt; to download the update manually.</source>
<translation>無法下載更新檔,請點選連結 &lt;a href=&apos;%1&apos;&gt;按這裡&lt;/a&gt; 手動下載更新檔。</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="154"/>
<source>Could not check for new updates.</source>
<translation>無法檢查是否有新更新檔。</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="145"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="150"/>
<source>%1 version %2 available. Restart application to start the update.</source>
<translation>%1 的版本 %2 已經可以安裝,請重新啟動應用程式開始安裝更新。</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="151"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="156"/>
<source>New %1 version %2 available. Please use the system&apos;s update tool to install it.</source>
<translation>新 %1 版本 %2 已經可以安裝了, 請使用系統的安裝工具來安裝。</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="153"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="158"/>
<source>Checking update server...</source>
<translation>檢查更新伺服器中...</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="155"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="160"/>
<source>Update status is unknown: Did not check for new updates.</source>
<translation>無法取得更新狀態: 無法檢查是否有新更新檔。</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="159"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="164"/>
<source>No updates available. Your installation is at the latest version.</source>
<translation>目前沒有可用的更新檔,您安裝的版本是最新的了。</translation>
</message>
<message>
- <location filename="../src/gui/updater/ocupdater.cpp" line="178"/>
+ <location filename="../src/gui/updater/ocupdater.cpp" line="183"/>
<source>Update Check</source>
<translation>更新檢查</translation>
</message>
@@ -1777,43 +1937,43 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudAdvancedSetupPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="48"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
<source>Connect to %1</source>
<translation>連線到 %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="49"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="50"/>
<source>Setup local folder options</source>
<translation>設定本地資料夾選項</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="58"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="59"/>
<source>Connect...</source>
<translation>連線中...</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="156"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="173"/>
<source>%1 folder &apos;%2&apos; is synced to local folder &apos;%3&apos;</source>
<translation>%1 資料夾 &apos;%2&apos; 與本地資料夾 &apos;%3&apos; 同步</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="176"/>
<source>Sync the folder &apos;%1&apos;</source>
<translation>同步資料夾 &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="181"/>
<source>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The local folder is not empty. Pick a resolution!&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;&lt;strong&gt;警告:&lt;/strong&gt; 本地端的資料夾不是空的. 請選擇解決方案!&lt;/small&gt;&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="285"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="308"/>
<source>Local Sync Folder</source>
<translation>本地同步資料夾</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="324"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="345"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="344"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="377"/>
<source>(%1)</source>
<translation>(%1)</translation>
</message>
@@ -1872,15 +2032,20 @@ for additional privileges during the process.</source>
<context>
<name>OCC::OwncloudOAuthCredsPage</name>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="43"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="45"/>
<source>Connect to %1</source>
<translation>連線到 %1</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="46"/>
<source>Login in your browser</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="57"/>
+ <source>Copy link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupPage</name>
@@ -1911,153 +2076,163 @@ It is not advisable to use it.</source>
<source>&amp;Next &gt;</source>
<translation>下一步 (&amp;N) &gt;</translation>
</message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="227"/>
+ <source>Invalid URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="346"/>
+ <source>Could not load certificate. Maybe wrong password?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>OCC::OwncloudSetupWizard</name>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="250"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="249"/>
<source>&lt;font color=&quot;green&quot;&gt;Successfully connected to %1: %2 version %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;成功連線到 %1: %2 版本 %3 (%4)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="280"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="279"/>
<source>Failed to connect to %1 at %2:&lt;br/&gt;%3</source>
<translation>從 %2 連線到 %1 失敗:&lt;br/&gt;%3</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="315"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="314"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation>從 %2 嘗試連線到 %1 逾時。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="334"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="333"/>
<source>Trying to connect to %1 at %2...</source>
<translation>嘗試連線到%1從%2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="385"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="384"/>
<source>The authenticated request to the server was redirected to &apos;%1&apos;. The URL is bad, the server is misconfigured.</source>
<translation>伺服器要求的認證請求被導向 &apos;%1&apos;,這個URL可能不安全,此伺服器可能設定有錯。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="407"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="406"/>
<source>There was an invalid response to an authenticated webdav request</source>
<translation>從webdav的認證要求中有無效的回傳值</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="397"/>
<source>Access forbidden by server. To verify that you have proper access, &lt;a href=&quot;%1&quot;&gt;click here&lt;/a&gt; to access the service with your browser.</source>
<translation>從伺服器存取被拒絕。為了正確驗證您的存取資訊 &lt;a href=&quot;%1&quot;&gt;請點選這裡&lt;/a&gt; 透過瀏覽器來存取服務</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="277"/>
<source>Invalid URL</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="296"/>
<source>The server reported the following error:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="451"/>
<source>Local sync folder %1 already exists, setting it up for sync.&lt;br/&gt;&lt;br/&gt;</source>
<translation>本地同步資料夾%1已存在, 將其設置為同步&lt;br/&gt;&lt;br/&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="455"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="454"/>
<source>Creating local sync folder %1...</source>
<translation>建立本地同步資料夾 %1...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="459"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="458"/>
<source>ok</source>
<translation>ok</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="461"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="460"/>
<source>failed.</source>
<translation>失敗</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="463"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="462"/>
<source>Could not create local folder %1</source>
<translation>無法建立本地資料夾 %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="489"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="488"/>
<source>No remote folder specified!</source>
<translation>沒有指定遠端資料夾!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="495"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="494"/>
<source>Error: %1</source>
<translation>錯誤: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="508"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="507"/>
<source>creating folder on ownCloud: %1</source>
<translation>在 ownCloud 建立資料夾: %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="524"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="523"/>
<source>Remote folder %1 created successfully.</source>
<translation>遠端資料夾%1建立成功!</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="525"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>遠端資料夾%1已存在,連線同步中</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="530"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="527"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="529"/>
<source>The folder creation resulted in HTTP error code %1</source>
<translation>在HTTP建立資料夾失敗, error code %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="532"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="531"/>
<source>The remote folder creation failed because the provided credentials are wrong!&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>由於帳號或密碼錯誤,遠端資料夾建立失敗&lt;br/&gt;請檢查您的帳號密碼。&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="536"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="535"/>
<source>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;Remote folder creation failed probably because the provided credentials are wrong.&lt;/font&gt;&lt;br/&gt;Please go back and check your credentials.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;font color=&quot;red&quot;&gt;遠端資料夾建立失敗,也許是因為所提供的帳號密碼錯誤&lt;/font&gt;&lt;br/&gt;請重新檢查您的帳號密碼&lt;/p&gt;</translation>
</message>
<message>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="540"/>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="541"/>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="542"/>
<source>Remote folder %1 creation failed with error &lt;tt&gt;%2&lt;/tt&gt;.</source>
<translation>建立遠端資料夾%1發生錯誤&lt;tt&gt;%2&lt;/tt&gt;失敗</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="559"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="558"/>
<source>A sync connection from %1 to remote directory %2 was set up.</source>
<translation>從%1到遠端資料夾%2的連線已建立</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="564"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="563"/>
<source>Successfully connected to %1!</source>
<translation>成功連接到 %1 !</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="571"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="570"/>
<source>Connection to %1 could not be established. Please check again.</source>
<translation>無法建立連線%1, 請重新檢查</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="584"/>
<source>Folder rename failed</source>
<translation>重新命名資料夾失敗</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="585"/>
<source>Can&apos;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.</source>
<translation>無法移除與備份此資料夾,因為有其他的程式正在使用其中的資料夾或者檔案。請關閉使用中的資料夾或檔案並重試或者取消設定。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
+ <location filename="../src/gui/owncloudsetupwizard.cpp" line="630"/>
<source>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;Local sync folder %1 successfully created!&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&quot;green&quot;&gt;&lt;b&gt;本地同步資料夾 %1 建立成功!&lt;/b&gt;&lt;/font&gt;</translation>
</message>
@@ -2065,14 +2240,31 @@ It is not advisable to use it.</source>
<context>
<name>OCC::OwncloudWizard</name>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="84"/>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="85"/>
<source>%1 Connection Wizard</source>
<translation>%1連線精靈</translation>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
- <source>Skip folders configuration</source>
- <translation>忽略資料夾設定資訊</translation>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="261"/>
+ <source>Enable experimental feature?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="262"/>
+ <source>When the &quot;virtual files&quot; mode is enabled no files will be downloaded initially. Instead, a tiny &quot;%1&quot; file will be created for each file that exists on the server. The contents can be downloaded by running these files or by using their context menu.
+
+This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="269"/>
+ <source>Enable experimental mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudwizard.cpp" line="270"/>
+ <source>Stay safe</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2096,7 +2288,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PollJob</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="134"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="135"/>
<source>Invalid JSON reply from the poll URL</source>
<translation>不合法的JSON資訊從URL中回傳</translation>
</message>
@@ -2104,7 +2296,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDirectory</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="953"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="979"/>
<source>Error writing metadata to the database</source>
<translation>寫入後設資料(metadata) 時發生錯誤</translation>
</message>
@@ -2112,47 +2304,47 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateDownloadFile</name>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="409"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="427"/>
<source>File %1 can not be downloaded because of a local file name clash!</source>
<translation>檔案 %1 無法被下載,因為本地端的檔案名稱已毀損!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="459"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="477"/>
<source>The download would reduce free local disk space below the limit</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="463"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="481"/>
<source>Free space on disk is less than %1</source>
<translation>可用的硬碟空間已經少於 %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="577"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="598"/>
<source>File was deleted from server</source>
<translation>檔案已從伺服器被刪除</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="630"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="650"/>
<source>The file could not be downloaded completely.</source>
<translation>檔案下載無法完成。</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="637"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="657"/>
<source>The downloaded file is empty despite the server announced it should have been %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="798"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="834"/>
<source>File %1 cannot be saved because of a local file name clash!</source>
<translation>檔案 %1 無法存檔,因為本地端的檔案名稱已毀損!</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="846"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="869"/>
<source>File has changed since discovery</source>
<translation>尋找的過程中檔案已經被更改</translation>
</message>
<message>
- <location filename="../src/libsync/propagatedownload.cpp" line="897"/>
+ <location filename="../src/libsync/propagatedownload.cpp" line="936"/>
<source>Error writing metadata to the database</source>
<translation>寫入後設資料(metadata) 時發生錯誤</translation>
</message>
@@ -2160,12 +2352,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateItemJob</name>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="234"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="235"/>
<source>; Restoration Failed: %1</source>
<translation>; 重新儲存失敗 %1</translation>
</message>
<message>
- <location filename="../src/libsync/owncloudpropagator.cpp" line="355"/>
+ <location filename="../src/libsync/owncloudpropagator.cpp" line="302"/>
<source>A file or folder was removed from a read only share, but restoring failed: %1</source>
<translation>檔案或目錄已經從只供讀取的分享中被移除,但是復原失敗: %1</translation>
</message>
@@ -2173,22 +2365,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalMkdir</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="158"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="169"/>
<source>could not delete file %1, error: %2</source>
<translation>無法刪除檔案 %1,錯誤: %2</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="166"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
<source>Attention, possible case sensitivity clash with %1</source>
<translation>注意! %1 的名稱可能有大小寫衝突。</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="190"/>
<source>could not create folder %1</source>
<translation>無法建立資料夾 %1</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="202"/>
<source>Error writing metadata to the database</source>
<translation>寫入後設資料(metadata) 時發生錯誤</translation>
</message>
@@ -2196,17 +2388,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRemove</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="76"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="77"/>
<source>Error removing &apos;%1&apos;: %2;</source>
<translation>移除時發生錯誤 &apos;%1&apos;: %2;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="102"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>無法移除資料夾 &apos;%1&apos;</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="122"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>無法刪除 %1 ,因為本地端的檔案名稱已毀損!</translation>
</message>
@@ -2214,13 +2406,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateLocalRename</name>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="219"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="240"/>
<source>File %1 can not be renamed to %2 because of a local file name clash</source>
<translation>檔案 %1 無法更名成 %2,因為本地端的檔案名稱已毀損</translation>
</message>
<message>
- <location filename="../src/libsync/propagatorjobs.cpp" line="250"/>
- <location filename="../src/libsync/propagatorjobs.cpp" line="255"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="271"/>
+ <location filename="../src/libsync/propagatorjobs.cpp" line="276"/>
<source>Error writing metadata to the database</source>
<translation>寫入後設資料(metadata) 時發生錯誤</translation>
</message>
@@ -2228,12 +2420,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteDelete</name>
<message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="100"/>
- <source>The file has been removed from a read only share. It was restored.</source>
- <translation>已復原從只供讀取的分享中被移除檔案</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotedelete.cpp" line="121"/>
+ <location filename="../src/libsync/propagateremotedelete.cpp" line="115"/>
<source>Wrong HTTP code returned by server. Expected 204, but received &quot;%1 %2&quot;.</source>
<translation>從伺服器端回傳錯誤的 HTTP 代碼, 預期是 204, 但是接收到的是 &quot;%1 %2&quot;.</translation>
</message>
@@ -2241,12 +2428,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMkdir</name>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="99"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="101"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>從伺服器端回傳錯誤的 HTTP 代碼, 預期是 201, 但是接收到的是 &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemkdir.cpp" line="151"/>
+ <location filename="../src/libsync/propagateremotemkdir.cpp" line="152"/>
<source>Error writing metadata to the database</source>
<translation>寫入後設資料(metadata) 時發生錯誤</translation>
</message>
@@ -2254,28 +2441,13 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="102"/>
- <source>This folder must not be renamed. It is renamed back to its original name.</source>
- <translation>這個資料夾不應該被更名,他已經被改回原本的名稱了。</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="104"/>
- <source>This folder must not be renamed. Please name it back to Shared.</source>
- <translation>這個資料夾已經被分享,不應該被更名,請改回原本的名稱。</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
- <source>The file was renamed but is part of a read only share. The original file was restored.</source>
- <translation>檔案更名完成,但這檔案是只供讀取的分享,原始檔案已被還原</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation>從伺服器端回傳錯誤的 HTTP 代碼, 預期是 201, 但是接收到的是 &quot;%1 %2&quot;.</translation>
</message>
<message>
- <location filename="../src/libsync/propagateremotemove.cpp" line="190"/>
- <location filename="../src/libsync/propagateremotemove.cpp" line="196"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="166"/>
+ <location filename="../src/libsync/propagateremotemove.cpp" line="172"/>
<source>Error writing metadata to the database</source>
<translation>寫入後設資料(metadata) 時發生錯誤</translation>
</message>
@@ -2283,33 +2455,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileCommon</name>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="175"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="176"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="291"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="283"/>
<source>File Removed</source>
<translation>檔案已移除</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="305"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="293"/>
<source>Local file changed during syncing. It will be resumed.</source>
<translation>本地端的檔案在同步的過程中被更改,此檔案將會被還原。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="317"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="305"/>
<source>Local file changed during sync.</source>
<translation>本地端的檔案在同步過程中被更改。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="186"/>
- <location filename="../src/libsync/propagateupload.cpp" line="549"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="187"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="542"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateupload.cpp" line="622"/>
+ <location filename="../src/libsync/propagateupload.cpp" line="624"/>
<source>Error writing metadata to the database</source>
<translation>寫入後設資料(metadata) 時發生錯誤</translation>
</message>
@@ -2317,27 +2489,27 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileNG</name>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="399"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="412"/>
<source>The local file was removed during sync.</source>
<translation>本地端的檔案在同步過程中被刪除。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="410"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="423"/>
<source>Local file changed during sync.</source>
<translation>本地端的檔案在同步過程中被更改。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="444"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="459"/>
<source>Unexpected return code from server (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="451"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
<source>Missing File ID from server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/propagateuploadng.cpp" line="465"/>
+ <location filename="../src/libsync/propagateuploadng.cpp" line="480"/>
<source>Missing ETag from server</source>
<translation type="unfinished"/>
</message>
@@ -2345,27 +2517,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileV1</name>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
- <source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
- <translation>檔案已經在本機上修改,但這檔案是只供讀取的分享,您的修改已還原並保存在衝突檔案中。</translation>
- </message>
- <message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="216"/>
<source>Poll URL missing</source>
<translation>缺少輪詢的超連結</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="228"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="240"/>
<source>The local file was removed during sync.</source>
<translation>本地端的檔案在同步過程中被刪除。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="239"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="251"/>
<source>Local file changed during sync.</source>
<translation>本地端的檔案在同步過程中被更改。</translation>
</message>
<message>
- <location filename="../src/libsync/propagateuploadv1.cpp" line="254"/>
+ <location filename="../src/libsync/propagateuploadv1.cpp" line="265"/>
<source>The server did not acknowledge the last chunk. (No e-tag was present)</source>
<translation>伺服器不承認檔案的最後一個分割檔。(e-tag不存在)</translation>
</message>
@@ -2383,42 +2550,47 @@ It is not advisable to use it.</source>
<translation>文字標籤</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="61"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="142"/>
+ <source>Open in browser</source>
+ <translation>用瀏覽器開啟</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/protocolwidget.cpp" line="193"/>
<source>Time</source>
<translation>時間</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="62"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="194"/>
<source>File</source>
<translation>檔案</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="63"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="195"/>
<source>Folder</source>
<translation>資料夾</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="64"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="196"/>
<source>Action</source>
<translation>動作</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="65"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="197"/>
<source>Size</source>
<translation>大小</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="85"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="217"/>
<source>Local sync protocol</source>
<translation>本機同步協定</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="87"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="219"/>
<source>Copy</source>
<translation>複製</translation>
</message>
<message>
- <location filename="../src/gui/protocolwidget.cpp" line="88"/>
+ <location filename="../src/gui/protocolwidget.cpp" line="220"/>
<source>Copy the activity list to the clipboard.</source>
<translation>複製活動列表到剪貼簿。</translation>
</message>
@@ -2459,7 +2631,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncDialog</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="457"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="459"/>
<source>Choose What to Sync</source>
<translation>選擇要同步的項目</translation>
</message>
@@ -2467,33 +2639,33 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SelectiveSyncWidget</name>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="74"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="73"/>
<source>Loading ...</source>
<translation>載入中…</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="80"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="79"/>
<source>Deselect remote folders you do not wish to synchronize.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="95"/>
<source>Name</source>
<translation>名稱</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="97"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="96"/>
<source>Size</source>
<translation>大小</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="225"/>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="275"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="227"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
<source>No subfolders currently on the server.</source>
<translation>目前沒有子資料夾在伺服器上。</translation>
</message>
<message>
- <location filename="../src/gui/selectivesyncdialog.cpp" line="277"/>
+ <location filename="../src/gui/selectivesyncdialog.cpp" line="279"/>
<source>An error occurred while loading the list of sub folders.</source>
<translation type="unfinished"/>
</message>
@@ -2503,7 +2675,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/servernotificationhandler.cpp" line="103"/>
<source>Dismiss</source>
- <translation type="unfinished"/>
+ <translation>忽略</translation>
</message>
</context>
<context>
@@ -2514,22 +2686,22 @@ It is not advisable to use it.</source>
<translation>設定</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="109"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="92"/>
<source>Activity</source>
<translation>活動</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="118"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="101"/>
<source>General</source>
<translation>一般</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="124"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="107"/>
<source>Network</source>
<translation>網路</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialog.cpp" line="230"/>
+ <location filename="../src/gui/settingsdialog.cpp" line="213"/>
<source>Account</source>
<translation>帳號</translation>
</message>
@@ -2537,28 +2709,28 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="93"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="94"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="98"/>
<source>Activity</source>
<translation>活動</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="111"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="112"/>
<source>General</source>
<translation>一般</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="115"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="116"/>
<source>Network</source>
<translation>網路</translation>
</message>
<message>
- <location filename="../src/gui/settingsdialogmac.cpp" line="152"/>
- <location filename="../src/gui/settingsdialogmac.cpp" line="211"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="154"/>
+ <location filename="../src/gui/settingsdialogmac.cpp" line="222"/>
<source>Account</source>
<translation>帳號</translation>
</message>
@@ -2586,42 +2758,42 @@ It is not advisable to use it.</source>
<translation>ownCloud 路徑:</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="109"/>
+ <location filename="../src/gui/sharedialog.cpp" line="110"/>
<source>%1 Sharing</source>
<translation>%1 分享</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="84"/>
+ <location filename="../src/gui/sharedialog.cpp" line="85"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="106"/>
+ <location filename="../src/gui/sharedialog.cpp" line="107"/>
<source>Folder: %2</source>
<translation>資料夾: %2</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="112"/>
+ <location filename="../src/gui/sharedialog.cpp" line="113"/>
<source>The server does not allow sharing</source>
<translation>伺服器不允許共享</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="127"/>
+ <location filename="../src/gui/sharedialog.cpp" line="129"/>
<source>Retrieving maximum possible sharing permissions from server...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="197"/>
+ <location filename="../src/gui/sharedialog.cpp" line="199"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>這個檔案無法被分享,並沒有分享此檔案的權限。</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="211"/>
+ <location filename="../src/gui/sharedialog.cpp" line="213"/>
<source>Users and Groups</source>
<translation>使用者及群組</translation>
</message>
<message>
- <location filename="../src/gui/sharedialog.cpp" line="218"/>
+ <location filename="../src/gui/sharedialog.cpp" line="220"/>
<source>Public Links</source>
<translation>公共連結</translation>
</message>
@@ -2634,7 +2806,17 @@ It is not advisable to use it.</source>
<translation>分享 新文件.odt</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="276"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="225"/>
+ <source>Upload only (File Drop)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="238"/>
+ <source>Receive files from others without revealing the contents of the folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="343"/>
<source>TextLabel</source>
<translation>文字標籤</translation>
</message>
@@ -2664,19 +2846,24 @@ It is not advisable to use it.</source>
<translation>設定密碼</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="178"/>
- <source>Link properties:</source>
+ <location filename="../src/gui/sharelinkwidget.ui" line="199"/>
+ <source>Recipients can view or download contents.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="220"/>
- <source>Show file listing</source>
- <translation type="unfinished"/>
+ <location filename="../src/gui/sharelinkwidget.ui" line="248"/>
+ <source>Download / View</source>
+ <translation>下載 / 檢視</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.ui" line="255"/>
+ <source>Download / View / Upload</source>
+ <translation>下載 / 檢視 / 上傳</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.ui" line="200"/>
- <source>Allow editing</source>
- <translation>允許編輯</translation>
+ <location filename="../src/gui/sharelinkwidget.ui" line="268"/>
+ <source>Recipients can view, download, edit, delete and upload contents.</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="20"/>
@@ -2684,95 +2871,95 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="117"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="301"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="118"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="318"/>
<source>P&amp;assword protect</source>
<translation>&amp;密碼保護</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="414"/>
- <source>Password Protected</source>
- <translation>密碼保護</translation>
- </message>
- <message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="96"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="97"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation>這個檔案無法被分享,並沒有分享此檔案的權限。</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="94"/>
<source>Link shares have been disabled</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="108"/>
<source>Create public link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="527"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="169"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="563"/>
<source>Delete</source>
<translation>刪除</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="163"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
<source>Open link in browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="164"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="165"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
<source>Copy link to clipboard (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="166"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
<source>Send link by email</source>
<translation>使用電子郵件傳送連結</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="167"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
<source>Send link by email (direct download)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="542"/>
+ <source>I shared %1 with you</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="556"/>
<source>Confirm Link Share Deletion</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="557"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="564"/>
<source>Cancel</source>
<translation>取消</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="63"/>
- <location filename="../src/gui/sharelinkwidget.cpp" line="544"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="580"/>
<source>Public link</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="257"/>
<source>Delete link share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="495"/>
<source>Public sh&amp;aring requires a password</source>
<translation>公開&amp;共享需要密碼</translation>
</message>
<message>
- <location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
+ <location filename="../src/gui/sharelinkwidget.cpp" line="513"/>
<source>Please Set Password</source>
<translation>請設定密碼</translation>
</message>
@@ -2795,32 +2982,32 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="210"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="241"/>
<source>Open link in browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="237"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="243"/>
<source>Copy link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="239"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="245"/>
<source>Send link by email</source>
<translation>使用電子郵件傳送連結</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="249"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="255"/>
<source>No results for &apos;%1&apos;</source>
<translation>&apos;%1&apos; 沒有結果</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="343"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
@@ -2833,37 +3020,38 @@ It is not advisable to use it.</source>
<translation>表單</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="37"/>
+ <location filename="../src/gui/shareuserline.ui" line="28"/>
+ <location filename="../src/gui/shareuserline.ui" line="35"/>
<source>TextLabel</source>
<translation>文字標籤</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="69"/>
+ <location filename="../src/gui/shareuserline.ui" line="65"/>
<source>can edit</source>
<translation>可編輯</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="76"/>
+ <location filename="../src/gui/shareuserline.ui" line="58"/>
<source>can share</source>
<translation>可分享</translation>
</message>
<message>
- <location filename="../src/gui/shareuserline.ui" line="83"/>
+ <location filename="../src/gui/shareuserline.ui" line="72"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="357"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
<source>create</source>
<translation>建立</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="360"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="366"/>
<source>change</source>
<translation>更動</translation>
</message>
<message>
- <location filename="../src/gui/shareusergroupwidget.cpp" line="363"/>
+ <location filename="../src/gui/shareusergroupwidget.cpp" line="369"/>
<source>delete</source>
<translation>刪除</translation>
</message>
@@ -2907,143 +3095,176 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SocketApi</name>
<message>
- <location filename="../src/gui/socketapi.cpp" line="491"/>
+ <location filename="../src/gui/socketapi.cpp" line="456"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation>與 %1 分享</translation>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="557"/>
+ <location filename="../src/gui/socketapi.cpp" line="490"/>
+ <source>Context menu share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="662"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="565"/>
+ <location filename="../src/gui/socketapi.cpp" line="675"/>
+ <location filename="../src/gui/socketapi.cpp" line="705"/>
<source>Share...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="567"/>
+ <location filename="../src/gui/socketapi.cpp" line="677"/>
+ <location filename="../src/gui/socketapi.cpp" line="722"/>
<source>Copy private link to clipboard</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/socketapi.cpp" line="568"/>
+ <location filename="../src/gui/socketapi.cpp" line="678"/>
<source>Send private link by email...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="703"/>
+ <source>Resharing this file is not allowed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="716"/>
+ <location filename="../src/gui/socketapi.cpp" line="718"/>
+ <source>Copy public link to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/socketapi.cpp" line="793"/>
+ <source>Open in browser</source>
+ <translation>用瀏覽器開啟</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="814"/>
+ <source>Download file(s)</source>
+ <translation type="unfinished"><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../src/gui/socketapi.cpp" line="817"/>
+ <source>Replace file(s) by virtual file</source>
+ <translation type="unfinished"><numerusform></numerusform></translation>
+ </message>
</context>
<context>
<name>OCC::SslButton</name>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="102"/>
+ <location filename="../src/gui/sslbutton.cpp" line="87"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation>&lt;h3&gt;憑證細節&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="105"/>
+ <location filename="../src/gui/sslbutton.cpp" line="90"/>
<source>Common Name (CN):</source>
<translation>(通用名):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="106"/>
+ <location filename="../src/gui/sslbutton.cpp" line="91"/>
<source>Subject Alternative Names:</source>
<translation>主題備用名稱:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="107"/>
+ <location filename="../src/gui/sslbutton.cpp" line="92"/>
<source>Organization (O):</source>
<translation>組織 (O):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="108"/>
+ <location filename="../src/gui/sslbutton.cpp" line="93"/>
<source>Organizational Unit (OU):</source>
<translation>組織部門 (OU):</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="109"/>
+ <location filename="../src/gui/sslbutton.cpp" line="94"/>
<source>State/Province:</source>
<translation>州或省:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="110"/>
+ <location filename="../src/gui/sslbutton.cpp" line="95"/>
<source>Country:</source>
<translation>國家:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="111"/>
+ <location filename="../src/gui/sslbutton.cpp" line="96"/>
<source>Serial:</source>
<translation>序號:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="114"/>
+ <location filename="../src/gui/sslbutton.cpp" line="99"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation>&lt;h3&gt;簽發者&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="117"/>
+ <location filename="../src/gui/sslbutton.cpp" line="102"/>
<source>Issuer:</source>
<translation>簽發者:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="118"/>
+ <location filename="../src/gui/sslbutton.cpp" line="103"/>
<source>Issued on:</source>
<translation>簽發於:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="119"/>
+ <location filename="../src/gui/sslbutton.cpp" line="104"/>
<source>Expires on:</source>
<translation>過期於:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="122"/>
+ <location filename="../src/gui/sslbutton.cpp" line="107"/>
<source>&lt;h3&gt;Fingerprints&lt;/h3&gt;</source>
<translation>&lt;h3&gt;指紋&lt;/h3&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="126"/>
+ <location filename="../src/gui/sslbutton.cpp" line="111"/>
<source>SHA-256:</source>
<translation>SHA-256:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="127"/>
+ <location filename="../src/gui/sslbutton.cpp" line="112"/>
<source>SHA-1:</source>
<translation>SHA-1:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="131"/>
+ <location filename="../src/gui/sslbutton.cpp" line="116"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;注意:&lt;/b&gt; 此憑證已被手動核准&lt;/p&gt;</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="151"/>
+ <location filename="../src/gui/sslbutton.cpp" line="136"/>
<source>%1 (self-signed)</source>
<translation>%1 (自我簽章)</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="153"/>
+ <location filename="../src/gui/sslbutton.cpp" line="138"/>
<source>%1</source>
<translation>%1</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="188"/>
+ <location filename="../src/gui/sslbutton.cpp" line="173"/>
<source>This connection is encrypted using %1 bit %2.
</source>
<translation>這個連線已經使用 %1 bit %2 加密。
</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="215"/>
+ <location filename="../src/gui/sslbutton.cpp" line="204"/>
<source>No support for SSL session tickets/identifiers</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="225"/>
+ <location filename="../src/gui/sslbutton.cpp" line="214"/>
<source>Certificate information:</source>
<translation>憑證資訊:</translation>
</message>
<message>
- <location filename="../src/gui/sslbutton.cpp" line="192"/>
+ <location filename="../src/gui/sslbutton.cpp" line="177"/>
<source>This connection is NOT secure as it is not encrypted.
</source>
<translation>這個連線沒有經過加密,是不安全的。
@@ -3131,305 +3352,270 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SyncEngine</name>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="118"/>
+ <location filename="../src/libsync/syncengine.cpp" line="120"/>
<source>Success.</source>
<translation>成功。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="125"/>
- <source>CSync failed to load the journal file. The journal file is corrupted.</source>
- <translation>CSync 讀取歷程檔案失敗,歷程檔案已經損毀。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="128"/>
- <source>&lt;p&gt;The %1 plugin for csync could not be loaded.&lt;br/&gt;Please verify the installation!&lt;/p&gt;</source>
- <translation>&lt;p&gt;用於csync的套件%1&lt;/p&gt;</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="131"/>
- <source>CSync fatal parameter error.</source>
- <translation>CSync 參數錯誤。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="134"/>
- <source>CSync processing step update failed.</source>
- <translation>CSync 處理步驟 &quot;update&quot; 失敗。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="137"/>
- <source>CSync processing step reconcile failed.</source>
- <translation>CSync 處理步驟 &quot;reconcile&quot; 失敗。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="140"/>
- <source>CSync could not authenticate at the proxy.</source>
- <translation>CSync 無法在代理伺服器認證。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="143"/>
- <source>CSync failed to lookup proxy or server.</source>
- <translation>CSync 查詢代理伺服器或伺服器失敗。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="146"/>
- <source>CSync failed to authenticate at the %1 server.</source>
- <translation>CSync 於伺服器 %1 認證失敗。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="149"/>
- <source>CSync failed to connect to the network.</source>
- <translation>CSync 無法連接到網路。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="152"/>
+ <location filename="../src/libsync/syncengine.cpp" line="130"/>
<source>A network connection timeout happened.</source>
<translation>網路連線逾時。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="155"/>
+ <location filename="../src/libsync/syncengine.cpp" line="133"/>
<source>A HTTP transmission error happened.</source>
<translation>HTTP 傳輸錯誤。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="179"/>
+ <location filename="../src/libsync/syncengine.cpp" line="157"/>
<source>The mounted folder is temporarily not available on the server</source>
<translation>掛載的資料夾暫時無法在伺服器上使用</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="185"/>
+ <location filename="../src/libsync/syncengine.cpp" line="163"/>
<source>An error occurred while opening a folder</source>
<translation>開啟資料夾時發生錯誤。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="188"/>
+ <location filename="../src/libsync/syncengine.cpp" line="166"/>
<source>Error while reading folder.</source>
<translation>讀取資料夾時發生錯誤。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="264"/>
+ <location filename="../src/libsync/syncengine.cpp" line="242"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="474"/>
+ <location filename="../src/libsync/syncengine.cpp" line="514"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="477"/>
+ <location filename="../src/libsync/syncengine.cpp" line="517"/>
<source>Folder hierarchy is too deep</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="493"/>
+ <location filename="../src/libsync/syncengine.cpp" line="533"/>
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="777"/>
+ <location filename="../src/libsync/syncengine.cpp" line="799"/>
<source>Only %1 are available, need at least %2 to start</source>
<comment>Placeholders are postfixed with file sizes using Utility::octetsToString()</comment>
<translation>目前僅有 %1 可以使用,至少需要 %2 才能開始</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="812"/>
+ <location filename="../src/libsync/syncengine.cpp" line="834"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1290"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1369"/>
<source>Not allowed because you don&apos;t have permission to add parent folder</source>
<translation>拒絕此操作,您沒有新增母資料夾的權限。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1297"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1376"/>
<source>Not allowed because you don&apos;t have permission to add files in that folder</source>
<translation>拒絕此操作,您沒有新增檔案在此資料夾的權限。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1600"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1701"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1607"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1708"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="167"/>
- <source>CSync: No space on %1 server available.</source>
- <translation>CSync:伺服器 %1 沒有可用空間。</translation>
- </message>
- <message>
- <location filename="../src/libsync/syncengine.cpp" line="170"/>
+ <location filename="../src/libsync/syncengine.cpp" line="148"/>
<source>CSync unspecified error.</source>
<translation>CSync 未知的錯誤。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="173"/>
+ <location filename="../src/libsync/syncengine.cpp" line="151"/>
<source>Aborted by the user</source>
<translation>使用者中斷</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="161"/>
- <source>CSync failed to access</source>
- <translation>CSync 存取失敗。</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="123"/>
+ <source>Failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="127"/>
+ <source>Discovery step failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="136"/>
+ <source>Permission denied.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="121"/>
- <source>CSync failed to load or create the journal file. Make sure you have read and write permissions in the local sync folder.</source>
- <translation>CSync 讀取或創建歷程檔案時失敗,請確定您在此本地資料夾有讀寫的權限。</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="139"/>
+ <source>File or directory not found:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="158"/>
- <source>CSync failed due to unhandled permission denied.</source>
- <translation>CSync 失敗,由於權限未處理被拒。</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="142"/>
+ <source>Tried to create a folder that already exists.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="164"/>
- <source>CSync tried to create a folder that already exists.</source>
- <translation>CSync 試圖建立一個已經存在的資料夾。</translation>
+ <location filename="../src/libsync/syncengine.cpp" line="145"/>
+ <source>No space on %1 server available.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="176"/>
+ <location filename="../src/libsync/syncengine.cpp" line="154"/>
<source>The service is temporarily unavailable</source>
<translation>這個服務暫時無法使用。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="182"/>
+ <location filename="../src/libsync/syncengine.cpp" line="160"/>
<source>Access is forbidden</source>
<translation>存取被拒</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="193"/>
+ <location filename="../src/libsync/syncengine.cpp" line="171"/>
<source>An internal error number %1 occurred.</source>
<translation>發生內部錯誤,錯誤代碼 %1。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="443"/>
+ <location filename="../src/libsync/syncengine.cpp" line="483"/>
<source>Symbolic links are not supported in syncing.</source>
<translation>同步不支援捷徑連結</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="446"/>
+ <location filename="../src/libsync/syncengine.cpp" line="486"/>
<source>File is listed on the ignore list.</source>
<translation>檔案被列在忽略清單。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="450"/>
+ <location filename="../src/libsync/syncengine.cpp" line="490"/>
<source>File names ending with a period are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="460"/>
+ <location filename="../src/libsync/syncengine.cpp" line="500"/>
<source>File names containing the character &apos;%1&apos; are not supported on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="463"/>
+ <location filename="../src/libsync/syncengine.cpp" line="503"/>
<source>The file name is a reserved name on this file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="468"/>
+ <location filename="../src/libsync/syncengine.cpp" line="508"/>
<source>Filename contains trailing spaces.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="471"/>
+ <location filename="../src/libsync/syncengine.cpp" line="511"/>
<source>Filename is too long.</source>
<translation>檔案名稱太長了。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="480"/>
+ <location filename="../src/libsync/syncengine.cpp" line="520"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="489"/>
+ <location filename="../src/libsync/syncengine.cpp" line="529"/>
<source>Unresolved conflict.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="500"/>
+ <location filename="../src/libsync/syncengine.cpp" line="537"/>
<source>Stat failed.</source>
<translation>狀態失敗。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="527"/>
+ <location filename="../src/libsync/syncengine.cpp" line="564"/>
<source>Filename encoding is not valid</source>
<translation>檔案名稱編碼是無效的</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="707"/>
+ <location filename="../src/libsync/syncengine.cpp" line="729"/>
<source>Invalid characters, please rename &quot;%1&quot;</source>
<translation>無效的字元,請您重新命名 &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="827"/>
+ <location filename="../src/libsync/syncengine.cpp" line="858"/>
+ <source>Using virtual files but suffix is not set</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/libsync/syncengine.cpp" line="870"/>
<source>Unable to read the blacklist from the local database</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="868"/>
+ <location filename="../src/libsync/syncengine.cpp" line="911"/>
<source>Unable to read from the sync journal.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="917"/>
+ <location filename="../src/libsync/syncengine.cpp" line="974"/>
<source>Cannot open the sync journal</source>
<translation>同步處理日誌無法開啟</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="980"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1040"/>
<source>File name contains at least one invalid character</source>
<translation>檔案名稱含有不合法的字元</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1216"/>
- <location filename="../src/libsync/syncengine.cpp" line="1256"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1295"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1335"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>已忽略。根據 &quot;選擇要同步的項目&quot;的黑名單</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1275"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1354"/>
<source>Not allowed because you don&apos;t have permission to add subfolders to that folder</source>
<translation>拒絕此操作,您沒有在此新增子資料夾的權限。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1322"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1401"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation>拒絕上傳此檔案,此檔案在伺服器是唯讀檔,復原中</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1338"/>
- <location filename="../src/libsync/syncengine.cpp" line="1357"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1417"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1436"/>
<source>Not allowed to remove, restoring</source>
<translation>不允許刪除,復原中</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1371"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1450"/>
<source>Local files and share folder removed.</source>
<translation>本地端檔案和共享資料夾已被刪除。</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1425"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1504"/>
<source>Move not allowed, item restored</source>
<translation>不允許移動,物件復原中</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>Move not allowed because %1 is read-only</source>
<translation>不允許移動,因為 %1 是唯讀的</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the destination</source>
<translation>目標</translation>
</message>
<message>
- <location filename="../src/libsync/syncengine.cpp" line="1436"/>
+ <location filename="../src/libsync/syncengine.cpp" line="1515"/>
<source>the source</source>
<translation>來源</translation>
</message>
@@ -3453,17 +3639,17 @@ It is not advisable to use it.</source>
<context>
<name>OCC::Theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="315"/>
- <source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;版本 %1. 如欲得知更多資訊,請到此拜訪 &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/libsync/theme.cpp" line="342"/>
+ <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="320"/>
+ <location filename="../src/libsync/theme.cpp" line="349"/>
<source>&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="321"/>
+ <location filename="../src/libsync/theme.cpp" line="350"/>
<source>&lt;p&gt;Distributed by %1 and licensed under the GNU General Public License (GPL) Version 2.0.&lt;br/&gt;%2 and the %2 logo are registered trademarks of %1 in the United States, other countries, or both.&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
@@ -3494,81 +3680,81 @@ It is not advisable to use it.</source>
<translation>請登入</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="292"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="313"/>
<source>Folder %1: %2</source>
<translation>資料夾 %1: %2</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="313"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="331"/>
<source>There are no sync folders configured.</source>
<translation>尚未設置同步資料夾。</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="322"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="340"/>
<source>Open in browser</source>
<translation>用瀏覽器開啟</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="371"/>
- <location filename="../src/gui/owncloudgui.cpp" line="628"/>
- <location filename="../src/gui/owncloudgui.cpp" line="722"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="389"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="698"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="795"/>
<source>Log in...</source>
<translation>登入...</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="375"/>
- <location filename="../src/gui/owncloudgui.cpp" line="620"/>
- <location filename="../src/gui/owncloudgui.cpp" line="724"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="393"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="690"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="797"/>
<source>Log out</source>
<translation>登出</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="444"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="488"/>
<source>Recent Changes</source>
<translation>最近的更動</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="766"/>
- <source>Checking for changes in &apos;%1&apos;</source>
- <translation>檢查 &apos;%1&apos; 的變動</translation>
- </message>
- <message>
- <location filename="../src/gui/owncloudgui.cpp" line="349"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="367"/>
<source>Managed Folders:</source>
<translation>管理的資料夾:</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="352"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="370"/>
<source>Open folder &apos;%1&apos;</source>
<translation>開啟 %1 資料夾</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="324"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="342"/>
<source>Open %1 in browser</source>
<translation>瀏覽器中開啟 %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="707"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="199"/>
+ <source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="778"/>
<source>Unknown status</source>
<translation>未知狀態</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="709"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="780"/>
<source>Settings...</source>
<translation>設定…</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="711"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="782"/>
<source>Details...</source>
<translation>細節…</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="717"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="788"/>
<source>Help</source>
<translation>說明</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="719"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="792"/>
<source>Quit %1</source>
<translation>離開 %1</translation>
</message>
@@ -3583,11 +3769,6 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="199"/>
- <source>The server on account %1 runs an old and unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<location filename="../src/gui/owncloudgui.cpp" line="238"/>
<source>Disconnected</source>
<translation>已經離線</translation>
@@ -3619,116 +3800,129 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
- <location filename="../src/gui/owncloudgui.cpp" line="304"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="326"/>
<source>Synchronization is paused</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="306"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="321"/>
+ <source>Unresolved conflicts</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="328"/>
<source>Error during synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="314"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="332"/>
<source>No sync folders configured</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="360"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="378"/>
<source>Unpause all folders</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="365"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="383"/>
<source>Pause all folders</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="599"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="669"/>
<source>Unpause all synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="601"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="671"/>
<source>Unpause synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="609"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="679"/>
<source>Pause all synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="611"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="681"/>
<source>Pause synchronization</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="618"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="688"/>
<source>Log out of all accounts</source>
<translation>登出所有的帳戶</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="626"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="696"/>
<source>Log in to all accounts...</source>
<translation>登入所有的帳戶</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="710"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="781"/>
<source>New account...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="728"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="790"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="1150"/>
+ <source>About %1</source>
+ <translation>關於 %1</translation>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="801"/>
<source>Crash now</source>
<comment>Only shows in debug mode to allow testing the crash handler</comment>
<translation>發生非預期結果</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="744"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="817"/>
<source>No items synced recently</source>
<translation>最近沒有項目被同步</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="781"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="839"/>
+ <source>Checking for changes in remote &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="842"/>
+ <source>Checking for changes in local &apos;%1&apos;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/owncloudgui.cpp" line="857"/>
<source>Syncing %1 of %2 (%3 left)</source>
<translation>同步中 %1 的 %2 (剩餘 %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="786"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="862"/>
<source>Syncing %1 of %2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="795"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="871"/>
<source>Syncing %1 (%2 left)</source>
<translation>同步中 %1 (剩餘 %2)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="798"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="874"/>
<source>Syncing %1</source>
<translation>同步 %1</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="816"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="892"/>
<source>%1 (%2, %3)</source>
<translation>%1 (%2, %3)</translation>
</message>
<message>
- <location filename="../src/gui/owncloudgui.cpp" line="302"/>
+ <location filename="../src/gui/owncloudgui.cpp" line="323"/>
<source>Up to date</source>
<translation>最新的</translation>
</message>
</context>
<context>
- <name>OCC::ownCloudTheme</name>
- <message>
- <location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
- <source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
- <translation type="unfinished"/>
- </message>
-</context>
-<context>
<name>OwncloudAdvancedSetupPage</name>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
@@ -3740,9 +3934,9 @@ It is not advisable to use it.</source>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="81"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="134"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="253"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="358"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="388"/>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="414"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="361"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="515"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="526"/>
<source>TextLabel</source>
<translation>文字標籤</translation>
</message>
@@ -3778,11 +3972,22 @@ It is not advisable to use it.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="351"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="354"/>
<source>Choose what to sync</source>
<translation>選擇要同步的項目</translation>
</message>
<message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="394"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="397"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this option is selected, the wizard will close without synchronizing anything. You can use the &amp;quot;Add Folder Sync Connection&amp;quot; button from the account settings to choose which pair of local and remote folder you wish to synchronize&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="400"/>
+ <source>Manually create folder sync connections </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="150"/>
<source>&amp;Local Folder</source>
<translation>本地資料夾 (&amp;L)</translation>
@@ -3799,11 +4004,16 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="243"/>
- <source>S&amp;ync everything from server</source>
- <translation>從伺服器同步任何東西 (&amp;Y)</translation>
+ <source>S&amp;ynchronize everything from server (recommended)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="395"/>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="430"/>
+ <source>Use virtual files instead of downloading content immediately (e&amp;xperimental)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="460"/>
<source>Status message</source>
<translation>狀態訊息</translation>
</message>
@@ -3840,7 +4050,7 @@ It is not advisable to use it.</source>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
- <source>An error occured while connecting. Please try again.</source>
+ <source>An error occurred while connecting. Please try again.</source>
<translation type="unfinished"/>
</message>
<message>
@@ -4020,7 +4230,7 @@ It is not advisable to use it.</source>
<context>
<name>ownCloudTheme::about()</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="299"/>
+ <location filename="../src/libsync/theme.cpp" line="321"/>
<source>&lt;p&gt;&lt;small&gt;Built from Git revision &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; on %3, %4 using Qt %5, %6&lt;/small&gt;&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;small&gt;根據Git版本號&lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt;在 %3建置, %4 使用了Qt %5,%6&lt;/small&gt;&lt;/p&gt;</translation>
</message>
@@ -4118,52 +4328,52 @@ It is not advisable to use it.</source>
<context>
<name>theme</name>
<message>
- <location filename="../src/libsync/theme.cpp" line="60"/>
+ <location filename="../src/libsync/theme.cpp" line="63"/>
<source>Status undefined</source>
<translation>未定義的狀態</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="63"/>
+ <location filename="../src/libsync/theme.cpp" line="66"/>
<source>Waiting to start sync</source>
<translation>等待開始同步</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="66"/>
+ <location filename="../src/libsync/theme.cpp" line="69"/>
<source>Sync is running</source>
<translation>同步中</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="69"/>
+ <location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success</source>
<translation>同步完成</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="72"/>
+ <location filename="../src/libsync/theme.cpp" line="75"/>
<source>Sync Success, some files were ignored.</source>
<translation>同步成功,部份檔案被忽略</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="75"/>
+ <location filename="../src/libsync/theme.cpp" line="78"/>
<source>Sync Error</source>
<translation>同步失敗</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="78"/>
+ <location filename="../src/libsync/theme.cpp" line="81"/>
<source>Setup Error</source>
<translation>安裝錯誤</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="81"/>
+ <location filename="../src/libsync/theme.cpp" line="84"/>
<source>Preparing to sync</source>
<translation>正在準備同步。</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="84"/>
+ <location filename="../src/libsync/theme.cpp" line="87"/>
<source>Aborting...</source>
<translation>中斷中…</translation>
</message>
<message>
- <location filename="../src/libsync/theme.cpp" line="87"/>
+ <location filename="../src/libsync/theme.cpp" line="90"/>
<source>Sync is paused</source>
<translation>同步已暫停</translation>
</message>
@@ -4171,22 +4381,22 @@ It is not advisable to use it.</source>
<context>
<name>utility</name>
<message>
- <location filename="../src/gui/guiutility.cpp" line="33"/>
+ <location filename="../src/gui/guiutility.cpp" line="34"/>
<source>Could not open browser</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="34"/>
+ <location filename="../src/gui/guiutility.cpp" line="35"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="55"/>
+ <location filename="../src/gui/guiutility.cpp" line="58"/>
<source>Could not open email client</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../src/gui/guiutility.cpp" line="56"/>
+ <location filename="../src/gui/guiutility.cpp" line="59"/>
<source>There was an error when launching the email client to create a new message. Maybe no default email client is configured?</source>
<translation type="unfinished"/>
</message>
diff --git a/version.h.in b/version.h.in
index e96ba1fe0..c29959a75 100644
--- a/version.h.in
+++ b/version.h.in
@@ -21,8 +21,8 @@
#cmakedefine GIT_SHA1 "@GIT_SHA1@"
-#define MIRALL_STRINGIFY(s) MIRALL_TOSTRING(s)
-#define MIRALL_TOSTRING(s) #s
+#define MIRALL_STRINGIFY(...) MIRALL_TOSTRING(__VA_ARGS__)
+#define MIRALL_TOSTRING(...) "" #__VA_ARGS__
/* MIRALL version */
#define MIRALL_VERSION_MAJOR @MIRALL_VERSION_MAJOR@